infopark_fiona7 0.30.0.2 → 0.70.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/fiona7.js +1 -282
  3. data/app/assets/javascripts/fiona7_ui.js +335 -0
  4. data/app/assets/stylesheets/fiona7.css.scss +4 -36
  5. data/app/assets/stylesheets/fiona7_ui.css.scss +39 -0
  6. data/app/controllers/fiona7/blobs_controller.rb +13 -23
  7. data/app/controllers/fiona7/release_controller.rb +1 -0
  8. data/app/controllers/fiona7/sessions_controller.rb +3 -5
  9. data/app/helpers/fiona7_override_helper.rb +6 -2
  10. data/app/models/fiona7/edited_obj.rb +6 -1
  11. data/app/models/fiona7/released_obj.rb +11 -3
  12. data/app/models/fiona7/write_obj.rb +18 -3
  13. data/app/models/fiona7_login_page.rb +3 -0
  14. data/app/views/scrivito/ui/index.html.erb +16 -0
  15. data/config/routes.rb +2 -0
  16. data/infopark_fiona7.gemspec +6 -4
  17. data/lib/fiona7/builder/batch_widget_writer.rb +7 -3
  18. data/lib/fiona7/builder/obj_builder.rb +130 -42
  19. data/lib/fiona7/builder/obj_class_builder.rb +3 -59
  20. data/lib/fiona7/builder/obj_class_updater.rb +7 -44
  21. data/lib/fiona7/builder/obj_updater.rb +25 -7
  22. data/lib/fiona7/builder/widget_builder.rb +24 -0
  23. data/lib/fiona7/builder/widget_building.rb +2 -7
  24. data/lib/fiona7/builder/widget_updater.rb +21 -0
  25. data/lib/fiona7/controllers/content_service/obj_controller.rb +16 -25
  26. data/lib/fiona7/controllers/rest_api/blob_controller.rb +41 -2
  27. data/lib/fiona7/controllers/rest_api/obj_controller.rb +19 -7
  28. data/lib/fiona7/controllers/rest_api/workspace_controller.rb +1 -1
  29. data/lib/fiona7/engine.rb +58 -7
  30. data/lib/fiona7/fiona_connector_patches/basic_obj.rb +46 -0
  31. data/lib/fiona7/initializer.rb +15 -11
  32. data/lib/fiona7/json/obj_decorator.rb +53 -31
  33. data/lib/fiona7/json/reverse_obj_decorator.rb +36 -0
  34. data/lib/fiona7/json/widget_decorator.rb +3 -1
  35. data/lib/fiona7/link_converter/fiona_to_scrivito.rb +45 -13
  36. data/lib/fiona7/link_converter/scrivito_to_fiona.rb +1 -1
  37. data/lib/fiona7/middleware/server_detection_middleware.rb +27 -0
  38. data/lib/fiona7/middleware/table_switching_middleware.rb +33 -0
  39. data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk.rb +5 -11
  40. data/lib/fiona7/mode_switch/composite.rb +2 -4
  41. data/lib/fiona7/naive_search_engine.rb +66 -16
  42. data/lib/fiona7/routers/rest_api.rb +50 -45
  43. data/lib/fiona7/routing_monkey_patch.rb +5 -3
  44. data/lib/fiona7/scrivito_patches/attribute_content.rb +9 -10
  45. data/lib/fiona7/scrivito_patches/attribute_serializer.rb +15 -0
  46. data/lib/fiona7/scrivito_patches/basic_obj.rb +25 -19
  47. data/lib/fiona7/scrivito_patches/basic_widget.rb +4 -0
  48. data/lib/fiona7/scrivito_patches/binary.rb +452 -33
  49. data/lib/fiona7/scrivito_patches/client_config.rb +0 -19
  50. data/lib/fiona7/scrivito_patches/cms_backend.rb +48 -0
  51. data/lib/fiona7/scrivito_patches/cms_field_tag.rb +19 -0
  52. data/lib/fiona7/scrivito_patches/cms_rest_api.rb +20 -3
  53. data/lib/fiona7/scrivito_patches/cms_routing.rb +20 -34
  54. data/lib/fiona7/scrivito_patches/controller_actions.rb +0 -8
  55. data/lib/fiona7/scrivito_patches/migrator.rb +4 -0
  56. data/lib/fiona7/scrivito_patches/objs_controller.rb +18 -0
  57. data/lib/fiona7/scrivito_patches/type_computer.rb +12 -12
  58. data/lib/fiona7/scrivito_patches/webservice_controller.rb +21 -0
  59. data/lib/fiona7/scrivito_patches/workspace.rb +8 -5
  60. data/lib/fiona7/shadow_classes.rb +74 -0
  61. data/lib/fiona7/table_switcher.rb +39 -0
  62. data/lib/fiona7/type_loader.rb +63 -0
  63. data/lib/fiona7/type_register.rb +170 -89
  64. data/lib/fiona7/type_synchronizer.rb +68 -0
  65. data/lib/fiona7/version.rb +1 -1
  66. data/lib/fiona7/version_helper.rb +35 -54
  67. data/lib/fiona7/widget_resolver.rb +1 -1
  68. data/lib/tasks/fiona7_tasks.rake +0 -8
  69. metadata +57 -18
  70. data/lib/fiona7/controllers/rest_api/obj_class_controller.rb +0 -39
  71. data/lib/fiona7/json/obj_class_decorator.rb +0 -45
  72. data/lib/fiona7/mode_switch/constants.rb +0 -86
  73. data/lib/fiona7/type_register_mixin.rb +0 -9
