From fb8ba5e137eb87c1bfd2c7b70be86accfd0b3e12 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 15 Jun 2015 12:08:55 -0400 Subject: [PATCH] FIX: `PG::UniqueViolation` when trying to use the same embed code Previously providing an embed code already in use would result in a logged server error. After this commit the error is gracefully bubbled up from the `PostCreator` --- app/models/topic_embed.rb | 1 + lib/post_creator.rb | 3 ++- spec/components/post_creator_spec.rb | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/models/topic_embed.rb b/app/models/topic_embed.rb index fa80087035..823ce54843 100644 --- a/app/models/topic_embed.rb +++ b/app/models/topic_embed.rb @@ -4,6 +4,7 @@ class TopicEmbed < ActiveRecord::Base belongs_to :topic belongs_to :post validates_presence_of :embed_url + validates_uniqueness_of :embed_url def self.normalize_url(url) url.downcase.sub(/\/$/, '').sub(/\-+/, '-').strip diff --git a/lib/post_creator.rb b/lib/post_creator.rb index bb9723a959..8629d1e873 100644 --- a/lib/post_creator.rb +++ b/lib/post_creator.rb @@ -193,7 +193,8 @@ class PostCreator # discourse post. def create_embedded_topic return unless @opts[:embed_url].present? - TopicEmbed.create!(topic_id: @post.topic_id, post_id: @post.id, embed_url: @opts[:embed_url]) + embed = TopicEmbed.new(topic_id: @post.topic_id, post_id: @post.id, embed_url: @opts[:embed_url]) + rollback_from_errors!(embed) unless embed.save end def handle_spam diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb index 411e8d7155..6a5feef97f 100644 --- a/spec/components/post_creator_spec.rb +++ b/spec/components/post_creator_spec.rb @@ -559,7 +559,17 @@ describe PostCreator do title: 'Reviews of Science Ovens', raw: 'Did you know that you can use microwaves to cook your dinner? Science!') creator.create + expect(creator.errors).to be_blank expect(TopicEmbed.where(embed_url: embed_url).exists?).to eq(true) + + # If we try to create another topic with the embed url, should fail + creator = PostCreator.new(user, + embed_url: embed_url, + title: 'More Reviews of Science Ovens', + raw: 'As if anyone ever wanted to learn more about them!') + result = creator.create + expect(result).to be_present + expect(creator.errors).to be_present end end