infopark_fiona7 0.71.1.12 → 1.1.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/fiona7_ui.js +67 -0
  3. data/app/assets/stylesheets/fiona7_ui.css.scss +29 -0
  4. data/app/controllers/fiona7/release_controller.rb +37 -75
  5. data/app/controllers/scrivito/cms_dispatch_controller.rb +2 -12
  6. data/app/controllers/scrivito/objs_controller.rb +41 -13
  7. data/app/controllers/scrivito/webservice_controller.rb +4 -3
  8. data/app/views/fiona7/release/preview.html.erb +73 -0
  9. data/config/routes.rb +3 -1
  10. data/infopark_fiona7.gemspec +1 -1
  11. data/lib/fiona7/assert.rb +4 -0
  12. data/lib/fiona7/attribute_name_mangler.rb +19 -0
  13. data/lib/fiona7/attribute_names_from_cms.rb +17 -0
  14. data/lib/fiona7/attribute_names_from_queries.rb +17 -0
  15. data/lib/fiona7/builder/obj_builder.rb +3 -2
  16. data/lib/fiona7/builder/obj_updater.rb +2 -2
  17. data/lib/fiona7/builder/widget_builder.rb +1 -1
  18. data/lib/fiona7/builder/widget_updater.rb +2 -2
  19. data/lib/fiona7/complex_object.rb +24 -0
  20. data/lib/fiona7/controllers/rest_api/obj_controller.rb +96 -24
  21. data/lib/fiona7/controllers/rest_api/workspace_controller.rb +23 -2
  22. data/lib/fiona7/engine.rb +11 -23
  23. data/lib/fiona7/facet_builder.rb +136 -0
  24. data/lib/fiona7/json/reverse_obj_decorator.rb +2 -0
  25. data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk.rb +68 -10
  26. data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk_slave.rb +66 -14
  27. data/lib/fiona7/mode_switch/views.rb +2 -2
  28. data/lib/fiona7/naive_search_engine.rb +40 -5
  29. data/lib/fiona7/obj_class_name_demangler.rb +11 -0
  30. data/lib/fiona7/obj_class_name_mangler.rb +11 -0
  31. data/lib/fiona7/obj_classes_from_cms.rb +14 -0
  32. data/lib/fiona7/obj_classes_from_queries.rb +11 -0
  33. data/lib/fiona7/recursive_object_finder.rb +149 -0
  34. data/lib/fiona7/routers/rest_api.rb +14 -1
  35. data/lib/fiona7/routing_monkey_patch.rb +5 -2
  36. data/lib/fiona7/scrivito_patches/attribute_serializer.rb +1 -1
  37. data/lib/fiona7/scrivito_patches/basic_obj.rb +4 -9
  38. data/lib/fiona7/scrivito_patches/basic_widget.rb +0 -9
  39. data/lib/fiona7/scrivito_patches/cms_backend.rb +11 -16
  40. data/lib/fiona7/scrivito_patches/cms_rest_api.rb +1 -1
  41. data/lib/fiona7/scrivito_patches/cms_routing.rb +50 -33
  42. data/lib/fiona7/scrivito_patches/link_parser.rb +6 -13
  43. data/lib/fiona7/scrivito_patches/log_subscriber.rb +18 -0
  44. data/lib/fiona7/scrivito_patches/preset_routes.rb +47 -0
  45. data/lib/fiona7/scrivito_patches/routing_extensions.rb +48 -0
  46. data/lib/fiona7/search_engine.rb +4 -0
  47. data/lib/fiona7/type_loader.rb +5 -4
  48. data/lib/fiona7/type_register.rb +13 -27
  49. data/lib/fiona7/type_synchronizer.rb +8 -6
  50. data/lib/fiona7/verity_search_engine.rb +77 -30
  51. data/lib/fiona7/version.rb +1 -1
  52. metadata +18 -13
  53. data/app/models/rails_connector/abstract_obj.rb +0 -24
  54. data/lib/fiona7/controllers/content_service/obj_controller.rb +0 -121
  55. data/lib/fiona7/controllers/content_service/workspace_controller.rb +0 -19
  56. data/lib/fiona7/recursive_link_resolver.rb +0 -93
  57. data/lib/fiona7/routers/content_service.rb +0 -19
  58. data/lib/fiona7/scrivito_patches/client_config.rb +0 -0
  59. data/lib/fiona7/scrivito_patches/controller_actions.rb +0 -6
  60. data/lib/fiona7/scrivito_patches/obj_class.rb +0 -16
  61. data/lib/fiona7/scrivito_patches/obj_data_from_rest.rb +0 -30