@@ -1,25 +1,17 @@
1
- require 'fiona7/type_register_mixin'
2
1
 
3
2
  module Fiona7
4
3
  module Builder
5
4
  class ObjClassBuilder
6
- include TypeRegisterMixin
7
5
 
8
6
  def initialize(values)
9
7
  @values = values
10
- @attrs_avail= @values.key?(:attributes)
11
8
  @attributes = @values.delete(:attributes) {|_| [] }
12
9
  end
13
10
 
14
11
  def build
15
12
  assert_valid
16
- add_legacy_attributes
17
- mode_dependant_attributes
18
- namespace_attributes
19
13
  persist_attributes
20
14
  persist_obj_class
21
- update_obj_class
22
- load_cm_obj_class
23
15
  end
24
16
 
25
17
  def validate
@@ -37,47 +29,10 @@ module Fiona7
37
29
  ret
38
30
  end
39
31
 
40
- def add_legacy_attributes
41
- type = @values[:type].to_s
42
- if type == 'generic' || type == 'image'
43
- @attributes << {name: 'blob', type: :binary}
44
- @attrs_avail = true
45
- end
46
- if type.present?
47
- # legacy obj class
48
- @attributes << {name: 'body', type: :html}
49
- @attributes << {name: 'title', type: :html}
50
- @attrs_avail = true
51
- end
52
- end
53
-
54
- def mode_dependant_attributes
55
- if Fiona7.mode == :standalone
56
- # nop
57
- elsif Fiona7.mode == :legacy
58
- # in legacy mode body and title are always included
59
- # and are mapped to built-in attributes, hence no
60
- # need for custom attributes
61
- @attributes.delete_if {|a| n = a[:name].to_s ; n == 'body' || n == 'title' }
62
- else
63
- raise "Invalid Fiona7.mode = #{Fiona7.mode}"
64
- end
65
-
66
- end
67
-
68
- def namespace_attributes
69
- @attributes.each do |attribute|
70
- # s_OBJ_CLASS__ATTRIBUTE_NAME
71
- virtual_name = attribute[:name]
72
- attribute[:name] = type_register.real_attribute_name(@values[:name], virtual_name)
73
- attribute[:real_type] = type_register.map_virtual_to_real_type(attribute[:type])
74
- end
75
- end
76
-
77
32
  def persist_attributes
78
33
  @attributes.each do |attribute|
79
- if !RailsConnector::Attribute.exists?(attribute_name: attribute[:name])
80
- raw_attribute = Reactor::Cm::Attribute.create(attribute[:name].to_s, attribute[:real_type].to_s)
34
+ if !RailsConnector::Attribute.exists?(attribute_name: attribute[:real_name])
35
+ raw_attribute = Reactor::Cm::Attribute.create(attribute[:real_name].to_s, attribute[:real_type].to_s)
81
36
  raw_attribute.set(:helpText, ::ActiveSupport::JSON.encode({type: attribute[:type]}))
82
37
  raw_attribute.set(:values, attribute[:values]) if attribute[:values]
83
38
  raw_attribute.save!
@@ -86,25 +41,14 @@ module Fiona7
86
41
  end
87
42
 
88
43
  def persist_obj_class
89
- # WARNING: in the never version no "type" is standard
90
44
  @values[:type] ||= 'publication'
