From b7469877121bff1eaef5a3849b6e1726e685d9bf Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Thu, 24 Apr 2025 13:04:43 +0200 Subject: [PATCH] Make eventable a generic concern and create a card's especialization for it --- app/models/card/eventable.rb | 27 +++++++++++-------- app/models/event.rb | 5 ++-- app/models/eventable.rb | 21 +++++++++++++++ ...50424105223_make_event_summary_optional.rb | 5 ++++ db/schema.rb | 4 +-- db/schema_cache.yml | 4 +-- 6 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 app/models/eventable.rb create mode 100644 db/migrate/20250424105223_make_event_summary_optional.rb diff --git a/app/models/card/eventable.rb b/app/models/card/eventable.rb index eb06ead4a..7ac190f3d 100644 --- a/app/models/card/eventable.rb +++ b/app/models/card/eventable.rb @@ -1,22 +1,33 @@ module Card::Eventable extend ActiveSupport::Concern - included do - has_many :events, as: :eventable, dependent: :destroy + include ::Eventable + included do before_create { self.last_active_at = Time.current } after_save :track_due_date_change, if: :saved_change_to_due_on? after_save :track_title_change, if: :saved_change_to_title? end - def track_event(action, creator: Current.user, collection: self.collection, **particulars) - if published? - find_or_capture_event_summary.events.create! action:, creator:, collection:, eventable: self, particulars: + def event_was_created(event) + transaction do + find_or_capture_event_summary.events << event + touch(:last_active_at) end end private + def should_track_event? + published? + end + + def find_or_capture_event_summary + transaction do + messages.last&.event_summary || capture(EventSummary.new).event_summary + end + end + def track_due_date_change if due_on.present? if due_on_before_last_save.nil? @@ -34,10 +45,4 @@ module Card::Eventable track_event "title_changed", particulars: { old_title: title_before_last_save, new_title: title } end end - - def find_or_capture_event_summary - transaction do - messages.last&.event_summary || capture(EventSummary.new).event_summary - end - end end diff --git a/app/models/event.rb b/app/models/event.rb index 9659ace63..3b2dca64c 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -4,12 +4,11 @@ class Event < ApplicationRecord belongs_to :collection belongs_to :creator, class_name: "User" belongs_to :eventable, polymorphic: true - belongs_to :summary, touch: true, class_name: "EventSummary" + belongs_to :summary, touch: true, class_name: "EventSummary", optional: true scope :chronologically, -> { order created_at: :asc, id: :desc } - # TODO: Remove dependency with last_active_at via hook - after_create -> { eventable.touch(:last_active_at) } + after_create -> { eventable.event_was_created(self) } def action super.inquiry diff --git a/app/models/eventable.rb b/app/models/eventable.rb new file mode 100644 index 000000000..183c638d5 --- /dev/null +++ b/app/models/eventable.rb @@ -0,0 +1,21 @@ +module Eventable + extend ActiveSupport::Concern + + included do + has_many :events, as: :eventable, dependent: :destroy + end + + def track_event(action, creator: Current.user, collection: self.collection, **particulars) + if should_track_event? + collection.events.create!(action:, creator:, collection:, eventable: self, particulars:) + end + end + + def event_was_created(event) + end + + private + def should_track_event? + true + end +end diff --git a/db/migrate/20250424105223_make_event_summary_optional.rb b/db/migrate/20250424105223_make_event_summary_optional.rb new file mode 100644 index 000000000..f8701dc38 --- /dev/null +++ b/db/migrate/20250424105223_make_event_summary_optional.rb @@ -0,0 +1,5 @@ +class MakeEventSummaryOptional < ActiveRecord::Migration[8.1] + def change + change_column_null :events, :summary_id, true + end +end diff --git a/db/schema.rb b/db/schema.rb index ae4f7e3e4..c318b2ee1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.1].define(version: 2025_04_24_051059) do +ActiveRecord::Schema[8.1].define(version: 2025_04_24_105223) do create_table "accesses", force: :cascade do |t| t.integer "collection_id", null: false t.datetime "created_at", null: false @@ -183,7 +183,7 @@ ActiveRecord::Schema[8.1].define(version: 2025_04_24_051059) do t.integer "eventable_id", null: false t.string "eventable_type", null: false t.json "particulars", default: {} - t.integer "summary_id", null: false + t.integer "summary_id" t.datetime "updated_at", null: false t.index ["collection_id"], name: "index_events_on_collection_id" t.index ["creator_id"], name: "index_events_on_creator_id" diff --git a/db/schema_cache.yml b/db/schema_cache.yml index 918fa9373..208449c4b 100644 --- a/db/schema_cache.yml +++ b/db/schema_cache.yml @@ -592,7 +592,7 @@ columns: name: summary_id cast_type: *1 sql_type_metadata: *2 - 'null': false + 'null': true default: default_function: collation: @@ -2026,4 +2026,4 @@ indexes: comment: valid: true workflows: [] -version: 20250424051059 +version: 20250424105223