data/config/routes.rb CHANGED
@@ -7,5 +7,7 @@ Rails.application.routes.draw do
7
7
 
8
8
  delete '/_f/logout', to: 'fiona7/sessions#destroy', as: :fiona7_logout
9
9
 
10
- put '/__scrivito/objs/:id/release(.:format)', to: 'fiona7/release#release', as: :fiona7_release
10
+ put '/__scrivito/objs/release(.:format)', to: 'fiona7/release#release', as: :fiona7_release
11
+
12
+ get '/__scrivito/objs/:id/release/preview(.:format)', to: 'fiona7/release#preview', as: :fiona7_release_preview
11
13
  end
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.files = Dir["{app,config,db,lib}/**/*", "Rakefile", "README.md", "infopark_fiona7.gemspec"]
18
18
 
19
19
  s.add_dependency "rails", "~> 4.2.2"
20
- s.add_dependency "scrivito", "= 0.71"
20
+ s.add_dependency "scrivito", "= 1.1.0"
21
21
  s.add_dependency "scrivito_sdk"
22
22
  s.add_dependency "scrivito_editors"
23
23
  s.add_dependency "infopark_fiona_connector", "= 7.0.1.beta2"
data/lib/fiona7/assert.rb CHANGED
@@ -12,6 +12,10 @@ module Fiona7
12
12
  def success(condition, message)
13
13
  raise Scrivito::ScrivitoError, message unless condition
14
14
  end
15
+
16
+ def exists(condition, message)
17
+ raise Scrivito::ResourceNotFound, message unless condition
18
+ end
15
19
  end
16
20
  end
17
21
  end
@@ -0,0 +1,19 @@
1
+ require "fiona7/obj_class_name_mangler"
2
+
3
+ module Fiona7
4
+ class AttributeNameMangler
5
+ def initialize(attribute, obj_class)
6
+ @attribute = attribute
7
+ @obj_class = obj_class
8
+ end
9
+
10
+ def mangle
11
+ if Fiona7.mode == :standalone
12
+ mangled_obj_class = Fiona7::ObjClassNameMangler.new(@obj_class).mangle
13
+ "s_#{mangled_obj_class}__#{@attribute}"
14
+ else
15
+ @attribute
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ require "fiona7/type_register"
2
+ require "fiona7/obj_classes_from_cms"
3
+ require "fiona7/attribute_name_mangler"
4
+
5
+ module Fiona7
6
+ class AttributeNamesFromCms
7
+ def initialize(attribute, type_register=Fiona7::TypeRegister.instance)
8
+ @attribute = attribute
9
+ @type_register = type_register
10
+ end
11
+
12
+ def attributes
13
+ obj_classes = Fiona7::ObjClassesFromCms.new(@type_register).obj_classes
14
+ obj_classes.map {|obj_class| Fiona7::AttributeNameMangler.new(@attribute, obj_class).mangle }.uniq
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require "fiona7/obj_classes_from_queries"
2
+ require "fiona7/attribute_name_mangler"
3
+
4
+ module Fiona7
5
+ class AttributeNamesFromQueries
6
+ def initialize(attribute, queries)
7
+ @attribute = attribute
8
+ @queries = queries
9
+ end
10
+
11
+ def attributes
12
+ obj_classes = Fiona7::ObjClassesFromQueries.new(@queries).obj_classes
13
+ obj_classes.map {|obj_class| AttributeNameMangler.new(@attribute, obj_class).mangle }.uniq.presence if obj_classes
14
+ end
15
+
16
+ end
17
+ end
@@ -6,7 +6,8 @@ module Fiona7
6
6
  end