91
45
  @raw_obj_class = Reactor::Cm::ObjClass.create(@values[:name].to_s, @values[:type].to_s)
92
- user_attributes = @attributes.map {|a| a[:name] } if @attrs_avail
46
+ user_attributes = @attributes.map {|a| a[:real_name] }
93
47
  user_attributes ||= []
94
48
  built_in_attributes = ['X_widget_pool']
95
49
  @raw_obj_class.attributes = user_attributes + built_in_attributes
96
50
  end
97
51
 
98
- def update_obj_class
99
- if @values.key?(:is_active)
100
- @raw_obj_class.set('isEnabled', @values[:is_active] ? '1' : '0')
101
- @raw_obj_class.save!
102
- end
103
- end
104
-
105
- def load_cm_obj_class
106
- RailsConnector::ObjClass.find_by_obj_class_name(@values[:name])
107
- end
108
52
  end
109
53
  end
110
54
  end
@@ -6,18 +6,6 @@ module Fiona7
6
6
  def validate
7
7
  existing_obj_class
8
8
  end
9
-
10
- def build
11
- assert_valid
12
- mode_dependant_attributes
13
- namespace_attributes
14
- persist_attributes
15
- persist_obj_class
16
- update_obj_class
17
- gc_attributes
18
- load_cm_obj_class
19
- end
20
-
21
9
  protected
22
10
  def existing_obj_class
23
11
  ret = RailsConnector::ObjClass.exists?(obj_class_name: @values[:name])
@@ -27,43 +15,18 @@ module Fiona7
27
15
 
28
16
  def persist_obj_class
29
17
  @raw_obj_class = Reactor::Cm::ObjClass.get(@values[:name].to_s)
18
+ user_attributes = @attributes.map {|a| a[:real_name] }
19
+ user_attributes ||= []
30
20
 
31
- # DRY: ObjClassBuilder
32
- if @attrs_avail
33
- user_attributes = @attributes.map {|a| a[:name] }
34
- user_attributes ||= []
35
- else
36
- user_attributes = @raw_obj_class.attributes
37
- end
38
-
21
+ existing_attributes = @raw_obj_class.attributes
39
22
  built_in_attributes = ['X_widget_pool']
40
- @raw_obj_class.attributes = user_attributes + built_in_attributes
41
- end
42
23
 
43
- def persist_attributes
44
- @attributes.each do |attribute|
45
- # TODO: changing attribute types
46
- if !RailsConnector::Attribute.exists?(attribute_name: attribute[:name])
47
- raw_attribute = Reactor::Cm::Attribute.create(attribute[:name].to_s, attribute[:real_type].to_s)
48
- raw_attribute.set(:helpText, ::ActiveSupport::JSON.encode({type: attribute[:type]}))
49
- raw_attribute.set(:values, attribute[:values]) if attribute[:values]
50
- raw_attribute.save!
51
- end
52
- end
53
- end
54
-
55
- def gc_attributes
56
- return if Fiona7.mode == :legacy
57
- return unless @attrs_avail
58
- pattern = "s_#{@values[:name]}__%"
24
+ # NOTE: removing attributes is now impossible
25
+ new_attributes = (existing_attributes + built_in_attributes + user_attributes).map(&:to_s).uniq
59
26
 
60
- fresh = @attributes.map {|a| a[:name].to_s }
61
- stale = RailsConnector::Attribute.where('attribute_name LIKE ?', pattern).select(:attribute_name).map(&:name)
62
-
63
- (stale - fresh).each do |attribute_name|
64
- Reactor::Cm::Attribute.instance(attribute_name.to_s).delete!
65
- end
27
+ @raw_obj_class.attributes = new_attributes
66
28
  end
29
+
67
30
  end
68
31
  end
69
32
  end
@@ -5,21 +5,39 @@ module Fiona7
5
5
  module Builder
6
6
  class ObjUpdater < ObjBuilder
7
7
  protected
8
+ def update?
9
+ true
10
+ end
11
+
8
12
  def validate
13
+ return true
14
+ end
15
+
16
+ def prepare_object
17
+ obj_id = @values.delete(:_id)
18
+ @obj = WriteObj.find(obj_id)
19
+ @path = @values.delete(:_path)
20
+ @widget_pool = @values.delete(:_widget_pool)
21
+ @permalink = @values.delete(:_permalink)
22
+
9
23
  # revert command sends this info. which is silly.
10
24
  @values.delete(:_last_changed)
11
25
 
