summaryrefslogtreecommitdiff
path: root/app/controllers/related_assets_controller.rb
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-07-13 03:22:37 +0200
committererdgeist <erdgeist@erdgeist.org>2026-07-13 03:22:37 +0200
commit70653b681d10917b77dced08f577446ced7568f1 (patch)
tree3c92383e29da79beb3e1419c153952a4aa7dc1ab /app/controllers/related_assets_controller.rb
parent65c7c40f74c315c1a39fb15da8ce341fb8b9b05e (diff)
Add RelatedAssetsController: search, attach, detach, reorder
Backend for the asset-picker rebuild -- replaces the plan to dump every image asset in the system into a hidden, unfiltered browse panel on every node edit (the actual current behavior, confirmed by reading nodes/edit.html.erb directly) with a small, name-scoped search endpoint plus create/destroy/update for attach, detach, and reorder. No schema change needed -- RelatedAsset already had everything this requires (asset_id, page_id, an acts_as_list position). search excludes assets already attached to the page, keeping results meaningfully small given hundreds of assets total but only a handful per node in practice. create is find_or_create_by! rather than a bare create!, guarding against the same asset being attached twice from two separate search results. update leans on acts_as_list's own insert_at rather than custom position-shifting logic. Node#editable_page (autosave || draft || head) is extracted since this is now its third call site with identical logic -- deliberately not touching nodes#show, which resolves draft || head without autosave on purpose, a different and correct semantic for "current committed state" versus "what's actively being edited."
Diffstat (limited to 'app/controllers/related_assets_controller.rb')
-rw-r--r--app/controllers/related_assets_controller.rb50
1 files changed, 50 insertions, 0 deletions
diff --git a/app/controllers/related_assets_controller.rb b/app/controllers/related_assets_controller.rb
new file mode 100644
index 0000000..906c02c
--- /dev/null
+++ b/app/controllers/related_assets_controller.rb
@@ -0,0 +1,50 @@
1class RelatedAssetsController < ApplicationController
2 before_action :login_required
3 before_action :find_node
4
5 def search
6 term = params[:q].to_s.strip
7 if term.blank?
8 render json: []
9 return
10 end
11
12 attached_ids = @node.editable_page.related_assets.pluck(:asset_id)
13 results = Asset.images
14 .where("name ILIKE ?", "%#{term}%")
15 .where.not(id: attached_ids)
16 .limit(10)
17
18 render json: results.map { |a|
19 { id: a.id, name: a.name, thumb_url: a.upload.url(:thumb) }
20 }
21 end
22
23 def create
24 asset = Asset.find(params[:asset_id])
25 related = @node.editable_page.related_assets.find_or_create_by!(asset: asset)
26
27 render json: {
28 id: related.id,
29 asset_id: asset.id,
30 name: asset.name,
31 thumb_url: asset.upload.url(:thumb)
32 }
33 end
34
35 def destroy
36 @node.editable_page.related_assets.find(params[:id]).destroy
37 head :ok
38 end
39
40 def update
41 @node.editable_page.related_assets.find(params[:id]).insert_at(params[:position].to_i)
42 head :ok
43 end
44
45 private
46
47 def find_node
48 @node = Node.find(params[:node_id])
49 end
50end