7
7
 
8
8
  require 'fiona7/type_register'
9
- require 'fiona7/recursive_link_resolver'
9
+ require 'fiona7/obj_class_name_mangler'
10
+ require 'fiona7/obj_class_name_demangler'
10
11
  #require 'fiona7/write_obj'
11
12
  #require 'fiona7/released_obj'
12
13
  require 'fiona7/builder/batch_widget_writer'
@@ -53,7 +54,7 @@ module Fiona7
53
54
  def prepare_object
54
55
  @path = @values.delete(:_path) || generate_orphaned_path
55
56
  @obj_class = @values.delete(:_obj_class)
56
- @real_obj_class = TypeRegister::NameAliaser.new(virtual: @obj_class).real_obj_class
57
+ @real_obj_class = Fiona7::ObjClassNameMangler.new(@obj_class).mangle
57
58
  @widget_pool = @values.delete(:_widget_pool)
58
59
  @permalink = @values.delete(:_permalink)
59
60
 
@@ -26,10 +26,10 @@ module Fiona7
26
26
  @name, parent_path = name_and_parent_path_from_path(@path) if (@path)
27
27
  if obj_class = @values.delete(:_obj_class)
28
28
  @obj_class = obj_class
29
- @real_obj_class = TypeRegister::NameAliaser.new(virtual: @obj_class).real_obj_class
29
+ @real_obj_class = Fiona7::ObjClassNameMangler.new(@obj_class).mangle
30
30
  else
31
31
  @real_obj_class = @obj.obj_class
32
- @obj_class = TypeRegister::NameAliaser.new(real: @real_obj_class).virtual_obj_class
32
+ @obj_class = Fiona7::ObjClassNameDemangler.new(@real_obj_class).demangle
33
33
  end
34
34
 
35
35
  ensure_obj_class_exists
@@ -17,7 +17,7 @@ module Fiona7
17
17
  def prepare_object
18
18
  @path = self.generate_widget_path
19
19
  @obj_class = @values.delete(:_obj_class)
20
- @real_obj_class = TypeRegister::NameAliaser.new(virtual: @obj_class).real_obj_class
20
+ @real_obj_class = Fiona7::ObjClassNameMangler.new(@obj_class).mangle
21
21
 
22
22
  @path = "/#{@path}" unless @path.start_with?('/')
23
23
  @name, parent_path = name_and_parent_path_from_path(@path)
@@ -21,10 +21,10 @@ module Fiona7
21
21
 
22
22
  if obj_class = @values.delete(:_obj_class)
23
23
  @obj_class = obj_class
24
- @real_obj_class = TypeRegister::NameAliaser.new(virtual: @obj_class).real_obj_class
24
+ @real_obj_class = Fiona7::ObjClassNameMangler.new(@obj_class).mangle
25
25
  else
26
26
  @real_obj_class = @obj.obj_class
27
- @obj_class = TypeRegister::NameAliaser.new(real: @real_obj_class).virtual_obj_class
27
+ @obj_class = Fiona7::ObjClassNameDemangler.new(@real_obj_class).demangle
28
28
  end
29
29
 
30
30
  ensure_obj_class_exists
@@ -0,0 +1,24 @@
1
+ module Fiona7
2
+ class ComplexObject
3
+ def initialize(obj)
4
+ @obj = obj
5
+ end
6
+
7
+ def widgets
8
+ # TODO: optimize this through attr_values
9
+ links = @obj[:X_widget_pool] || []
10
+ WriteObj.where(obj_id: links.map {|l| l.destination_object_id }).to_a.to_set
11
+ end
12
+
13
+ def binaries
14
+ type_definition = Fiona7::TypeRegister.instance.read_mangled(@obj.obj_class)
15
+ type_definition.attrs.each do |attribute|
16
+ if attribute.type == :binary && attribute.real_name != "blob"
17
+ (obj[attribute.real_name] || []).each do |link|
18
+ referenced << link.destination_object
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -8,6 +8,8 @@ require 'fiona7/builder/obj_updater'
8
8
  require 'fiona7/naive_search_engine'
