diff --git a/app/models/relationships/mute.rb b/app/models/relationships/mute.rb new file mode 100644 index 00000000..c443b353 --- /dev/null +++ b/app/models/relationships/mute.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class Relationships::Mute < Relationship +end diff --git a/app/models/user.rb b/app/models/user.rb index f8958567..c60bce36 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -4,6 +4,7 @@ class User < ApplicationRecord include User::Relationship include User::Relationship::Follow include User::Relationship::Block + include User::Relationship::Mute include User::AnswerMethods include User::BanMethods include User::InboxMethods diff --git a/app/models/user/relationship/mute.rb b/app/models/user/relationship/mute.rb new file mode 100644 index 00000000..51ec7c11 --- /dev/null +++ b/app/models/user/relationship/mute.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require "errors" + +class User + module Relationship + module Mute + extend ActiveSupport::Concern + + included do + has_many :active_mute_relationships, class_name: "Relationships::Mute", + foreign_key: "source_id", + dependent: :destroy + has_many :passive_mute_relationships, class_name: "Relationships::Mute", + foreign_key: "target_id", + dependent: :destroy + has_many :muted_users, through: :active_mute_relationships, source: :target + has_many :muted_by_users, through: :passive_mute_relationships, source: :source + end + + def mute(target_user) + raise Errors::MutingSelf if target_user == self + + create_relationship(active_mute_relationships, target_user) + end + + def unmute(target_user) + destroy_relationship(active_mute_relationships, target_user) + end + + def muting?(target_user) + relationship_active?(muted_users, target_user) + end + end + end +end diff --git a/lib/errors.rb b/lib/errors.rb index b968f889..314ed4bc 100644 --- a/lib/errors.rb +++ b/lib/errors.rb @@ -119,4 +119,7 @@ module Errors end end # endregion + + class MutingSelf < SelfAction + end end