app/controllers/scrivito/objs_controller.rb in scrivito_sdk-0.18.1 vs app/controllers/scrivito/objs_controller.rb in scrivito_sdk-0.30.0.rc1

- old
+ new

@@ -1,220 +1,208 @@ module Scrivito - class ObjsController < WebserviceController - around_action :authorize_selected_workspace_read, - only: [:details, :page_class_selection, :widget_class_selection, :search] + around_action :require_selected_workspace_write_authorization, only: [ + :copy, + :create, + :destroy, + :destroy_widget, + :duplicate, + :mark_resolved, + :restore, + :revert, + :revert_widget, + :update, + ] - around_action :authorize_selected_workspace_write, - only: [:create, :update, :destroy, :destroy_widget, :revert, :restore, :mark_resolved, - :copy, :duplicate] + before_filter :require_identical_selected_and_visible_workspace, only: [ + :copy, + :create, + :duplicate, + :page_class_selection, + :update, + :widget_class_selection, + ] - before_filter :ensure_identical_selected_and_visible_workspace, - only: [:create, :update, :copy, :duplicate, :page_class_selection, :widget_class_selection] - def create - created_obj = task_unaware_request(:post, - "workspaces/#{selected_workspace.id}/objs", - {obj: obj_params} - ) - render json: created_obj + obj_params = obj_params_parser.parse(nil, params[:obj]) + @obj = selected_workspace.task_unaware_api_request(:post, '/objs', obj: obj_params) end def details - load_object - render json: {markup: render_to_string(@obj.details_view_path, layout: false)} + @markup = render_to_string(current_obj.details_view_path, layout: false, formats: :html) end def update - load_object - changed_obj = task_unaware_request(:put, - "workspaces/#{selected_workspace.id}/objs/#{params[:id]}", - {obj: obj_params} - ) - render json: changed_obj + obj_params = obj_params_parser.parse(current_obj, params[:obj]) + @api_response = selected_workspace + .task_unaware_api_request(:put, "/objs/#{params[:id]}", obj: obj_params) end def destroy - in_selected_workspace { load_object.destroy } + in_selected_workspace { current_obj.destroy } render_empty_json end def destroy_widget - raise ScrivitoError, "no widget_id param specified" if params[:widget_id].blank? - in_selected_workspace do - widget = load_object.widget_from_pool(params[:widget_id]) - unless widget - raise ScrivitoError, - "widget with ID '#{params[:widget_id]}' not found in obj with ID '#{@obj.id}'" - end - widget.destroy - end + in_selected_workspace { current_widget.destroy } render_empty_json end def revert - in_selected_workspace { load_object.revert } + in_selected_workspace { current_obj.revert } render_empty_json end + def revert_widget + in_selected_workspace { current_widget.revert } + render_empty_json + end + def restore in_selected_workspace { Obj.restore(params[:id]) } render_empty_json end def mark_resolved - in_selected_workspace { load_object.mark_resolved } + in_selected_workspace { current_obj.mark_resolved } render_empty_json end def copy - render json: copy_obj(load_object, params[:parent_path]) + @attributes = copy_obj(current_obj, params[:parent_path]) end def duplicate - load_object - - render json: copy_obj(@obj, parent_path(@obj.path)) + @attributes = copy_obj(current_obj, current_obj.parent_path) + render :copy end def page_class_selection - valid_page_classes = Obj.valid_page_classes_beneath(params[:parent_path]) || - Obj.descendants - valid_page_classes.map!(&:to_s) - - page_class_names = valid_page_classes.map do |page_class_name| + @page_class_markup = valid_page_classes.map do |page_class_name| begin - markup = render_to_string("#{page_class_name.underscore}/thumbnail") + markup = render_to_string("#{page_class_name.underscore}/thumbnail", formats: :html) {name: page_class_name, markup: markup} rescue ActionView::MissingTemplate end end - - render json: page_class_names.compact + @page_class_markup.compact! end def widget_class_selection - load_object - valid_widget_classes = @obj.valid_widget_classes_for(params[:field_name]) || - Widget.descendants - valid_widget_classes.map!(&:to_s) + load_obj - widgets_classes = valid_widget_classes.map do |widget_class_name| + @widgets_classes = valid_widget_classes.map do |widget_class_name| template_path = "#{widget_class_name.underscore}/thumbnail" markup = begin - render_to_string(template_path, layout: false) + render_to_string(template_path, layout: false, formats: :html) rescue ActionView::MissingTemplate - render_to_string('scrivito/widget_thumbnail', layout: false, + render_to_string('scrivito/widget_thumbnail', layout: false, formats: :html, locals: {widget_class_name: widget_class_name, template_path: template_path}) end {name: widget_class_name, markup: markup} end - - render json: widgets_classes end def search in_selected_workspace do - query = MultiJson.decode(params[:query]).with_indifferent_access - search_builder = ObjSearchBuilder.new(query) - enumerator = search_builder.build - formatter = fetch_formatter(query[:format]) + @query = MultiJson.decode(params[:query]).with_indifferent_access + @enumerator = ObjSearchBuilder.new(@query).build if params[:query_action] == 'size' - render json: { total: enumerator.size } - elsif formatter - batch = enumerator.load_batch - - result = { - total: enumerator.size, - hits: batch.map { |obj| formatter.call(obj, scrivito_user) } - } - - render json: result + render :search_only_size + elsif @formatter = fetch_formatter(@query[:format]) + render :search else - render json: { error: format_missing_message(query[:format]) }, status: :not_found + render :format_missing_error, status: :not_found end end end - private + def modification + in_selected_workspace { render } + end - def load_object - @obj = Obj.find(params[:id]) + def widget_modification + in_selected_workspace { render } end - def ensure_identical_selected_and_visible_workspace + private + + def require_identical_selected_and_visible_workspace if selected_workspace != editing_context.visible_workspace - raise ScrivitoError, "selected and visible workspace are not identical" + raise ScrivitoError, 'selected and visible workspace are not identical' end end - def obj_params - @obj_params ||= ObjParamsParser.new(request.host, request.port).parse(@obj, params[:obj]) + def require_selected_workspace_write_authorization(&block) + authorize_workspace_access(:write, selected_workspace, &block) end - def copy_obj(obj, target_path) - id = SecureRandom.hex(8) + def in_selected_workspace(&block) + selected_workspace.as_current(&block) + end - copied_obj = obj.copy(_id: id, _path: "#{target_path}/#{id}") - dumped_last_changed = CmsRestApi::AttributeSerializer - .convert_time(copied_obj[:_last_changed]) - - { - _id: copied_obj[:_id], - _last_changed: dumped_last_changed, - _obj_class: copied_obj[:_obj_class_name], - _path: copied_obj[:_path], - } + def selected_workspace + editing_context.selected_workspace end - def get_obj_attributes(id) - task_unaware_request(:get, "workspaces/#{selected_workspace.id}/objs/#{id}") + def current_obj + @obj || load_obj end + helper_method :current_obj - def parent_path(path) - path.split('/')[0..-2].join('/') + def load_obj + @obj = Obj.find(params[:id]) end - def current_page - Obj.find(params[:current_page_id]) if params[:current_page_id].present? + def current_widget + @widget || load_widget end - helper_method :current_page + helper_method :current_widget - delegate :task_unaware_request, to: CmsRestApi - - private - - def authorize_selected_workspace_read(&block) - authorize_workspace_access(:read, selected_workspace, &block) + def load_widget + raise ScrivitoError, 'no widget_id param specified' if params[:widget_id].blank? + unless @widget = current_obj.widget_from_pool(params[:widget_id]) + raise ScrivitoError, "widget with ID '#{params[:widget_id]}' not found" + end + @widget end - def authorize_selected_workspace_write(&block) - authorize_workspace_access(:write, selected_workspace, &block) + def copy_obj(obj, target_path) + id = SecureRandom.hex(8) + copied_obj = obj.copy(_id: id, _path: "#{target_path}/#{id}") + dumped_last_changed = CmsRestApi::AttributeSerializer.convert_time(copied_obj[:_last_changed]) + { + _id: copied_obj[:_id], + _last_changed: dumped_last_changed, + _obj_class: copied_obj[:_obj_class_name], + _path: copied_obj[:_path], + } end - def in_selected_workspace(&block) - selected_workspace.as_current(&block) + def fetch_formatter(name) + name ? Configuration.obj_formats[name] : proc { |obj, _| obj.id } end - def selected_workspace - @selected_workspace ||= editing_context.selected_workspace + def valid_page_classes + (Obj.valid_page_classes_beneath(params[:parent_path]) || Obj.descendants).map(&:to_s) end - def render_empty_json - render json: {} + def valid_widget_classes + (widget_classes_from_widget || widget_classes_from_obj || Widget.descendants).map(&:to_s) end - def fetch_formatter(name) - if name - Configuration.obj_formats[name] - else - proc { |obj, _| obj.id } + def widget_classes_from_widget + if params[:widget_id] && (widget = current_obj.widget_from_pool(params[:widget_id])) + widget.valid_widget_classes_for(params[:field_name]) end end - def format_missing_message(format_name) - "The format with the name '#{format_name}' is not registered" + def widget_classes_from_obj + current_obj.valid_widget_classes_for(params[:field_name]) end - end + def obj_params_parser + ObjParamsParser.new(request.host, request.port) + end + end end