require_dependency 'email/sender' class ::TopicAssigner def self.unassign_all(user, assigned_by) topic_ids = TopicCustomField.where(name: 'assigned_to_id', value: user.id).pluck(:topic_id) # Fast path: by doing this we can instantly refresh for the user showing no assigned topics # while doing the "full" removal asynchronously. TopicCustomField.where( name: ['assigned_to_id', 'assigned_by_id'], topic_id: topic_ids ).delete_all Jobs.enqueue( :unassign_bulk, user_id: user.id, assigned_by_id: assigned_by.id, topic_ids: topic_ids ) end def self.backfill_auto_assign staff_mention = User.where('moderator OR admin') .pluck('username') .map { |name| "p.cooked ILIKE '%mention%@#{name}%'" } .join(' OR ') sql = < assign_to.username } ) unless @assigned_by.id == assign_to.id Notification.create!( notification_type: Notification.types[:custom], user_id: assign_to.id, topic_id: @topic.id, post_number: 1, data: { message: 'discourse_assign.assign_notification', display_username: @assigned_by.username, topic_title: @topic.title }.to_json ) end end true end def unassign(silent: false) if assigned_to_id = @topic.custom_fields["assigned_to_id"] @topic.custom_fields["assigned_to_id"] = nil @topic.custom_fields["assigned_by_id"] = nil @topic.save! post = @topic.posts.where(post_number: 1).first return unless post.present? post.publish_change_to_clients!(:revised, reload_topic: true) assigned_user = User.find_by(id: assigned_to_id) MessageBus.publish( "/staff/topic-assignment", { type: 'unassigned', topic_id: @topic.id, }, user_ids: staff_ids ) publish_topic_tracking_state(@topic, assigned_user.id) UserAction.where( action_type: UserAction::ASSIGNED, target_post_id: post.id ).destroy_all # yank notification Notification.where( notification_type: Notification.types[:custom], user_id: assigned_user.try(:id), topic_id: @topic.id, post_number: 1 ).where("data like '%discourse_assign.assign_notification%'").destroy_all if SiteSetting.unassign_creates_tracking_post && !silent post_type = SiteSetting.assigns_public ? Post.types[:small_action] : Post.types[:whisper] @topic.add_moderator_post( @assigned_by, nil, bump: false, post_type: post_type, custom_fields: { "action_code_who" => assigned_user&.username }, action_code: "unassigned" ) end end end private def publish_topic_tracking_state(topic, user_id) if topic.private_message? MessageBus.publish( "/private-messages/assigned", { topic_id: topic.id }, user_ids: [user_id] ) end end end