mirror of
https://github.com/discourse/discourse.git
synced 2024-12-20 06:53:49 +08:00
FIX: When moving first posts between topics, ensure only relevant timings are moved (#30217)
This commit is contained in:
parent
c97d1d7c59
commit
28a1463baf
|
@ -461,7 +461,7 @@ class PostMover
|
||||||
|
|
||||||
# copy post_timings for shifted posts to a temp table using the new_post_number
|
# copy post_timings for shifted posts to a temp table using the new_post_number
|
||||||
# they'll be copied back after delete_invalid_post_timings makes room for them
|
# they'll be copied back after delete_invalid_post_timings makes room for them
|
||||||
DB.exec <<~SQL
|
DB.exec(<<~SQL, post_ids: @post_ids_after_move)
|
||||||
CREATE TEMPORARY TABLE temp_post_timings ON COMMIT DROP
|
CREATE TEMPORARY TABLE temp_post_timings ON COMMIT DROP
|
||||||
AS (
|
AS (
|
||||||
SELECT pt.topic_id, mp.new_post_number as post_number, pt.user_id, pt.msecs
|
SELECT pt.topic_id, mp.new_post_number as post_number, pt.user_id, pt.msecs
|
||||||
|
@ -477,17 +477,18 @@ class PostMover
|
||||||
def copy_shifted_post_timings_from_temp
|
def copy_shifted_post_timings_from_temp
|
||||||
DB.exec <<~SQL
|
DB.exec <<~SQL
|
||||||
INSERT INTO post_timings (topic_id, user_id, post_number, msecs)
|
INSERT INTO post_timings (topic_id, user_id, post_number, msecs)
|
||||||
SELECT topic_id, user_id, post_number, msecs FROM temp_post_timings
|
SELECT DISTINCT topic_id, user_id, post_number, msecs FROM temp_post_timings
|
||||||
SQL
|
SQL
|
||||||
end
|
end
|
||||||
|
|
||||||
def copy_first_post_timings
|
def copy_first_post_timings
|
||||||
DB.exec <<~SQL
|
DB.exec(<<~SQL, post_ids: @post_ids_after_move)
|
||||||
INSERT INTO post_timings (topic_id, user_id, post_number, msecs)
|
INSERT INTO post_timings (topic_id, user_id, post_number, msecs)
|
||||||
SELECT mp.new_topic_id, pt.user_id, mp.new_post_number, pt.msecs
|
SELECT mp.new_topic_id, pt.user_id, mp.new_post_number, pt.msecs
|
||||||
FROM post_timings pt
|
FROM post_timings pt
|
||||||
JOIN moved_posts mp ON (pt.topic_id = mp.old_topic_id AND pt.post_number = mp.old_post_number)
|
JOIN moved_posts mp ON (pt.topic_id = mp.old_topic_id AND pt.post_number = mp.old_post_number)
|
||||||
WHERE mp.old_post_id <> mp.new_post_id
|
WHERE mp.old_post_id <> mp.new_post_id
|
||||||
|
AND mp.old_post_id IN (:post_ids)
|
||||||
ON CONFLICT (topic_id, post_number, user_id) DO UPDATE
|
ON CONFLICT (topic_id, post_number, user_id) DO UPDATE
|
||||||
SET msecs = GREATEST(post_timings.msecs, excluded.msecs)
|
SET msecs = GREATEST(post_timings.msecs, excluded.msecs)
|
||||||
SQL
|
SQL
|
||||||
|
@ -504,9 +505,7 @@ class PostMover
|
||||||
end
|
end
|
||||||
|
|
||||||
def move_post_timings
|
def move_post_timings
|
||||||
params = { post_ids: @post_ids_after_move }
|
DB.exec(<<~SQL, post_ids: @post_ids_after_move)
|
||||||
|
|
||||||
DB.exec(<<~SQL, params)
|
|
||||||
UPDATE post_timings pt
|
UPDATE post_timings pt
|
||||||
SET topic_id = mp.new_topic_id,
|
SET topic_id = mp.new_topic_id,
|
||||||
post_number = mp.new_post_number
|
post_number = mp.new_post_number
|
||||||
|
|
|
@ -2008,18 +2008,18 @@ RSpec.describe PostMover do
|
||||||
it "allows moving posts from multiple topics into one existing topic" do
|
it "allows moving posts from multiple topics into one existing topic" do
|
||||||
dest_topic = Fabricate(:topic, user: user, created_at: 5.hours.ago)
|
dest_topic = Fabricate(:topic, user: user, created_at: 5.hours.ago)
|
||||||
Fabricate(:post, topic: dest_topic, created_at: 5.hours.ago)
|
Fabricate(:post, topic: dest_topic, created_at: 5.hours.ago)
|
||||||
create_post_timing(dest_topic.first_post, user, 500)
|
create_post_timing(dest_topic.first_post, user, 100)
|
||||||
|
|
||||||
source_1_topic = Fabricate(:topic, user: user, created_at: 4.hours.ago)
|
source_1_topic = Fabricate(:topic, user: user, created_at: 4.hours.ago)
|
||||||
Fabricate(:post, topic: source_1_topic, user: user, created_at: 4.hours.ago)
|
Fabricate(:post, topic: source_1_topic, user: user, created_at: 4.hours.ago)
|
||||||
create_post_timing(source_1_topic.first_post, user, 500)
|
create_post_timing(source_1_topic.first_post, user, 200)
|
||||||
source_1_post =
|
source_1_post =
|
||||||
Fabricate(:post, topic: source_1_topic, user: user, created_at: 3.hours.ago)
|
Fabricate(:post, topic: source_1_topic, user: user, created_at: 3.hours.ago)
|
||||||
create_post_timing(source_1_topic.posts.second, user, 500)
|
create_post_timing(source_1_topic.posts.second, user, 300)
|
||||||
|
|
||||||
source_2_topic = Fabricate(:topic, user: user, created_at: 2.hours.ago)
|
source_2_topic = Fabricate(:topic, user: user, created_at: 2.hours.ago)
|
||||||
Fabricate(:post, topic: source_2_topic, user: user, created_at: 2.hours.ago)
|
Fabricate(:post, topic: source_2_topic, user: user, created_at: 2.hours.ago)
|
||||||
create_post_timing(source_2_topic.first_post, user, 500)
|
create_post_timing(source_2_topic.first_post, user, 400)
|
||||||
source_2_post =
|
source_2_post =
|
||||||
Fabricate(:post, topic: source_2_topic, user: user, created_at: 1.hours.ago)
|
Fabricate(:post, topic: source_2_topic, user: user, created_at: 1.hours.ago)
|
||||||
create_post_timing(source_2_topic.posts.second, user, 500)
|
create_post_timing(source_2_topic.posts.second, user, 500)
|
||||||
|
@ -2044,6 +2044,78 @@ RSpec.describe PostMover do
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(moved_to_too).to be_present
|
expect(moved_to_too).to be_present
|
||||||
|
|
||||||
|
expect(
|
||||||
|
PostTiming.where(topic_id: dest_topic.id).pluck(:post_number, :msecs),
|
||||||
|
).to contain_exactly([1, 100], [2, 300], [3, 500])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "handles moving two older first posts into a newer destination" do
|
||||||
|
source_1_topic = Fabricate(:topic, user: user, created_at: 5.hours.ago)
|
||||||
|
Fabricate(:post, topic: source_1_topic, user: user, created_at: 5.hours.ago)
|
||||||
|
create_post_timing(source_1_topic.first_post, user, 500)
|
||||||
|
|
||||||
|
source_2_topic = Fabricate(:topic, user: user, created_at: 3.hours.ago)
|
||||||
|
Fabricate(:post, topic: source_2_topic, user: user, created_at: 3.hours.ago)
|
||||||
|
create_post_timing(source_2_topic.first_post, user, 500)
|
||||||
|
|
||||||
|
dest_topic = Fabricate(:topic, user: user, created_at: 2.hours.ago)
|
||||||
|
Fabricate(:post, topic: dest_topic, created_at: 2.hours.ago)
|
||||||
|
create_post_timing(dest_topic.first_post, user, 500)
|
||||||
|
|
||||||
|
moved_to =
|
||||||
|
source_2_topic.move_posts(
|
||||||
|
user,
|
||||||
|
[source_2_topic.first_post.id],
|
||||||
|
destination_topic_id: dest_topic.id,
|
||||||
|
chronological_order: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(moved_to).to be_present
|
||||||
|
|
||||||
|
moved_to_too =
|
||||||
|
source_1_topic.move_posts(
|
||||||
|
user,
|
||||||
|
[source_1_topic.first_post.id],
|
||||||
|
destination_topic_id: dest_topic.id,
|
||||||
|
chronological_order: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(moved_to_too).to be_present
|
||||||
|
end
|
||||||
|
|
||||||
|
it "handles moving an older second post, then the first post, into a newer destination" do
|
||||||
|
source_1_topic = Fabricate(:topic, user: user, created_at: 5.hours.ago)
|
||||||
|
Fabricate(:post, topic: source_1_topic, user: user, created_at: 5.hours.ago)
|
||||||
|
create_post_timing(source_1_topic.first_post, user, 400)
|
||||||
|
|
||||||
|
source_1_post =
|
||||||
|
Fabricate(:post, topic: source_1_topic, user: user, created_at: 4.hours.ago)
|
||||||
|
create_post_timing(source_1_post, user, 500)
|
||||||
|
|
||||||
|
dest_topic = dest_topic = Fabricate(:topic, user: user, created_at: 3.hours.ago)
|
||||||
|
Fabricate(:post, topic: dest_topic, created_at: 3.hours.ago)
|
||||||
|
create_post_timing(dest_topic.first_post, user, 600)
|
||||||
|
|
||||||
|
moved_to =
|
||||||
|
source_1_topic.move_posts(
|
||||||
|
user,
|
||||||
|
[source_1_post.id],
|
||||||
|
destination_topic_id: dest_topic.id,
|
||||||
|
chronological_order: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(moved_to).to be_present
|
||||||
|
|
||||||
|
moved_to_too =
|
||||||
|
source_1_topic.move_posts(
|
||||||
|
user,
|
||||||
|
[source_1_topic.first_post.id],
|
||||||
|
destination_topic_id: dest_topic.id,
|
||||||
|
chronological_order: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(moved_to_too).to be_present
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with read state and other stats per user" do
|
context "with read state and other stats per user" do
|
||||||
|
|
Loading…
Reference in New Issue
Block a user