12
- return true
13
- end
26
+ @name, parent_path = name_and_parent_path_from_path(@path) if (@path)
27
+ if obj_class = @values.delete(:_obj_class)
28
+ @obj_class = obj_class
29
+ @real_obj_class = TypeRegister::NameAliaser.new(virtual: @obj_class).real_obj_class
30
+ else
31
+ @real_obj_class = @obj.obj_class
32
+ @obj_class = TypeRegister::NameAliaser.new(real: @real_obj_class).virtual_obj_class
33
+ end
34
+
35
+ ensure_obj_class_exists
14
36
 
15
- def create_object
16
- @obj_id = @values.delete(:_id)
17
- @obj = WriteObj.find(@obj_id)
18
37
  @obj.name = @name unless @name.blank?
19
- @name = @obj.name
20
- @obj_class ||= @obj.obj_class
21
38
  # TODO: move (parent change)
22
39
  end
40
+
23
41
  end
24
42
  end
25
43
  end
@@ -8,6 +8,30 @@ module Fiona7
8
8
  def initialize(owner_obj, widget_id, values, path_map)
9
9
  @owner_obj, @widget_id, @values, @widget_path_map = owner_obj, widget_id, values.symbolize_keys, path_map
10
10
  end
11
+
12
+ protected
13
+ def update?
14
+ false
15
+ end
16
+
17
+ def prepare_object
18
+ @path = self.generate_widget_path
19
+ @obj_class = @values.delete(:_obj_class)
20
+ @real_obj_class = TypeRegister::NameAliaser.new(virtual: @obj_class).real_obj_class
21
+
22
+ @path = "/#{@path}" unless @path.start_with?('/')
23
+ @name, parent_path = name_and_parent_path_from_path(@path)
24
+ @parent = ensure_parent_exists(parent_path) if parent_path
25
+
26
+ ensure_obj_class_exists
27
+
28
+ # bottom one is faster, but can only work when there are no uploads
29
+ if (@values.any? {|_, (_, v)| v.kind_of?(File) || v.kind_of?(ActionDispatch::Http::UploadedFile) } )
30
+ @obj = WriteObj.create!(name: @name, parent_obj_id: @parent.id, obj_class: @real_obj_class)
31
+ else
32
+ @obj = WriteObj.new(name: @name, parent_obj_id: @parent.id, obj_class: @real_obj_class)
33
+ end
34
+ end
11
35
  end
12
36
  end
13
37
  end
@@ -10,8 +10,7 @@ module Fiona7
10
10
  end
11
11
 
12
12
  protected
13
-
14
- def prepare_object
13
+ def generate_widget_path
15
14
  raise Scrivito::ScrivitoError, "Inconsistent internal state: unable to create widgets for nonexiting parent." if @owner_obj.path.nil?
16
15
  # only publication type can contain children (code = "5")
17
16
  # also handle / this way
@@ -20,11 +19,7 @@ module Fiona7
20
19
  else
21
20
  parent_path = "#{@owner_obj.path}/_widgets"
22
21
  end
23
- @path = "#{parent_path}/#{@widget_id}"
24
- @name = @widget_id.to_s
25
- @parent = ensure_parent_exists(parent_path)
26
- raise Scrivito::ScrivitoError, "Error storing widget, container #{parent_path.inspect} not found." if @parent.nil?
27
- @obj_class = @values.delete(:_obj_class)
22
+ "#{parent_path}/#{@widget_id}"
28
23
  end
29
24
 
30
25
  def write_widget_pool
@@ -8,6 +8,27 @@ module Fiona7
8
8
  def initialize(owner_obj, widget_id, values, path_map)
9
9
  @owner_obj, @widget_id, @values, @widget_path_map = owner_obj, widget_id, values.symbolize_keys, path_map
10
10
  end
11
+
12
+ protected
13
+ def update?
14
+ true
15
+ end
16
+
17
+ def prepare_object
18
+ @path = self.generate_widget_path
19
+ @obj = WriteObj.find(@values.delete(:_id))
20
+ @name = @widget_id
21
+
22
+ if obj_class = @values.delete(:_obj_class)
23
+ @obj_class = obj_class
24
+ @real_obj_class = TypeRegister::NameAliaser.new(virtual: @obj_class).real_obj_class
25
+ else
26
+ @real_obj_class = @obj.obj_class
27
+ @obj_class = TypeRegister::NameAliaser.new(real: @real_obj_class).virtual_obj_class
28
+ end
29
+
30
+ ensure_obj_class_exists
31
+ end
11
32
  end
