From 7a37ea6c985728cca0798486d2c70097f375a41b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 8 Aug 2025 10:11:34 -0400 Subject: [PATCH] Clean up announcements/mutes/reactions associations --- app/models/announcement.rb | 6 ++++-- app/models/announcement_mute.rb | 6 ++++-- app/models/announcement_reaction.rb | 7 +++++-- app/models/concerns/account/associations.rb | 2 ++ app/models/concerns/account/interactions.rb | 1 - spec/models/announcement_mute_spec.rb | 16 ++++++++++++++++ spec/models/announcement_reaction_spec.rb | 2 +- spec/models/announcement_spec.rb | 5 +++++ 8 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 spec/models/announcement_mute_spec.rb diff --git a/app/models/announcement.rb b/app/models/announcement.rb index aab55055a96..8e23eb5c128 100644 --- a/app/models/announcement.rb +++ b/app/models/announcement.rb @@ -24,8 +24,10 @@ class Announcement < ApplicationRecord scope :chronological, -> { order(coalesced_chronology_timestamps.asc) } scope :reverse_chronological, -> { order(coalesced_chronology_timestamps.desc) } - has_many :announcement_mutes, dependent: :destroy - has_many :announcement_reactions, dependent: :destroy + with_options dependent: :destroy, inverse_of: :announcement do + has_many :announcement_mutes + has_many :announcement_reactions + end validates :text, presence: true validates :starts_at, presence: true, if: :ends_at? diff --git a/app/models/announcement_mute.rb b/app/models/announcement_mute.rb index 0f34a6a4dc2..3f4b3824d40 100644 --- a/app/models/announcement_mute.rb +++ b/app/models/announcement_mute.rb @@ -12,8 +12,10 @@ # class AnnouncementMute < ApplicationRecord - belongs_to :account - belongs_to :announcement, inverse_of: :announcement_mutes + with_options inverse_of: :announcement_mutes do + belongs_to :account + belongs_to :announcement + end validates :account_id, uniqueness: { scope: :announcement_id } end diff --git a/app/models/announcement_reaction.rb b/app/models/announcement_reaction.rb index 855dfc9e3a6..ef0761ff88f 100644 --- a/app/models/announcement_reaction.rb +++ b/app/models/announcement_reaction.rb @@ -17,8 +17,11 @@ class AnnouncementReaction < ApplicationRecord before_validation :set_custom_emoji, if: :name? after_commit :queue_publish - belongs_to :account - belongs_to :announcement, inverse_of: :announcement_reactions + with_options inverse_of: :announcement_reactions do + belongs_to :account + belongs_to :announcement + end + belongs_to :custom_emoji, optional: true validates :name, presence: true diff --git a/app/models/concerns/account/associations.rb b/app/models/concerns/account/associations.rb index 62c55da5de1..8d72be1075a 100644 --- a/app/models/concerns/account/associations.rb +++ b/app/models/concerns/account/associations.rb @@ -12,6 +12,8 @@ module Account::Associations has_many :account_pins has_many :account_warnings has_many :aliases, class_name: 'AccountAlias' + has_many :announcement_mutes + has_many :announcement_reactions has_many :bookmarks has_many :conversations, class_name: 'AccountConversation' has_many :custom_filters diff --git a/app/models/concerns/account/interactions.rb b/app/models/concerns/account/interactions.rb index 4eab55ca3e6..996cba71cb3 100644 --- a/app/models/concerns/account/interactions.rb +++ b/app/models/concerns/account/interactions.rb @@ -43,7 +43,6 @@ module Account::Interactions has_many :muted_by, -> { order(mutes: { id: :desc }) }, through: :muted_by_relationships, source: :account has_many :conversation_mutes, dependent: :destroy has_many :domain_blocks, class_name: 'AccountDomainBlock', dependent: :destroy - has_many :announcement_mutes, dependent: :destroy end def follow!(other_account, reblogs: nil, notify: nil, languages: nil, uri: nil, rate_limit: false, bypass_limit: false) diff --git a/spec/models/announcement_mute_spec.rb b/spec/models/announcement_mute_spec.rb new file mode 100644 index 00000000000..7ba7b87c4ef --- /dev/null +++ b/spec/models/announcement_mute_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnouncementMute do + describe 'Associations' do + it { is_expected.to belong_to(:account).inverse_of(:announcement_mutes) } + it { is_expected.to belong_to(:announcement).inverse_of(:announcement_mutes) } + end + + describe 'Validations' do + subject { Fabricate.build :announcement_mute } + + it { is_expected.to validate_uniqueness_of(:account_id).scoped_to(:announcement_id) } + end +end diff --git a/spec/models/announcement_reaction_spec.rb b/spec/models/announcement_reaction_spec.rb index e02a8dcd069..55d44dcf90b 100644 --- a/spec/models/announcement_reaction_spec.rb +++ b/spec/models/announcement_reaction_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' RSpec.describe AnnouncementReaction do describe 'Associations' do - it { is_expected.to belong_to(:account) } + it { is_expected.to belong_to(:account).inverse_of(:announcement_reactions) } it { is_expected.to belong_to(:announcement).inverse_of(:announcement_reactions) } it { is_expected.to belong_to(:custom_emoji).optional } end diff --git a/spec/models/announcement_spec.rb b/spec/models/announcement_spec.rb index 884b352cb5a..cbacf2cff3e 100644 --- a/spec/models/announcement_spec.rb +++ b/spec/models/announcement_spec.rb @@ -3,6 +3,11 @@ require 'rails_helper' RSpec.describe Announcement do + describe 'Associations' do + it { is_expected.to have_many(:announcement_mutes).inverse_of(:announcement).dependent(:destroy) } + it { is_expected.to have_many(:announcement_reactions).inverse_of(:announcement).dependent(:destroy) } + end + describe 'Scopes' do context 'with published and unpublished records' do let!(:published) { Fabricate(:announcement, published: true) }