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 @@
+
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 %>
-
-<% 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)