9
9
  require 'fiona7/verity_search_engine'
10
10
 
11
+ require 'fiona7/facet_builder'
12
+
11
13
  require 'fiona7/assert'
12
14
 
13
15
  require 'fiona7/json/reverse_obj_decorator'
@@ -52,6 +54,19 @@ module Fiona7
52
54
  return ::JSON.parse(::ActiveSupport::JSON.encode(decorated))
53
55
  end
54
56
 
57
+ def fetch_multiple(revision_id, payload)
58
+ # TODO: use implementation from ContentService controller
59
+ # FIXME: code duplication with fetch_by_id
60
+ obj_ids = payload.with_indifferent_access[:ids]
61
+ klass = revision_id.start_with?('f') ? ReleasedObj : EditedObj
62
+ objs = klass.where(obj_id: obj_ids)
63
+ objs_arr = obj_ids.map {|obj_id| objs.find {|o| o.id == obj_id.to_i } }
64
+
65
+ decorated = objs_arr.map {|obj| obj ? Fiona7::JSON::ReverseObjDecorator.new(klass, obj) : nil }
66
+ response = ::JSON.parse(::ActiveSupport::JSON.encode({"results" => decorated}))
67
+ return response
68
+ end
69
+
55
70
  def fetch_by_id(workspace_id, obj_id)
56
71
  klass = matching_class(workspace_id)
57
72
  obj = klass.where(obj_id: obj_id).first
@@ -85,35 +100,66 @@ module Fiona7
85
100
 
86
101
  def search(workspace_id, params)
87
102
  klass = matching_class(workspace_id)
103
+ params = params.symbolize_keys
104
+
105
+ facets = params[:facets] || []
106
+
107
+ if params[:continuation]
108
+ conti = ::JSON.parse(Base64.decode64(params[:continuation])).symbolize_keys #rescue {}
109
+ else
110
+ conti = {}
111
+ end
112
+
113
+ offset = conti[:offset] || params[:offset] || 0
114
+ # 10 is the default value in original implementation
115
+ size = conti[:size] || params[:size] || 10
116
+ order = (conti[:sort_order] || params[:sort_order] || :asc).to_sym
117
+ sort = (conti[:sort_by] || params[:sort_by] || :id).to_sym
118
+
119
+ if params[:query].present?
120
+ normalize_query_params(params[:query])
121
+
122
+ query = (params[:query] || []).dup
88
123
 
89
- if params[:query].blank?
90
- return ::JSON.parse(::ActiveSupport::JSON.encode({
124
+ puts "SEARCH: #{query}"
125
+ if use_naive_search_engine?(query)
126
+ puts "NAIVE"
127
+ search = NaiveSearchEngine.new(klass, query, offset, size, sort, order)
128
+ else
129
+ puts "VERITY"
130
+ search = VeritySearchEngine.new(klass, query, offset, size, sort, order)
131
+ end
132
+ result = search.results.map {|o_id| {id: o_id} }
133
+ total = search.total
134
+
135
+ # TODO: search engine should not destroy query :/
136
+ query = (params[:query] || []).dup
137
+
138
+ response = {
139
+ total: total,
140
+ results: result
141
+ }
142
+ else
143
+ query = []
144
+
145
+ response = {
91
146
  total: 0,
92
147
  results: []
93
- }))
148
+ }
94
149
  end
95
150
 
96
- offset = params[:offset] || 0
97
- size = params[:size] || 100
98
- query = (params[:query] || []).dup
99
- order = (params[:sort_order] || :asc).to_sym
100
- sort = (params[:sort_by] || :id).to_sym
101
-
102
- #puts "SEARCH: #{query}"
103
- if use_naive_search_engine?(query)
104
- #puts "NAIVE"
105
- search = NaiveSearchEngine.new(klass, query, offset, size, sort, order)
106
- else
107
- #puts "VERITY"
108
- search = VeritySearchEngine.new(klass, query, offset, size, sort, order)
151
+ if response[:total] > offset + size
152
+ response[:continuation] = Base64.encode64({
153
+ size: size,
154
+ offset: (offset+size),
155
+ sort_order: order,
156
+ sort_by: sort,
157
+ }.to_json)
109
158
  end
