diff --git a/controllers/updates_controller.rb b/controllers/updates_controller.rb index e374a484..ecee8804 100644 --- a/controllers/updates_controller.rb +++ b/controllers/updates_controller.rb @@ -30,17 +30,14 @@ class Rstatus # add entry to user's feed current_user.feed.updates << u - current_user.feed.save - current_user.save - - # tell hubs there is a new entry - current_user.feed.ping_hubs(url(current_user.feed.url)) - - if params[:text].length < 1 - flash[:notice] = "Your status is too short!" - elsif params[:text].length > 140 - flash[:notice] = "Your status is too long!" + unless u.valid? + flash[:notice] = u.errors.errors.values.join("\n") else + current_user.feed.save + current_user.save + # tell hubs there is a new entry + current_user.feed.ping_hubs(url(current_user.feed.url)) + flash[:notice] = "Update created." end diff --git a/models/feed.rb b/models/feed.rb index ab71b58f..97f6c7df 100644 --- a/models/feed.rb +++ b/models/feed.rb @@ -143,4 +143,8 @@ def atom(base_uri) }) feed.atom end + + def last_update + Update.where(:feed_id => id).order(['created_at', 'descending']).first + end end diff --git a/models/update.rb b/models/update.rb index c6f6e826..688f405f 100644 --- a/models/update.rb +++ b/models/update.rb @@ -18,6 +18,7 @@ class Update before_save :generate_html validates_length_of :text, :minimum => 1, :maximum => 140 + validate :do_not_repeat_yourself, :on => :create before_create :get_tags before_create :get_language @@ -134,4 +135,7 @@ def send_to_external_accounts end + def do_not_repeat_yourself + errors.add(:text, "You already posted this update.") if feed.last_update && feed.last_update.id != id && feed.last_update.text == text && feed.last_update.author.id == author.id + end end diff --git a/test/unit/update_test.rb b/test/unit/update_test.rb index 19616dcb..36e29e44 100644 --- a/test/unit/update_test.rb +++ b/test/unit/update_test.rb @@ -180,4 +180,35 @@ def test_facebook_send_no_facebook_auth FbGraph::User.expects(:me).never u.feed.updates << Update.new(:text => "This is a message", :facebook => false, :twitter => false, :author => at) end + + def test_will_not_save_the_same_update_to_feed_twice_in_a_row + feed = Factory(:feed) + author = Factory(:author, :feed => feed) + user = Factory(:user, :author => author, :feed => feed) + update = Update.new(:text => "This is a message", :author => author, :twitter => false, :facebook => false) + user.feed.updates << update + user.feed.save + user.save + assert_equal 1, user.feed.updates.size + update = Update.new(:text => "This is a message", :author => author, :twitter => false, :facebook => false) + user.feed.updates << update + refute update.valid?, "You already posted this update" + end + + def test_will_save_same_update_text_from_different_authors_to_feed_twice_in_a_row + feed1 = Factory(:feed) + author1 = Factory(:author, :feed => feed1) + user1 = Factory(:user, :author => author1, :feed => feed1) + feed2 = Factory(:feed) + author2 = Factory(:author, :feed => feed2) + user2 = Factory(:user, :author => author2, :feed => feed2) + update = Update.new(:text => "This is a message", :author => author1, :twitter => false, :facebook => false) + user1.feed.updates << update + user1.feed.save + user1.save + assert_equal 1, user1.feed.updates.size + update = Update.new(:text => "This is a message", :author => author2, :twitter => false, :facebook => false) + user1.feed.updates << update + assert update.valid? + end end