123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class Mention < ApplicationModel
- include HasDefaultModelUserRelations
- include ChecksClientNotification
- include HasHistory
- include Mention::Assets
- after_create :update_mentionable
- after_destroy :update_mentionable
- belongs_to :user, class_name: 'User'
- belongs_to :mentionable, polymorphic: true
- association_attributes_ignored :created_by, :updated_by
- client_notification_events_ignored :update, :touch
- validates_with Validations::MentionValidator
- def notify_clients_data_attributes
- super.merge(
- 'mentionable_id' => mentionable_id,
- 'mentionable_type' => mentionable_type,
- )
- end
- def history_log_attributes
- {
- related_o_id: mentionable_id,
- related_history_object: mentionable_type,
- value_to: user.id,
- }
- end
- def history_destroy
- history_log('removed', created_by_id)
- end
- def self.duplicates(mentionable1, mentionable2)
- Mention.joins(', mentions as mentionsb').where('
- mentions.user_id = mentionsb.user_id
- AND mentions.mentionable_type = ?
- AND mentions.mentionable_id = ?
- AND mentionsb.mentionable_type = ?
- AND mentionsb.mentionable_id = ?
- ', mentionable1.class.to_s, mentionable1.id, mentionable2.class.to_s, mentionable2.id)
- end
- def update_mentionable
- # make sure mentionable is touched even if updated_by value stays the same
- mentionable.update(updated_by: updated_by, updated_at: Time.current)
- end
- # Check if user is subscribed to given object
- # @param target to check against
- # @param user
- # @return Boolean
- def self.subscribed?(object, user)
- object.mentions.exists? user: user
- end
- # Subscribe a user to changes of an object
- # @param target to subscribe to
- # @param user
- # @return Boolean
- def self.subscribe!(object, user)
- object.mentions.create!(user: user) if !subscribed?(object, user)
- true
- end
- # Unsubscribe a user from changes of an object
- # @param target to unsubscribe from
- # @param user
- # @return Boolean
- def self.unsubscribe!(object, user)
- object
- .mentions
- .find_by(user: user)
- &.destroy!
- true
- end
- # Unsubscribe all users from changes of an object
- # @param target to unsubscribe from
- # @return Boolean
- def self.unsubscribe_all!(object)
- object.mentions.destroy_all
- end
- # Check if given user is able to subscribe to a given object
- # @param object to subscribe to
- # @param mentioned user
- # @return Boolean
- def self.mentionable?(object, user)
- case object
- when Ticket
- TicketPolicy.new(user, object).agent_read_access?
- else
- false
- end
- end
- end
|