app/controllers/scrivito/workspaces_controller.rb in scrivito_sdk-0.18.1 vs app/controllers/scrivito/workspaces_controller.rb in scrivito_sdk-0.30.0.rc1
- old
+ new
@@ -3,59 +3,75 @@
around_action :authorize_current_workspace_read, only: :show
around_action :authorize_current_workspace_write, only: [:update, :destroy, :rebase]
around_action :authorize_current_workspace_publish, only: [:check, :publish]
def index
- workspaces = Workspace.all.select do |workspace|
- can_user_access_workspace?(:read, workspace) || workspace.published?
+ @workspaces = Workspace.all.select do |workspace|
+ can_user_access_workspace?(:read, workspace)
end
- render json: workspaces
end
def show
- render json: current_workspace
end
def create
create_workspace_params = workspace_params.dup
- create_workspace_params.deep_merge!(memberships: {scrivito_user.id => {role: 'owner'}})
- render json: Workspace.create(create_workspace_params)
+ unless scrivito_user.system_user?
+ create_workspace_params.deep_merge!(memberships: {scrivito_user.id => {role: 'owner'}})
+ end
+ result = task_unaware_request(:post, '/workspaces', workspace: create_workspace_params)
+
+ handle_if_task(result) do
+ @workspace_result = result
+ end
end
def update
- render json: current_workspace.update(workspace_params)
+ current_workspace.update(workspace_params)
+ render_empty_json
end
def destroy
current_workspace.destroy
render_empty_json
end
def rebase
- current_workspace.rebase
- render_empty_json
+ @task = task_unaware_request(:put, current_workspace_backend_path('/rebase'), {})['task']
+ render :task
end
def check
- render json: publish_checker.call(params[:from].to_i)
+ assert_workspace_is_not_outdated
+ @check_result = publish_checker.call(params[:from].to_i)
end
def publish
if valid_publish_request?
- current_workspace.conditional_publish
- render_empty_json
+ @task = conditional_publish['task']
+ render :task
else
- concurrent_content_change_response
+ raise_content_state_id_changed
end
- rescue Workspace::PublishPreventedDueToContentChange
- concurrent_content_change_response
rescue ScrivitoError => e
raise ClientError.new(e.message, 400)
end
private
+ delegate :task_unaware_request, to: CmsRestApi
+
+ def current_workspace_backend_path(suffix)
+ "/workspaces/#{current_workspace.id}#{suffix}"
+ end
+
+ def conditional_publish
+ task_unaware_request(:put, current_workspace_backend_path('/publish'), {
+ if_content_state_id_equals: current_workspace.content_state.content_state_id
+ })
+ end
+
def valid_publish_request?
publish_checker.passing_certificates?(certificates_param)
end
def publish_checker
@@ -79,10 +95,11 @@
end
def current_workspace
@current_workspace ||= Workspace.find(params[:id])
end
+ helper_method :current_workspace
def workspace_params
assert_valid_workspace_params
params[:workspace]
end
@@ -90,10 +107,29 @@
def certificates_param
assert_valid_certificates_param
params[:certificates]
end
+ def handle_if_task(result)
+ if result['task'].present?
+ @task = result['task']
+ render :task
+ else
+ yield result
+ end
+ end
+
+ def assert_workspace_is_not_outdated
+ if current_workspace.outdated?
+ raise ClientError.new(
+ 'Workspace is outdated',
+ 400,
+ 'precondition_not_verifiable.workspace.publish.content_state_id'
+ )
+ end
+ end
+
def assert_valid_certificates_param
if params[:certificates].blank?
raise ClientError.new("Required parameter 'certificates' is missing.", 400)
end
unless params[:certificates].is_a?(Array)
@@ -104,10 +140,14 @@
def assert_valid_workspace_params
raise "Required parameter 'workspace' is missing." unless params[:workspace].present?
raise "Parameter 'workspace' is not a hash." unless params[:workspace].is_a?(Hash)
end
- def concurrent_content_change_response
- render text: 'Concurrent content change', status: 409
+ def raise_content_state_id_changed
+ raise ClientError.new(
+ 'Content state id changed',
+ 400,
+ 'precondition_not_met.workspace.publish.content_state_id'
+ )
end
end
end