110
- result = search.results.map {|o| {id: o.id} }
111
- total = search.total
112
159
 
113
- return ::JSON.parse(::ActiveSupport::JSON.encode({
114
- total: total,
115
- results: result
116
- }))
160
+ response[:facets] = facets.map {|facet| FacetBuilder.new(facet.symbolize_keys, query, klass).build } unless facets.empty?
161
+
162
+ return ::JSON.parse(::ActiveSupport::JSON.encode(response))
117
163
  end
118
164
 
119
165
  def update(workspace_id, values)
@@ -156,7 +202,7 @@ module Fiona7
156
202
  end
157
203
  end
158
204
  if outside_objects.length != 0
159
- outside_paths = outside_objects.map(&:path).join(" ")
205
+ outsize_paths = outsize_objects.map(&:path).join(" ")
160
206
  Assert.input(
161
207
  false,
162
208
  "Cannot remove object because #{outside_paths} have links pointing to it"
@@ -190,10 +236,36 @@ module Fiona7
190
236
  )
191
237
  end
192
238
 
239
+ # This is required because the sdk is inconsistent
240
+ # in its usage of search operators
241
+ def normalize_query_params(query_params)
242
+ query_params.each do |query_param|
243
+ query_param.symbolize_keys!
244
+ query_param[:operator] = query_param[:operator].to_sym
245
+ query_param[:field] = query_param[:field].to_sym
246
+
247
+ case query_param[:operator]
248
+ when :contains
249
+ query_param[:operator] = :search
250
+ when :contains_prefix
251
+ query_param[:operator] = :prefix_search
252
+ when :equals
253
+ query_param[:operator] = :equal
254
+ when :starts_with
255
+ query_param[:operator] = :prefix
256
+ when :is_greater_than
257
+ query_param[:operator] = :greater_than
258
+ when :is_less_than
259
+ query_param[:operator] = :less_than
260
+ end
261
+ end
262
+ end
263
+
193
264
  def use_naive_search_engine?(query)
194
265
  false ||
195
266
  query.empty? ||
196
- query.any? {|q| q[:field].to_sym == :_path && (q[:operator].to_sym == :equal || query.length == 1)} ||
267
+ query.any? {|q| (q[:field].to_sym == :_path || q[:field].to_sym == :_name)&& (q[:operator].to_sym == :equal || q[:operator].to_sym == :prefix || query.length == 1)} ||
268
+ query.any? {|q| q[:field].to_sym == :_parent_path && (q[:operator].to_sym == :equal || query.length == 1)} ||
197
269
  (query.length == 1 && query.first[:field].to_sym == :_modification) ||
198
270
  (query.length == 1 && query.first[:field].to_sym == :_obj_class) ||
199
271
  (query.length == 1 && query.first[:field].to_sym == :id) ||
@@ -7,15 +7,31 @@ module Fiona7
7
7
  class WorkspaceController
8
8
  def fetch(id)
9
9
  id = id.to_sym
