diff --git a/app/models/topic_embed.rb b/app/models/topic_embed.rb index fa8008703..823ce5484 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 bb9723a95..8629d1e87 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 411e8d715..6a5feef97 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