From edcc9e32791f9bcffd3449c0461742db182225ea Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Wed, 23 Apr 2025 12:38:06 +0200 Subject: [PATCH] Add mentionees as watchers --- app/models/card.rb | 6 ++++++ app/models/card/watchable.rb | 6 ++++-- app/models/collection/accessible.rb | 4 ++++ app/models/comment.rb | 2 ++ app/models/mention.rb | 7 +++++++ app/models/notifier/event.rb | 18 ++++++++++++++++-- app/models/user/accessor.rb | 4 ++++ 7 files changed, 43 insertions(+), 4 deletions(-) diff --git a/app/models/card.rb b/app/models/card.rb index 57ff542da..93eec061c 100644 --- a/app/models/card.rb +++ b/app/models/card.rb @@ -23,6 +23,8 @@ class Card < ApplicationRecord end end + delegate :accessible_to?, to: :collection + def title=(new_title) self[:title] = new_title.presence || "Untitled" end @@ -30,4 +32,8 @@ class Card < ApplicationRecord def cache_key [ super, collection.name ].compact.join("/") end + + def was_mentioned(mention) + watch_by(mention.mentionee) + end end diff --git a/app/models/card/watchable.rb b/app/models/card/watchable.rb index f511ddc7e..94e5e27d9 100644 --- a/app/models/card/watchable.rb +++ b/app/models/card/watchable.rb @@ -13,7 +13,9 @@ module Card::Watchable end def watch_by(user) - watches.where(user: user).first_or_create.update!(watching: true) + if accessible_to?(user) + watches.where(user: user).first_or_create.update!(watching: true) + end end def unwatch_by(user) @@ -21,7 +23,7 @@ module Card::Watchable end def watchers_and_subscribers(include_only_watching: false) - involvements = include_only_watching ? [ :watching, :everything ] : :everything + involvements = include_only_watching ? [:watching, :everything] : :everything subscribers = collection.users.where(accesses: { involvement: involvements }) User.where(id: subscribers.pluck(:id) + diff --git a/app/models/collection/accessible.rb b/app/models/collection/accessible.rb index fc99cc217..1436a4d1b 100644 --- a/app/models/collection/accessible.rb +++ b/app/models/collection/accessible.rb @@ -32,6 +32,10 @@ module Collection::Accessible accesses.find_by(user: user) end + def accessible_to?(user) + access_for(user).present? + end + private def grant_access_to_everyone accesses.grant_to(User.all) if all_access_previously_changed?(to: true) diff --git a/app/models/comment.rb b/app/models/comment.rb index 630589e41..9b3fd2704 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -13,6 +13,8 @@ class Comment < ApplicationRecord after_create_commit :watch_card_by_creator, :track_commented_card after_destroy_commit :cleanup_events + delegate :watch_by, to: :card + def to_partial_path "cards/#{super}" end diff --git a/app/models/mention.rb b/app/models/mention.rb index fd70e075a..2534eb631 100644 --- a/app/models/mention.rb +++ b/app/models/mention.rb @@ -5,7 +5,14 @@ class Mention < ApplicationRecord belongs_to :mentioner, class_name: "User" belongs_to :mentionee, class_name: "User", inverse_of: :mentions + after_create :add_mentionee_as_watcher + def self_mention? mentioner == mentionee end + + private + def add_mentionee_as_watcher + container.watch_by(mentionee) + end end diff --git a/app/models/notifier/event.rb b/app/models/notifier/event.rb index 0893cb7e5..7374763e2 100644 --- a/app/models/notifier/event.rb +++ b/app/models/notifier/event.rb @@ -1,5 +1,6 @@ class Notifier::Event < Notifier delegate :card, :creator, to: :source + delegate :watchers_and_subscribers, to: :card private def resource @@ -15,9 +16,22 @@ class Notifier::Event < Notifier when "assigned" source.assignees.excluding(card.collection.access_only_users) when "published" - card.watchers_and_subscribers(include_only_watching: true).without(creator) + watchers_and_subscribers(include_only_watching: true).without(creator, *mentionees) + when "commented" + watchers_and_subscribers.without(creator, *mentionees) else - card.watchers_and_subscribers.without(creator) + watchers_and_subscribers.without(creator) + end + end + + def mentionees + case source.action + when "published" + source.card.mentionees + when "commented" + source.comment.mentionees + else + [] end end end diff --git a/app/models/user/accessor.rb b/app/models/user/accessor.rb index 89534b777..ebf5dde59 100644 --- a/app/models/user/accessor.rb +++ b/app/models/user/accessor.rb @@ -9,6 +9,10 @@ module User::Accessor after_create_commit :grant_access_to_collections end + def can_access_card?(card) + card.collection.accessible_to?(self) + end + private def grant_access_to_collections Access.insert_all Collection.all_access.pluck(:id).collect { |collection_id| { collection_id: collection_id, user_id: id } }