mirror of
https://github.com/discourse/discourse.git
synced 2025-05-24 03:36:18 +08:00
FIX: Constraint error when inserting the same topic group twice
If that happens, update the value instead of raising an error.
This commit is contained in:
@ -41,14 +41,19 @@ class TopicGroup < ActiveRecord::Base
|
|||||||
query = <<~SQL
|
query = <<~SQL
|
||||||
INSERT INTO topic_groups (topic_id, group_id, last_read_post_number, created_at, updated_at)
|
INSERT INTO topic_groups (topic_id, group_id, last_read_post_number, created_at, updated_at)
|
||||||
SELECT tag.topic_id, tag.group_id, :post_number, :now, :now
|
SELECT tag.topic_id, tag.group_id, :post_number, :now, :now
|
||||||
FROM topic_allowed_groups tag
|
FROM topic_allowed_groups tag
|
||||||
INNER JOIN group_users gu ON gu.group_id = tag.group_id
|
INNER JOIN group_users gu ON gu.group_id = tag.group_id
|
||||||
WHERE gu.user_id = :user_id
|
WHERE gu.user_id = :user_id
|
||||||
AND tag.topic_id = :topic_id
|
AND tag.topic_id = :topic_id
|
||||||
SQL
|
SQL
|
||||||
|
|
||||||
query += 'AND NOT(tag.group_id IN (:already_updated_groups))' unless updated_group_ids.length.zero?
|
query += 'AND NOT(tag.group_id IN (:already_updated_groups))' unless updated_group_ids.length.zero?
|
||||||
|
|
||||||
|
query += <<~CONFLICT
|
||||||
|
ON CONFLICT(topic_id, group_id)
|
||||||
|
DO UPDATE SET last_read_post_number = :post_number, created_at = :now, updated_at = :now
|
||||||
|
CONFLICT
|
||||||
|
|
||||||
DB.exec(
|
DB.exec(
|
||||||
query,
|
query,
|
||||||
user_id: user.id, topic_id: topic_id, post_number: post_number, now: DateTime.now, already_updated_groups: updated_group_ids
|
user_id: user.id, topic_id: topic_id, post_number: post_number, now: DateTime.now, already_updated_groups: updated_group_ids
|
||||||
|
@ -81,5 +81,12 @@ describe TopicGroup do
|
|||||||
expect(created_topic_group.last_read_post_number).to eq new_post_number
|
expect(created_topic_group.last_read_post_number).to eq new_post_number
|
||||||
expect(created_topic_group2.last_read_post_number).to eq topic2.highest_post_number
|
expect(created_topic_group2.last_read_post_number).to eq topic2.highest_post_number
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "will not raise an error if a topic group already exists" do
|
||||||
|
TopicGroup.create_topic_group(user, @topic.id, 3, [])
|
||||||
|
expect(TopicGroup.find_by(group: group, topic: @topic).last_read_post_number).to eq(3)
|
||||||
|
TopicGroup.create_topic_group(user, @topic.id, 10, [])
|
||||||
|
expect(TopicGroup.find_by(group: group, topic: @topic).last_read_post_number).to eq(10)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user