FEATURE: Add live updates for "assigned" private messages.

This commit is contained in:
Guo Xiang Tan 2018-03-07 16:58:56 +08:00
parent 13cb64b89c
commit 463f77bb2a
6 changed files with 133 additions and 21 deletions

View File

@ -1,6 +1,6 @@
import createPMRoute from "discourse/routes/build-private-messages-route";
export default createPMRoute('assigned_archived', 'private-messages-assigned').extend({
export default createPMRoute('assigned_archived', 'private-messages-assigned', 'assigned/archive').extend({
model() {
return this.store.findFiltered("topicList", {
filter: `topics/private-messages-assigned/${this.modelFor("user").get("username_lower")}`,

View File

@ -1,3 +1,3 @@
import createPMRoute from "discourse/routes/build-private-messages-route";
export default createPMRoute('assigned', 'private-messages-assigned');
export default createPMRoute('assigned', 'private-messages-assigned', 'assigned');

View File

@ -112,6 +112,8 @@ SQL
user_ids: staff_ids
)
publish_topic_tracking_state(@topic, assign_to.id)
if SiteSetting.assign_mailer_enabled
if !@topic.muted?(assign_to)
message = AssignMailer.send_assignment(assign_to.email, @topic, @assigned_by)
@ -177,6 +179,8 @@ SQL
user_ids: staff_ids
)
publish_topic_tracking_state(@topic, assigned_user.id)
UserAction.where(
action_type: UserAction::ASSIGNED,
target_post_id: post.id
@ -202,4 +206,16 @@ SQL
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

View File

@ -216,30 +216,51 @@ after_initialize do
end
end
add_class_method(:topic_tracking_state, :publish_assigned_private_message) do |topic, user_id|
return unless topic.private_message?
assigned_channel = "/private-messages/assigned"
[assigned_channel, "#{assigned_channel}/archive"].each do |channel|
MessageBus.publish(
channel,
{ topic_id: topic.id },
user_ids: [user_id]
)
end
end
on(:move_to_inbox) do |info|
if SiteSetting.unassign_on_group_archive && info[:group]
if topic = info[:topic]
if user_id = topic.custom_fields["prev_assigned_to_id"]
if user = User.find_by(id: user_id.to_i)
assigner = TopicAssigner.new(topic, Discourse.system_user)
assigner.assign(user, silent: true)
end
end
end
topic = info[:topic]
if (assigned_id = topic.custom_fields["assigned_to_id"].to_i) == info[:user]&.id
TopicTrackingState.publish_assigned_private_message(topic, assigned_id)
end
if SiteSetting.unassign_on_group_archive && info[:group] &&
user_id = topic.custom_fields["prev_assigned_to_id"].to_i &&
previous_user = User.find_by(id: user_id)
assigner = TopicAssigner.new(topic, Discourse.system_user)
assigner.assign(previous_user, silent: true)
end
end
on(:archive_message) do |info|
if SiteSetting.unassign_on_group_archive && info[:group]
topic = info[:topic]
if user_id = topic.custom_fields["assigned_to_id"]
if user = User.find_by(id: user_id.to_i)
topic.custom_fields["prev_assigned_to_id"] = user.id
topic.save
assigner = TopicAssigner.new(topic, Discourse.system_user)
assigner.unassign(silent: true)
end
end
topic = info[:topic]
user_id = topic.custom_fields["assigned_to_id"].to_i
if user_id == info[:user]&.id
TopicTrackingState.publish_assigned_private_message(topic, user_id)
end
if SiteSetting.unassign_on_group_archive && info[:group] &&
user_id && assigned_user = User.find_by(id: user_id)
topic.custom_fields["prev_assigned_to_id"] = assigned_user.id
topic.save!
assigner = TopicAssigner.new(topic, Discourse.system_user)
assigner.unassign(silent: true)
end
end

View File

@ -1,6 +1,10 @@
require 'rails_helper'
describe 'integration tests' do
before do
SiteSetting.assign_enabled = true
end
it 'preloads data in topic list' do
admin = Fabricate(:admin)
post = create_post
@ -8,4 +12,50 @@ describe 'integration tests' do
TopicList.preload([post.topic], list)
# should not explode for now
end
describe 'for a private message' do
let(:post) { Fabricate(:private_message_post) }
let(:pm) { post.topic }
let(:user) { pm.allowed_users.first }
let(:user2) { pm.allowed_users.last }
let(:channels) do
[
"/private-messages/assigned",
"/private-messages/assigned/archive"
]
end
def assert_publish_topic_state(topic, user)
messages = MessageBus.track_publish do
yield
end
channels.each do |channel|
message = messages.find { |message| message.channel == channel }
expect(message.data[:topic_id]).to eq(topic.id)
expect(message.user_ids).to eq([user.id])
end
end
it 'publishes the right message on archive and move to inbox' do
assigner = TopicAssigner.new(pm, user)
assigner.assign(user)
assert_publish_topic_state(pm, user) do
UserArchivedMessage.archive!(user.id, pm.reload)
end
assert_publish_topic_state(pm, user) do
UserArchivedMessage.move_to_inbox!(user.id, pm.reload)
end
messages = MessageBus.track_publish do
UserArchivedMessage.archive!(user2.id, pm.reload)
end
expect(channels - messages.map(&:channel)).to eq(channels)
end
end
end

View File

@ -0,0 +1,25 @@
require 'rails_helper'
RSpec.describe TopicAssigner do
let(:pm_post) { Fabricate(:private_message_post) }
let(:pm) { pm_post.topic }
def assert_publish_topic_state(topic, user)
message = MessageBus.track_publish("/private-messages/assigned") do
yield
end.first
expect(message.data[:topic_id]).to eq(topic.id)
expect(message.user_ids).to eq([user.id])
end
describe 'assigning and unassigning private message' do
it 'should publish the right message' do
user = pm.allowed_users.first
assigner = described_class.new(pm, user)
assert_publish_topic_state(pm, user) { assigner.assign(user) }
assert_publish_topic_state(pm, user) { assigner.unassign }
end
end
end