diff --git a/app/controllers/reviewable_claimed_topics_controller.rb b/app/controllers/reviewable_claimed_topics_controller.rb index eb8b0d712b5..37f66cd9b5e 100644 --- a/app/controllers/reviewable_claimed_topics_controller.rb +++ b/app/controllers/reviewable_claimed_topics_controller.rb @@ -6,7 +6,10 @@ class ReviewableClaimedTopicsController < ApplicationController def create topic = Topic.find_by(id: params[:reviewable_claimed_topic][:topic_id]) guardian.ensure_can_claim_reviewable_topic!(topic) - ReviewableClaimedTopic.create!(user_id: current_user.id, topic_id: topic.id) + ReviewableClaimedTopic.create(user_id: current_user.id, topic_id: topic.id) + render json: success_json + rescue ActiveRecord::RecordNotUnique + # This is just in case the validation fails under concurrency render json: success_json end diff --git a/app/models/reviewable_claimed_topic.rb b/app/models/reviewable_claimed_topic.rb index 216aa6543c1..dc54c4abf14 100644 --- a/app/models/reviewable_claimed_topic.rb +++ b/app/models/reviewable_claimed_topic.rb @@ -3,6 +3,7 @@ class ReviewableClaimedTopic < ActiveRecord::Base belongs_to :topic belongs_to :user + validates_uniqueness_of :topic def self.claimed_hash(topic_ids) result = {} diff --git a/spec/models/reviewable_claimed_topic_spec.rb b/spec/models/reviewable_claimed_topic_spec.rb index e8801e7f13c..c4c54ea2e59 100644 --- a/spec/models/reviewable_claimed_topic_spec.rb +++ b/spec/models/reviewable_claimed_topic_spec.rb @@ -4,11 +4,14 @@ require 'rails_helper' RSpec.describe ReviewableClaimedTopic, type: :model do - it "ensures uniqueness" do - claimed = Fabricate(:reviewable_claimed_topic) - expect(-> { - ReviewableClaimedTopic.create!(topic_id: claimed.topic_id, user_id: Fabricate(:user).id) - }).to raise_error(ActiveRecord::RecordNotUnique) + it "respects the uniqueness constraint" do + topic = Fabricate(:topic) + + ct = ReviewableClaimedTopic.new(topic_id: topic.id, user_id: Fabricate(:user).id) + expect(ct.save).to eq(true) + + ct = ReviewableClaimedTopic.new(topic_id: topic.id, user_id: Fabricate(:user).id) + expect(ct.save).to eq(false) end end diff --git a/spec/requests/reviewable_claimed_topics_controller_spec.rb b/spec/requests/reviewable_claimed_topics_controller_spec.rb index 134ba396ca4..81dc06e3c73 100644 --- a/spec/requests/reviewable_claimed_topics_controller_spec.rb +++ b/spec/requests/reviewable_claimed_topics_controller_spec.rb @@ -33,6 +33,14 @@ describe ReviewableClaimedTopicsController do expect(response.code).to eq("200") expect(ReviewableClaimedTopic.where(user_id: moderator.id, topic_id: topic.id).exists?).to eq(true) end + + it "won't an error if you claim twice" do + SiteSetting.reviewable_claiming = 'optional' + post "/reviewable_claimed_topics.json", params: params + expect(ReviewableClaimedTopic.where(user_id: moderator.id, topic_id: topic.id).exists?).to eq(true) + post "/reviewable_claimed_topics.json", params: params + expect(response.code).to eq("200") + end end end