12
33
  end
13
34
  end
@@ -43,33 +43,17 @@ module Fiona7
43
43
  if workspace_id && !SCRIVITO_DIFF_MODE_BROKEN
44
44
  workspace_id == 'published' ? ReleasedObj : EditedObj
45
45
  elsif revision_id
46
- # no workspace_id given, we need to go by revision_id
47
- rtc_workspace = Workspace.rtc
48
- published_workspace = Workspace.published
49
-
50
- # in most cases a query without workspace_id is caused
51
- # by modification calculation, which compares the object
52
- # with it's base revision (i.e. revision of published)
53
- if revision_id[0] == 'f' && published_workspace.revision_id == revision_id
46
+ # iwe know that published revisions start with a 'f'
47
+ # and rtc revisions start with a 'b'
48
+ if revision_id[0] == 'f'
54
49
  ReleasedObj
55
- elsif revision_id[0] == 'b' && rtc_workspace.revision_id == revision_id
50
+ elsif revision_id[0] == 'b'
56
51
  EditedObj
57
52
  else
58
- # we don't know this revision (anymore), it may be that
59
- # the content has been changed between requests (concurrent
60
- # modification may cause race conditions),
61
- # but we know that published revisions start with a 'f'
62
- # and rtc revisions start with a 'b'
63
- if revision_id[0] == 'f'
64
- ReleasedObj
65
- elsif revision_id[0] == 'b'
66
- EditedObj
67
- else
68
- Assert.input(
69
- false,
70
- "Invalid revision_id received: #{revision_id}"
71
- )
72
- end
53
+ Assert.input(
54
+ false,
55
+ "Invalid revision_id received: #{revision_id}"
56
+ )
73
57
  end
74
58
  else
75
59
  Assert.input(
@@ -96,22 +80,29 @@ module Fiona7
96
80
  )
97
81
  end
98
82
 
99
- refs = {"refs" => objs.map {|o| {"id" => o.id} } }
83
+ refs = {"refs" => objs.map {|o| {"id" => o.id.to_s} } }
100
84
  objs = objs.map {|o| JSON::ObjDecorator.new(@klass, o) }
101
85
 
102
86
  return objs, refs
103
87
  end
104
88
 
105
89
  def find_by_id(id)
90
+ if id.kind_of?(Array)
91
+ id = id.map(&:to_i)
92
+ else
93
+ id = id.to_i
94
+ end
106
95
  @klass.where(obj_id: id).limit(1).to_a
107
96
  end
108
97
 
109
98
  def find_by_path(path)
99
+ return [] if path =~ /^\/_orphaned/
110
100
  path = path.gsub('.', '_')
111
101
  @klass.where(path: path).limit(1).to_a
112
102
  end
113
103
 
114
104
  def find_by_parent_path(path)
105
+ return [] if path =~ /^\/_orphaned/
115
106
  parent = @klass.find_by_path(path)
116
107
  parent ? parent.children : []
117
108
  end
@@ -2,8 +2,47 @@ module Fiona7
2
2
  module Controllers
3
3
  module RestAPI
4
4
  class BlobController
5
- def fetch(blob_id)
6
- raise ::Scrivito::ClientError.new("This API is not supported by Fiona7 and should not be called, try using Scrivito::Binary#content or scrivito_url(obj) when appropriate", 412)
5
+ def fetch(blob_id, transformation=false)
6
+ public_get_url = BinaryHandling::UrlGenerator.new(blob_id, 'public_access', 'get', transformation).generate
7
+ # all URLs are identic!
8
+ # private_get_url = BinaryHandling::UrlGenerator.new(blob_id, 'private_access', 'get', false).generate
9
+ # public_head_url = BinaryHandling::UrlGenerator.new(blob_id, 'public_access', 'head', false).generate
10
+ # private_head_url = BinaryHandling::UrlGenerator.new(blob_id, 'private_access', 'head', false).generate
11
+ private_head_url = public_head_url = private_get_url = public_get_url
12
+
13
+ return {
14
+ 'public_access' => {
15
+ 'get' => {
16
+ 'url' => public_get_url
17
+ },
18
+ 'head' => {
19
+ 'url' => public_head_url
20
+ }
21
+ },
22
+ 'private_access' => {
23
+ 'get' => {
24
+ 'url' => private_get_url
25
+ },
26
+ 'head' => {
27
+ 'url' => private_head_url
28
+ }
29
+ }
30
+ }
31
+ end
32
+ def metadata(blob_id)
33
+ meta_binary = BinaryHandling::MetaBinary.new(blob_id)
34
+ content_type = meta_binary.mime_type
35
+ content_length = meta_binary.length
36
+ width = meta_binary.width
37
+ height = meta_binary.height
38
+ {
39
+ 'meta_data' => {
40
+ 'content_type' => ['string', content_type],
41
+ 'content_length' => ['number', content_length],
42
+ 'width' => ['number', width],
43
+ 'height' => ['number', height]
44
+ }
45
+ }
7
46
  end
