104 lines
2.5 KiB
Ruby
104 lines
2.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DiscourseAssign
|
|
class CreateNotification
|
|
class UserAssignment
|
|
attr_reader :assignment
|
|
|
|
def initialize(assignment)
|
|
@assignment = assignment
|
|
end
|
|
|
|
def excerpt_key
|
|
"discourse_assign.topic_assigned_excerpt"
|
|
end
|
|
|
|
def notification_message
|
|
"discourse_assign.assign_notification"
|
|
end
|
|
|
|
def display_username
|
|
assignment.assigned_by_user.username
|
|
end
|
|
end
|
|
|
|
class GroupAssignment < UserAssignment
|
|
def excerpt_key
|
|
"discourse_assign.topic_group_assigned_excerpt"
|
|
end
|
|
|
|
def notification_message
|
|
"discourse_assign.assign_group_notification"
|
|
end
|
|
|
|
def display_username
|
|
assignment.assigned_to.name
|
|
end
|
|
end
|
|
|
|
def self.call(...)
|
|
new(...).call
|
|
end
|
|
|
|
attr_reader :assignment, :user, :mark_as_read, :assignment_type
|
|
alias mark_as_read? mark_as_read
|
|
|
|
delegate :topic,
|
|
:post,
|
|
:assigned_by_user,
|
|
:assigned_to,
|
|
:created_at,
|
|
:updated_at,
|
|
:assigned_to_user?,
|
|
:id,
|
|
to: :assignment,
|
|
private: true
|
|
delegate :excerpt_key,
|
|
:notification_message,
|
|
:display_username,
|
|
to: :assignment_type,
|
|
private: true
|
|
|
|
def initialize(assignment:, user:, mark_as_read:)
|
|
@assignment = assignment
|
|
@user = user
|
|
@mark_as_read = mark_as_read
|
|
@assignment_type =
|
|
"#{self.class}::#{assignment.assigned_to.class}Assignment".constantize.new(assignment)
|
|
end
|
|
|
|
def call
|
|
Assigner.publish_topic_tracking_state(topic, user.id)
|
|
unless mark_as_read?
|
|
PostAlerter.new(post).create_notification_alert(
|
|
user: user,
|
|
post: post,
|
|
username: assigned_by_user.username,
|
|
notification_type: Notification.types[:assigned],
|
|
excerpt:
|
|
I18n.t(
|
|
excerpt_key,
|
|
title: topic.title,
|
|
group: assigned_to.name,
|
|
locale: user.effective_locale,
|
|
),
|
|
)
|
|
end
|
|
user.notifications.assigned.create!(
|
|
created_at: created_at,
|
|
updated_at: updated_at,
|
|
topic: topic,
|
|
post_number: post.post_number,
|
|
high_priority: true,
|
|
read: mark_as_read?,
|
|
data: {
|
|
message: notification_message,
|
|
display_username: display_username,
|
|
topic_title: topic.title,
|
|
assignment_id: id,
|
|
}.to_json,
|
|
)
|
|
end
|
|
end
|
|
end
|