FIX: incoming and outgoing emails got lost when post was moved

This commit is contained in:
Gerhard Schlager 2017-11-24 11:13:19 +01:00
parent 44333c5de3
commit b3094e9954
2 changed files with 75 additions and 0 deletions

View File

@ -92,10 +92,16 @@ class PostMover
raw: post.raw, raw: post.raw,
topic_id: destination_topic.id, topic_id: destination_topic.id,
acting_user: user, acting_user: user,
cook_method: post.cook_method,
via_email: post.via_email,
raw_email: post.raw_email,
skip_validations: true, skip_validations: true,
guardian: Guardian.new(user) guardian: Guardian.new(user)
) )
move_incoming_emails(post, new_post)
move_email_logs(post, new_post)
PostAction.copy(post, new_post) PostAction.copy(post, new_post)
new_post.update_column(:reply_count, @reply_count[1] || 0) new_post.update_column(:reply_count, @reply_count[1] || 0)
new_post.custom_fields = post.custom_fields new_post.custom_fields = post.custom_fields
@ -123,12 +129,29 @@ class PostMover
post.update(update) post.update(update)
move_incoming_emails(post, post)
move_email_logs(post, post)
DiscourseEvent.trigger(:post_moved, post, original_topic.id) DiscourseEvent.trigger(:post_moved, post, original_topic.id)
# Move any links from the post to the new topic # Move any links from the post to the new topic
post.topic_links.update_all(topic_id: destination_topic.id) post.topic_links.update_all(topic_id: destination_topic.id)
end end
def move_incoming_emails(old_post, new_post)
return if old_post.incoming_email.nil?
email = old_post.incoming_email
email.update_columns(topic_id: new_post.topic_id, post_id: new_post.id)
new_post.incoming_email = email
end
def move_email_logs(old_post, new_post)
EmailLog
.where(post_id: old_post.id)
.update_all(topic_id: new_post.topic_id, post_id: new_post.id)
end
def update_statistics def update_statistics
destination_topic.update_statistics destination_topic.update_statistics
original_topic.update_statistics original_topic.update_statistics

View File

@ -334,6 +334,49 @@ describe PostMover do
end end
end end
shared_examples "moves email related stuff" do
it "moves incoming email" do
Fabricate(:incoming_email, user: old_post.user, topic: old_post.topic, post: old_post)
new_topic = topic.move_posts(user, [old_post.id], title: "new testing topic name")
new_post = new_topic.first_post
email = new_post.incoming_email
expect(email).to be_present
expect(email.topic_id).to eq(new_topic.id)
expect(email.post_id).to eq(new_post.id)
expect(old_post.reload.incoming_email).to_not be_present unless old_post.id == new_post.id
end
it "moves email log entries" do
old_topic = old_post.topic
Fabricate(:email_log, user: old_post.user, topic: old_topic, post: old_post, email_type: :mailing_list)
Fabricate(:email_log, user: old_post.user, topic: old_topic, post: old_post, email_type: :mailing_list)
Fabricate(:email_log, user: old_post.user, post: old_post, email_type: :mailing_list)
expect(EmailLog.where(topic_id: old_topic.id, post_id: old_post.id).count).to eq(2)
expect(EmailLog.where(topic_id: nil, post_id: old_post.id).count).to eq(1)
new_topic = old_topic.move_posts(user, [old_post.id], title: "new testing topic name")
new_post = new_topic.first_post
expect(EmailLog.where(topic_id: old_topic.id, post_id: old_post.id).count).to eq(0)
expect(EmailLog.where(topic_id: new_topic.id, post_id: new_post.id).count).to eq(3)
end
it "preserves post attributes" do
old_post.update_columns(cook_method: Post.cook_methods[:email], via_email: true, raw_email: "raw email content")
new_topic = old_post.topic.move_posts(user, [old_post.id], title: "new testing topic name")
new_post = new_topic.first_post
expect(new_post.cook_method).to eq(Post.cook_methods[:email])
expect(new_post.via_email).to eq(true)
expect(new_post.raw_email).to eq("raw email content")
end
end
context "moving the first post" do context "moving the first post" do
it "copies the OP, doesn't delete it" do it "copies the OP, doesn't delete it" do
@ -390,6 +433,15 @@ describe PostMover do
expect(new_topic.first_post.custom_fields).to eq(custom_fields) expect(new_topic.first_post.custom_fields).to eq(custom_fields)
end end
include_examples "moves email related stuff" do
let!(:old_post) { p1 }
end
end
context "moving replies" do
include_examples "moves email related stuff" do
let!(:old_post) { p3 }
end
end end
context "to an existing topic with a deleted post" do context "to an existing topic with a deleted post" do