8
47
  end
9
48
  end
@@ -9,6 +9,7 @@ require 'fiona7/naive_search_engine'
9
9
 
10
10
  require 'fiona7/assert'
11
11
 
12
+ require 'fiona7/json/reverse_obj_decorator'
12
13
  require 'fiona7/json/typeless_obj_decorator'
13
14
 
14
15
  module Fiona7
@@ -18,6 +19,9 @@ module Fiona7
18
19
  def create(workspace_id, values)
19
20
  assert_writable(workspace_id)
20
21
 
22
+ # some stupid creators give us an id. fck them
23
+ values[:obj].delete("_id")
24
+ values[:obj].delete(:_id)
21
25
  # This is a hack to make it seem as if the root obj does not exist
22
26
  if values[:obj][:_path] != '/' && values[:obj]["_path"] != '/'
23
27
  obj = Builder::ObjBuilder.new(values[:obj].dup).build
@@ -26,7 +30,7 @@ module Fiona7
26
30
  end
27
31
 
28
32
  klass = EditedObj
29
- decorated = Fiona7::JSON::TypelessObjDecorator.new(klass, obj)
33
+ decorated = Fiona7::JSON::ReverseObjDecorator.new(klass, obj)
30
34
 
31
35
  return ::JSON.parse(::ActiveSupport::JSON.encode(decorated))
32
36
  end
@@ -43,7 +47,7 @@ module Fiona7
43
47
  404
44
48
  )
45
49
 
46
- decorated = Fiona7::JSON::TypelessObjDecorator.new(klass, obj)
50
+ decorated = Fiona7::JSON::ReverseObjDecorator.new(klass, obj)
47
51
  return ::JSON.parse(::ActiveSupport::JSON.encode(decorated))
48
52
  end
49
53
 
@@ -57,8 +61,9 @@ module Fiona7
57
61
  404
58
62
  )
59
63
 
60
- decorated = Fiona7::JSON::TypelessObjDecorator.new(klass, obj)
61
- return ::JSON.parse(::ActiveSupport::JSON.encode(decorated))
64
+ decorated = Fiona7::JSON::ReverseObjDecorator.new(klass, obj)
65
+ response = ::JSON.parse(::ActiveSupport::JSON.encode(decorated))
66
+ return response
62
67
  end
63
68
 
64
69
  def fetch_by_id_from_revision(revision_id, obj_id)
@@ -73,16 +78,23 @@ module Fiona7
73
78
  404
74
79
  )
75
80
 
76
- decorated = Fiona7::JSON::TypelessObjDecorator.new(klass, obj)
81
+ decorated = Fiona7::JSON::ReverseObjDecorator.new(klass, obj)
77
82
  return ::JSON.parse(::ActiveSupport::JSON.encode(decorated))
78
83
  end
79
84
 
80
85
  def search(workspace_id, params)
81
86
  klass = matching_class(workspace_id)
82
87
 
88
+ if params[:query].blank?
89
+ return ::JSON.parse(::ActiveSupport::JSON.encode({
90
+ total: 0,
91
+ results: []
92
+ }))
93
+ end
94
+
83
95
  offset = params[:offset] || 0
84
96
  size = params[:size] || 100
85
- query = params[:query] || []
97
+ query = (params[:query] || []).dup
86
98
  order = (params[:sort_order] || :asc).to_sym
87
99
  sort = (params[:sort_by] || :id).to_sym
88
100
 
@@ -101,7 +113,7 @@ module Fiona7
101
113
 
102
114
  obj = Builder::ObjUpdater.new(values[:obj].dup.with_indifferent_access).build
103
115
  klass = EditedObj
104
- decorated = Fiona7::JSON::TypelessObjDecorator.new(klass, obj)
116
+ decorated = Fiona7::JSON::ReverseObjDecorator.new(klass, obj)
105
117
  return ::JSON.parse(::ActiveSupport::JSON.encode(decorated))
106
118
  end
107
119