diff --git a/app/models/bubble.rb b/app/models/bubble.rb index d3e01b2ed..b23cd48f2 100644 --- a/app/models/bubble.rb +++ b/app/models/bubble.rb @@ -1,5 +1,5 @@ class Bubble < ApplicationRecord - include Assignable, Boostable, Colored, Commentable, Eventable, Poppable, Searchable, Staged, Taggable, Threaded + include Assignable, Boostable, Colored, Commentable, Eventable, Messages, Poppable, Searchable, Staged, Taggable belongs_to :bucket belongs_to :creator, class_name: "User", default: -> { Current.user } diff --git a/app/models/bubble/eventable.rb b/app/models/bubble/eventable.rb index 6ff51f1dd..9d7db3453 100644 --- a/app/models/bubble/eventable.rb +++ b/app/models/bubble/eventable.rb @@ -9,6 +9,6 @@ module Bubble::Eventable private def track_event(action, creator: Current.user, **particulars) - events.create! action: action, creator: creator, rollup: thread.latest_rollup, particulars: particulars + events.create! action: action, creator: creator, summary: latest_event_summary, particulars: particulars end end diff --git a/app/models/bubble/messages.rb b/app/models/bubble/messages.rb new file mode 100644 index 000000000..9cfe390c0 --- /dev/null +++ b/app/models/bubble/messages.rb @@ -0,0 +1,11 @@ +module Bubble::Messages + extend ActiveSupport::Concern + + included do + has_many :messages, -> { chronologically }, dependent: :destroy + end + + def latest_event_summary + messages.last&.event_summary || EventSummary.new(bubble: self) + end +end diff --git a/app/models/bubble/thread.rb b/app/models/bubble/thread.rb deleted file mode 100644 index 351f04781..000000000 --- a/app/models/bubble/thread.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Bubble::Thread < ApplicationRecord - belongs_to :bubble, touch: true - - has_many :entries, -> { chronologically }, dependent: :destroy - - def latest_rollup - entries.last&.event_rollup || Event::Rollup.new(thread: self) - end - - def to_partial_path - "bubbles/threads/thread" - end -end diff --git a/app/models/bubble/thread/entry.rb b/app/models/bubble/thread/entry.rb deleted file mode 100644 index 50d18b63d..000000000 --- a/app/models/bubble/thread/entry.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Bubble::Thread::Entry < ApplicationRecord - belongs_to :thread, touch: true - - delegated_type :threadable, types: Threadable::TYPES, inverse_of: :thread_entry, dependent: :destroy - - after_touch -> { thread.touch } - - scope :chronologically, -> { order created_at: :asc, id: :desc } - - def to_partial_path - "bubbles/threads/entries/entry" - end -end diff --git a/app/models/bubble/threaded.rb b/app/models/bubble/threaded.rb deleted file mode 100644 index 2e674b46d..000000000 --- a/app/models/bubble/threaded.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Bubble::Threaded - extend ActiveSupport::Concern - - included do - has_one :thread, dependent: :destroy - - after_create -> { create_thread! } - end -end diff --git a/app/models/comment.rb b/app/models/comment.rb index 09666caca..e3cfb9e85 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -1,12 +1,8 @@ class Comment < ApplicationRecord - include Searchable, Threadable + include Searchable, Messageable belongs_to :bubble, touch: true belongs_to :creator, class_name: "User", default: -> { Current.user } searchable_by :body, using: :comments_search_index - - def thread - bubble.thread - end end diff --git a/app/models/concerns/messageable.rb b/app/models/concerns/messageable.rb new file mode 100644 index 000000000..781317b5a --- /dev/null +++ b/app/models/concerns/messageable.rb @@ -0,0 +1,13 @@ +module Messageable + extend ActiveSupport::Concern + + TYPES = %w[ Comment EventSummary ] + + included do + has_one :message, as: :messageable + + after_create -> { create_message! bubble: bubble } + after_update -> { message.touch } + after_touch -> { message.touch } + end +end diff --git a/app/models/concerns/threadable.rb b/app/models/concerns/threadable.rb deleted file mode 100644 index 410012a31..000000000 --- a/app/models/concerns/threadable.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Threadable - extend ActiveSupport::Concern - - TYPES = %w[ Comment Event::Rollup ] - - included do - has_one :thread_entry, as: :threadable, class_name: "Bubble::Thread::Entry" - - after_create -> { create_thread_entry! thread: thread } - after_update -> { thread_entry.touch } - after_touch -> { thread_entry.touch } - end -end diff --git a/app/models/event.rb b/app/models/event.rb index 6c88f4895..462f07132 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -3,7 +3,7 @@ class Event < ApplicationRecord belongs_to :creator, class_name: "User" belongs_to :bubble, touch: true - belongs_to :rollup, touch: true + belongs_to :summary, touch: true, class_name: "EventSummary" has_one :account, through: :creator diff --git a/app/models/event/rollup.rb b/app/models/event/rollup.rb deleted file mode 100644 index bd016c9c3..000000000 --- a/app/models/event/rollup.rb +++ /dev/null @@ -1,11 +0,0 @@ -class Event::Rollup < ApplicationRecord - include Threadable - - attr_accessor :thread - - has_many :events, -> { chronologically }, dependent: :delete_all - - def to_partial_path - "events/rollups/rollup" - end -end diff --git a/app/models/event_summary.rb b/app/models/event_summary.rb new file mode 100644 index 000000000..57a0dead8 --- /dev/null +++ b/app/models/event_summary.rb @@ -0,0 +1,7 @@ +class EventSummary < ApplicationRecord + include Messageable + + attr_accessor :bubble + + has_many :events, -> { chronologically }, dependent: :delete_all, inverse_of: :summary +end diff --git a/app/models/message.rb b/app/models/message.rb new file mode 100644 index 000000000..bcc026523 --- /dev/null +++ b/app/models/message.rb @@ -0,0 +1,9 @@ +class Message < ApplicationRecord + belongs_to :bubble, touch: true + + delegated_type :messageable, types: Messageable::TYPES, inverse_of: :message, dependent: :destroy + + after_touch -> { bubble.touch } + + scope :chronologically, -> { order created_at: :asc, id: :desc } +end diff --git a/app/views/boosts/create.turbo_stream.erb b/app/views/boosts/create.turbo_stream.erb index 53ab7e39a..97548728a 100644 --- a/app/views/boosts/create.turbo_stream.erb +++ b/app/views/boosts/create.turbo_stream.erb @@ -2,6 +2,6 @@ <%= render "boosts/boosts", bubble: @bubble %> <% end %> -<%= turbo_stream.replace dom_id(@bubble.thread) do %> - <%= render @bubble.thread %> +<%= turbo_stream.replace dom_id(@bubble, :thread) do %> + <%= render "bubbles/thread", bubble: @bubble %> <% end %> diff --git a/app/views/bubbles/_thread.html.erb b/app/views/bubbles/_thread.html.erb new file mode 100644 index 000000000..867cccaaa --- /dev/null +++ b/app/views/bubbles/_thread.html.erb @@ -0,0 +1,11 @@ +
+ <%# Template Dependency: comments/comment %> + <%# Template Dependency: event_summaries/event_summary %> + <%= render bubble.messages, cache: true %> + <%= render "comments/new", bubble: bubble %> +
diff --git a/app/views/bubbles/show.html.erb b/app/views/bubbles/show.html.erb index a43755cd0..ab54b0d5b 100644 --- a/app/views/bubbles/show.html.erb +++ b/app/views/bubbles/show.html.erb @@ -18,4 +18,5 @@ <%= render "bubbles/bubble", bubble: @bubble %> -<%= render @bubble.thread %> +<%= render "bubbles/thread", bubble: @bubble %> + diff --git a/app/views/bubbles/threads/_thread.html.erb b/app/views/bubbles/threads/_thread.html.erb deleted file mode 100644 index d8473387d..000000000 --- a/app/views/bubbles/threads/_thread.html.erb +++ /dev/null @@ -1,13 +0,0 @@ -<%= cache thread do %> -
- <%# Template Dependency: comments/comment %> - <%# Template Dependency: rollups/rollup %> - <%= render thread.entries, cache: true %> - <%= render "comments/new", bubble: thread.bubble %> -
-<% end %> diff --git a/app/views/bubbles/threads/entries/_entry.html.erb b/app/views/bubbles/threads/entries/_entry.html.erb deleted file mode 100644 index 8e633ee70..000000000 --- a/app/views/bubbles/threads/entries/_entry.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= render entry.threadable %> diff --git a/app/views/events/rollups/_rollup.html.erb b/app/views/event_summaries/_event_summary.html.erb similarity index 78% rename from app/views/events/rollups/_rollup.html.erb rename to app/views/event_summaries/_event_summary.html.erb index 0420c9dcd..58eff756b 100644 --- a/app/views/events/rollups/_rollup.html.erb +++ b/app/views/event_summaries/_event_summary.html.erb @@ -1,4 +1,4 @@
<%# Template Dependency: events/actions/* %> - <%= render rollup.events, cache: true %> + <%= render event_summary.events, cache: true %>
diff --git a/app/views/messages/_message.html.erb b/app/views/messages/_message.html.erb new file mode 100644 index 000000000..cd12237f6 --- /dev/null +++ b/app/views/messages/_message.html.erb @@ -0,0 +1 @@ +<%= render message.messageable %> diff --git a/db/migrate/20241022174800_create_bubble_thread.rb b/db/migrate/20241022174800_create_bubble_thread.rb deleted file mode 100644 index 0b1811cf1..000000000 --- a/db/migrate/20241022174800_create_bubble_thread.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateBubbleThread < ActiveRecord::Migration[8.0] - def change - create_table :bubble_threads do |t| - t.references :bubble, null: false, foreign_key: true - - t.timestamps - end - end -end diff --git a/db/migrate/20241022174801_create_messages.rb b/db/migrate/20241022174801_create_messages.rb new file mode 100644 index 000000000..af8bebd9d --- /dev/null +++ b/db/migrate/20241022174801_create_messages.rb @@ -0,0 +1,10 @@ +class CreateMessages < ActiveRecord::Migration[8.0] + def change + create_table :messages do |t| + t.references :bubble, null: false, foreign_key: true + t.references :messageable, polymorphic: true, null: false, index: { unique: true } + + t.timestamps + end + end +end diff --git a/db/migrate/20241022174801_create_thread_entries.rb b/db/migrate/20241022174801_create_thread_entries.rb deleted file mode 100644 index baa637a24..000000000 --- a/db/migrate/20241022174801_create_thread_entries.rb +++ /dev/null @@ -1,10 +0,0 @@ -class CreateThreadEntries < ActiveRecord::Migration[8.0] - def change - create_table :bubble_thread_entries do |t| - t.references :thread, null: false, foreign_key: { to_table: :bubble_threads } - t.references :threadable, polymorphic: true, null: false, index: { unique: true } - - t.timestamps - end - end -end diff --git a/db/migrate/20241022180042_create_event_rollups.rb b/db/migrate/20241022180042_create_event_rollups.rb deleted file mode 100644 index a3746d3e8..000000000 --- a/db/migrate/20241022180042_create_event_rollups.rb +++ /dev/null @@ -1,7 +0,0 @@ -class CreateEventRollups < ActiveRecord::Migration[8.0] - def change - create_table :event_rollups do |t| - t.timestamps - end - end -end diff --git a/db/migrate/20241022180042_create_event_summaries.rb b/db/migrate/20241022180042_create_event_summaries.rb new file mode 100644 index 000000000..1bf81867b --- /dev/null +++ b/db/migrate/20241022180042_create_event_summaries.rb @@ -0,0 +1,7 @@ +class CreateEventSummaries < ActiveRecord::Migration[8.0] + def change + create_table :event_summaries do |t| + t.timestamps + end + end +end diff --git a/db/migrate/20241022180133_add_rollup_reference_to_events.rb b/db/migrate/20241022180133_add_rollup_reference_to_events.rb deleted file mode 100644 index 68fdc0f01..000000000 --- a/db/migrate/20241022180133_add_rollup_reference_to_events.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRollupReferenceToEvents < ActiveRecord::Migration[8.0] - def change - add_reference :events, :rollup, foreign_key: { to_table: :event_rollups } - end -end diff --git a/db/migrate/20241022180133_add_summary_reference_to_events.rb b/db/migrate/20241022180133_add_summary_reference_to_events.rb new file mode 100644 index 000000000..1908b5b74 --- /dev/null +++ b/db/migrate/20241022180133_add_summary_reference_to_events.rb @@ -0,0 +1,5 @@ +class AddSummaryReferenceToEvents < ActiveRecord::Migration[8.0] + def change + add_reference :events, :summary, foreign_key: { to_table: :event_summaries } + end +end diff --git a/db/schema.rb b/db/schema.rb index b694148bd..48022f68f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -68,23 +68,6 @@ ActiveRecord::Schema[8.0].define(version: 2024_10_22_180133) do t.index ["bubble_id"], name: "index_assignments_on_bubble_id" end - create_table "bubble_thread_entries", force: :cascade do |t| - t.integer "thread_id", null: false - t.string "threadable_type", null: false - t.integer "threadable_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["thread_id"], name: "index_bubble_thread_entries_on_thread_id" - t.index ["threadable_type", "threadable_id"], name: "index_bubble_thread_entries_on_threadable", unique: true - end - - create_table "bubble_threads", force: :cascade do |t| - t.integer "bubble_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["bubble_id"], name: "index_bubble_threads_on_bubble_id" - end - create_table "bubbles", force: :cascade do |t| t.string "title" t.string "color" @@ -127,7 +110,7 @@ ActiveRecord::Schema[8.0].define(version: 2024_10_22_180133) do t.datetime "updated_at", null: false end - create_table "event_rollups", force: :cascade do |t| + create_table "event_summaries", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false end @@ -139,10 +122,20 @@ ActiveRecord::Schema[8.0].define(version: 2024_10_22_180133) do t.string "action", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "rollup_id" + t.integer "summary_id" t.index ["bubble_id", "action"], name: "index_events_on_bubble_id_and_action" t.index ["creator_id"], name: "index_events_on_creator_id" - t.index ["rollup_id"], name: "index_events_on_rollup_id" + t.index ["summary_id"], name: "index_events_on_summary_id" + end + + create_table "messages", force: :cascade do |t| + t.integer "bubble_id", null: false + t.string "messageable_type", null: false + t.integer "messageable_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["bubble_id"], name: "index_messages_on_bubble_id" + t.index ["messageable_type", "messageable_id"], name: "index_messages_on_messageable", unique: true end create_table "pops", force: :cascade do |t| @@ -210,10 +203,9 @@ ActiveRecord::Schema[8.0].define(version: 2024_10_22_180133) do add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" - add_foreign_key "bubble_thread_entries", "bubble_threads", column: "thread_id" - add_foreign_key "bubble_threads", "bubbles" add_foreign_key "bubbles", "workflow_stages", column: "stage_id" - add_foreign_key "events", "event_rollups", column: "rollup_id" + add_foreign_key "events", "event_summaries", column: "summary_id" + add_foreign_key "messages", "bubbles" add_foreign_key "pops", "bubbles" add_foreign_key "pops", "users" add_foreign_key "sessions", "users" diff --git a/test/fixtures/bubble/thread/entries.yml b/test/fixtures/bubble/thread/entries.yml deleted file mode 100644 index dae8224a0..000000000 --- a/test/fixtures/bubble/thread/entries.yml +++ /dev/null @@ -1,40 +0,0 @@ -logo_1: - thread: logo - threadable: logo_initial_activity (Event::Rollup) - created_at: <%= 1.week.ago %> - -logo_2: - thread: logo - threadable: logo_agreement_jz (Comment) - created_at: <%= 2.days.ago %> - -logo_3: - thread: logo - threadable: logo_second_activity (Event::Rollup) - created_at: <%= 1.day.ago %> - -logo_4: - thread: logo - threadable: logo_agreement_kevin (Comment) - created_at: <%= 2.hours.ago %> - -logo_5: - thread: logo - threadable: logo_third_activity (Event::Rollup) - created_at: <%= 1.hour.ago %> - -layout_1: - thread: layout - threadable: layout_initial_activity (Event::Rollup) - -layout_2: - thread: layout - threadable: layout_overflowing_david (Comment) - -text_1: - thread: text - threadable: text_initial_activity (Event::Rollup) - -shipping_1: - thread: shipping - threadable: shipping_initial_activity (Event::Rollup) diff --git a/test/fixtures/bubble/threads.yml b/test/fixtures/bubble/threads.yml deleted file mode 100644 index 735fce227..000000000 --- a/test/fixtures/bubble/threads.yml +++ /dev/null @@ -1,11 +0,0 @@ -logo: - bubble: logo - -layout: - bubble: layout - -text: - bubble: text - -shipping: - bubble: shipping diff --git a/test/fixtures/event/rollups.yml b/test/fixtures/event_summaries.yml similarity index 100% rename from test/fixtures/event/rollups.yml rename to test/fixtures/event_summaries.yml diff --git a/test/fixtures/events.yml b/test/fixtures/events.yml index ec3993200..2dd93640f 100644 --- a/test/fixtures/events.yml +++ b/test/fixtures/events.yml @@ -2,14 +2,14 @@ logo_created: creator: david bubble: logo action: created - rollup: logo_initial_activity + summary: logo_initial_activity created_at: <%= 1.week.ago %> logo_assignment_jz: creator: david bubble: logo action: assigned - rollup: logo_initial_activity + summary: logo_initial_activity particulars: <%= { assignee_ids: [ ActiveRecord::FixtureSet.identify(:jz) ] }.to_json %> created_at: <%= 1.week.ago + 1.hour %> @@ -17,14 +17,14 @@ logo_boost_dhh: creator: david bubble: logo action: boosted - rollup: logo_initial_activity + summary: logo_initial_activity created_at: <%= 1.week.ago + 2.hours %> logo_assignment_km: creator: david bubble: logo action: assigned - rollup: logo_second_activity + summary: logo_second_activity particulars: <%= { assignee_ids: [ ActiveRecord::FixtureSet.identify(:kevin) ] }.to_json %> created_at: <%= 1.day.ago %> @@ -32,42 +32,42 @@ logo_boost_km1: creator: kevin bubble: logo action: boosted - rollup: logo_second_activity + summary: logo_second_activity created_at: <%= 1.day.ago + 1.hour %> logo_boost_km2: creator: kevin bubble: logo action: boosted - rollup: logo_second_activity + summary: logo_second_activity created_at: <%= 1.day.ago + 2.hours %> logo_boost_jz1: creator: jz bubble: logo action: boosted - rollup: logo_second_activity + summary: logo_second_activity created_at: <%= 1.day.ago + 3.hours %> logo_boost_jz2: creator: jz bubble: logo action: boosted - rollup: logo_third_activity + summary: logo_third_activity created_at: <%= 1.hour.ago %> layout_created: creator: david bubble: layout action: created - rollup: layout_initial_activity + summary: layout_initial_activity created_at: <%= 1.week.ago %> layout_assignment_jz: creator: david bubble: layout action: assigned - rollup: layout_initial_activity + summary: layout_initial_activity particulars: <%= { assignee_ids: [ ActiveRecord::FixtureSet.identify(:jz) ] }.to_json %> created_at: <%= 1.hour.ago %> @@ -75,12 +75,12 @@ text_created: creator: kevin bubble: text action: created - rollup: text_initial_activity + summary: text_initial_activity created_at: <%= 1.week.ago %> shipping_created: creator: kevin bubble: shipping action: created - rollup: shipping_initial_activity + summary: shipping_initial_activity created_at: <%= 1.week.ago %> diff --git a/test/fixtures/messages.yml b/test/fixtures/messages.yml new file mode 100644 index 000000000..bff5edec3 --- /dev/null +++ b/test/fixtures/messages.yml @@ -0,0 +1,40 @@ +logo_1: + bubble: logo + messageable: logo_initial_activity (EventSummary) + created_at: <%= 1.week.ago %> + +logo_2: + bubble: logo + messageable: logo_agreement_jz (Comment) + created_at: <%= 2.days.ago %> + +logo_3: + bubble: logo + messageable: logo_second_activity (EventSummary) + created_at: <%= 1.day.ago %> + +logo_4: + bubble: logo + messageable: logo_agreement_kevin (Comment) + created_at: <%= 2.hours.ago %> + +logo_5: + bubble: logo + messageable: logo_third_activity (EventSummary) + created_at: <%= 1.hour.ago %> + +layout_1: + bubble: layout + messageable: layout_initial_activity (EventSummary) + +layout_2: + bubble: layout + messageable: layout_overflowing_david (Comment) + +text_1: + bubble: text + messageable: text_initial_activity (EventSummary) + +shipping_1: + bubble: shipping + messageable: shipping_initial_activity (EventSummary)