summaryrefslogtreecommitdiff
path: root/app/models/node_action.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/node_action.rb')
-rw-r--r--app/models/node_action.rb34
1 files changed, 31 insertions, 3 deletions
diff --git a/app/models/node_action.rb b/app/models/node_action.rb
index aa52f489..afa2195c 100644
--- a/app/models/node_action.rb
+++ b/app/models/node_action.rb
@@ -35,8 +35,16 @@ class NodeAction < ApplicationRecord
35 # "title" -- pair, always; "from" null on first publish 35 # "title" -- pair, always; "from" null on first publish
36 # "author" -- pair, when the byline changed (incl. first publish) 36 # "author" -- pair, when the byline changed (incl. first publish)
37 # "tags" -- pair of arrays, when changed 37 # "tags" -- pair of arrays, when changed
38 # "assets_changed", "template_changed", 38 # "assets" -- {"added" => [asset names], "removed" => [asset names]},
39 # "abstract_changed", "body_changed" 39 # keys only when any; a delta, not a pair. The event IS
40 # the delta, full sets would bloat every entry. Changed
41 # assets are participants of the entry. Replaces the
42 # legacy "assets_changed" boolean, which witnessed
43 # pre-contract entries still carry and the renderer keeps
44 # understanding. Assets destroyed since leave no trace in
45 # regenerated deltas, their joins died with them.
46 # "assets_reordered" -- boolean, set unchanged but gallery order not
47 # "template_changed", "abstract_changed", "body_changed"
40 # -- the last two for the default locale; page_id links 48 # -- the last two for the default locale; page_id links
41 # to the revision for the real diff (never stored) 49 # to the revision for the real diff (never stored)
42 # "translation_diff" -- only when a non-default locale differs: 50 # "translation_diff" -- only when a non-default locale differs:
@@ -155,7 +163,17 @@ class NodeAction < ApplicationRecord
155 diff[:tags] = { "from" => old_tags, "to" => new_tags } if old_tags != new_tags 163 diff[:tags] = { "from" => old_tags, "to" => new_tags } if old_tags != new_tags
156 164
157 diff[:template_changed] = true if old_page.template_name != new_page.template_name 165 diff[:template_changed] = true if old_page.template_name != new_page.template_name
158 diff[:assets_changed] = true if old_page.assets.map(&:id) != new_page.assets.map(&:id) 166
167 old_assets, new_assets = old_page.assets.to_a, new_page.assets.to_a
168 added, removed = new_assets - old_assets, old_assets - new_assets
169 if added.any? || removed.any?
170 assets = {}
171 assets["added"] = added.map { |a| a.name.presence || a.upload_file_name } if added.any?
172 assets["removed"] = removed.map { |a| a.name.presence || a.upload_file_name } if removed.any?
173 diff[:assets] = assets
174 elsif old_assets.map(&:id) != new_assets.map(&:id)
175 diff[:assets_reordered] = true
176 end
159 177
160 old_t = old_page.translations.find_by(:locale => default) 178 old_t = old_page.translations.find_by(:locale => default)
161 new_t = new_page.translations.find_by(:locale => default) 179 new_t = new_page.translations.find_by(:locale => default)
@@ -188,6 +206,16 @@ class NodeAction < ApplicationRecord
188 diff 206 diff
189 end 207 end
190 208
209 # The asset records added or removed between an outgoing head and its
210 # replacement -- the participant complement to head_diff's "assets"
211 # names. Empty on first publish, mirroring head_diff, which records
212 # no asset delta when everything is new.
213 def self.changed_assets old_page, new_page
214 return [] unless old_page
215 old_a, new_a = old_page.assets.to_a, new_page.assets.to_a
216 (new_a - old_a) | (old_a - new_a)
217 end
218
191 def actor_name 219 def actor_name
192 metadata["username"] || "unknown" 220 metadata["username"] || "unknown"
193 end 221 end