diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-07-23 17:49:18 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-07-23 17:49:18 +0200 |
| commit | f993853db3e233f05a55de5ba2a87b77acf041aa (patch) | |
| tree | 0a28289ff471ab5853b22c2a68ed21ce4e0eb4ac /app/models/node_action.rb | |
| parent | 932d4a4be40587fa6d489eca16a1ef6d6f2936d1 (diff) | |
Record asset deltas at publish, with changed assets as participants
Diffstat (limited to 'app/models/node_action.rb')
| -rw-r--r-- | app/models/node_action.rb | 34 |
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 |
