From aedf5778aba87c4e8d036dde2a0b6ec79cf8b342 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Thu, 23 Jul 2026 19:45:47 +0200 Subject: Keep in-editor asset curation off the head, layering it like every edit ensure_autosave! gives body keystrokes and asset curation one shared layer, so head is never mutated in place and every curation change surfaces in the publish delta. Stale rendered join ids are mapped across the clone via asset_id. Curation now requires holding the lock; a missing lock answers 423, matching the autosave endpoint. --- app/controllers/related_assets_controller.rb | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'app/controllers') diff --git a/app/controllers/related_assets_controller.rb b/app/controllers/related_assets_controller.rb index ca894f2f..3aa6d3db 100644 --- a/app/controllers/related_assets_controller.rb +++ b/app/controllers/related_assets_controller.rb @@ -2,6 +2,10 @@ class RelatedAssetsController < ApplicationController before_action :login_required before_action :find_node + rescue_from LockedByAnotherUser do + head :locked + end + def search term = params[:search_term].to_s.strip attached_ids = @node.editable_page.related_assets.pluck(:asset_id) @@ -19,8 +23,9 @@ class RelatedAssetsController < ApplicationController end def create + page = @node.ensure_autosave!(current_user) asset = Asset.find(params[:asset_id]) - related = @node.editable_page.related_assets.find_or_create_by!(asset: asset) + related = page.related_assets.find_or_create_by!(asset: asset) render json: { id: related.id, @@ -35,22 +40,25 @@ class RelatedAssetsController < ApplicationController end def destroy - @node.editable_page.related_assets.find(params[:id]).destroy + page = @node.ensure_autosave!(current_user) + source = RelatedAsset.find(params[:id]) + page.related_assets.find_by!(:asset_id => source.asset_id).destroy head :ok end def update - related = @node.editable_page.related_assets.find(params[:id]) + page = @node.ensure_autosave!(current_user) + source = RelatedAsset.find(params[:id]) + related = page.related_assets.find_by!(:asset_id => source.asset_id) if params.key?(:headline) RelatedAsset.transaction do - @node.editable_page.related_assets.update_all(headline: false) + page.related_assets.update_all(headline: false) related.update!(headline: true) if params[:headline] == "true" end else related.insert_at(params[:position].to_i) end - head :ok end -- cgit v1.3