10
- Assert.input(
10
+ Assert.exists(
11
11
  id == :published || id == :rtc,
12
- "Workspace does not exist"
12
+ "Could not find Scrivito::Workspace with id #{id}"
13
13
  )
14
14
 
15
15
  w = Workspace.new(id)
16
16
  return ::JSON.parse(::ActiveSupport::JSON.encode(w))
17
17
  end
18
18
 
19
+ def changes(id)
20
+ id = id.to_sym
21
+ Assert.exists(
22
+ id == :published || id == :rtc,
23
+ "Could not find Scrivito::Workspace with id #{id}"
24
+ )
25
+
26
+ w = Workspace.new(id)
27
+ w_json = ::JSON.parse(::ActiveSupport::JSON.encode(w))
28
+ {
29
+ "workspace" => w_json,
30
+ "current" => w.content_state_id,
31
+ "objs" => "*"
32
+ }
33
+ end
34
+
19
35
  def publish(id)
20
36
  raise "Unexpected workspace_id: #{id}" unless id.to_s == "rtc"
21
37
  WriteObj.where(is_edited: 1).each do |obj|
@@ -33,6 +49,11 @@ module Fiona7
33
49
  Assert.contraint(false, "Workspaces cannot be deleted")
34
50
  end
35
51
 
52
+ def update(id)
53
+ # DUMMY NO OP
54
+ {}
55
+ end
56
+
36
57
  def create(values)
37
58
  id = (values[:workspace][:id] || values[:workspace]["id"])
38
59
  id = (id || :no_id_provided).to_sym
data/lib/fiona7/engine.rb CHANGED
@@ -21,19 +21,20 @@ require "fiona7/scrivito_patches/attribute_serializer"
21
21
  require "fiona7/scrivito_patches/basic_obj"
22
22
  require "fiona7/scrivito_patches/basic_widget"
23
23
  require "fiona7/scrivito_patches/binary"
24
- require "fiona7/scrivito_patches/cms_backend"
25
24
  require "fiona7/scrivito_patches/child_list_tag"
25
+ require "fiona7/scrivito_patches/cms_backend"
26
26
  require "fiona7/scrivito_patches/cms_field_tag"
27
- require "fiona7/scrivito_patches/controller_actions"
28
27
  # different load order !!
29
28
  #require "fiona7/scrivito_patches/cms_dispatch_controller"
30
29
  require "fiona7/scrivito_patches/cms_rest_api"
31
30
  require "fiona7/scrivito_patches/cms_routing"
32
31
  require "fiona7/scrivito_patches/layout_tags"
32
+ require "fiona7/scrivito_patches/log_subscriber"
33
33
  require "fiona7/scrivito_patches/link_parser"
34
34
  require "fiona7/scrivito_patches/migrator"
35
- require "fiona7/scrivito_patches/obj_data_from_rest"
36
35
  require "fiona7/scrivito_patches/page_config"
36
+ require "fiona7/scrivito_patches/preset_routes"
37
+ require "fiona7/scrivito_patches/routing_extensions"
37
38
  require "fiona7/scrivito_patches/type_computer"
38
39
  require "fiona7/scrivito_patches/workspace"
39
40
 
@@ -42,27 +43,10 @@ require "fiona7/fiona_connector_patches/cms_accessible"
42
43
  require "fiona7/middleware/table_switching_middleware"
43
44
  require "fiona7/middleware/server_detection_middleware"
44
45
 
45
- module Scrivito
46
- class LogSubscriber < ActiveSupport::LogSubscriber
47
- def backend_request(event)
48
- self.class.runtime += event.duration
49
- return unless logger.debug?
50
-
51
- duration = '(%.1fms)' % [event.duration]
52
-
53
- param = event.payload[:params]
54
- param_text = " #{param}" if param
55
-
56
- verb_text = event.payload[:verb].upcase
57
- path_text = event.payload[:path]
58
-
59
- debug " Fiona7 #{verb_text} #{path_text}#{param_text} #{duration}"
60
- end
61
- end
62
- end
46
+ # components
47
+ require "fiona7/recursive_object_finder"
48
+ require "fiona7/complex_object"
63
49
 
64
-
65
- require "fiona7/routers/content_service"
66
50
  require "fiona7/routers/rest_api"
67
51
 
68
52
  require 'fiona7/scrivito_user'
@@ -124,6 +108,10 @@ module Fiona7
124
108
 
125
109
  class Engine < ::Rails::Engine
126
110
 
111
+ config.after_initialize do
112
+ puts "ENGINE AFTER INITIALIZE"
113
+ end
114
+
127
115
  config.to_prepare do
128
116
  # TODO: do some smart optimizations
129
117
  initializer = Fiona7::Initializer.new