diff --git a/app/models/favorite.rb b/app/models/favorite.rb index 9f81edba5..4cd0a47a1 100644 --- a/app/models/favorite.rb +++ b/app/models/favorite.rb @@ -6,4 +6,26 @@ class Favorite < ActiveRecord::Base def self.destroy_all(hash) connection.execute("delete from favorites_#{hash[:user_id] % 100} where user_id = #{hash[:user_id]} and post_id = #{hash[:post_id]}") end + + def self.add(post, user) + return if Favorite.for_user(user.id).exists?(:user_id => user.id, :post_id => post.id) + Favorite.create(:user_id => user.id, :post_id => post.id) + Post.update_all("fav_count = fav_count + 1", "id = #{post.id}") + Post.update_all("score = score + 1", "id = #{post.id}") if user.is_privileged? + post.append_user_to_fav_string(user.id) + user.add_favorite!(post) + user.increment!(:favorite_count) + post.add_favorite!(user) + end + + def self.remove(post, user) + return unless Favorite.for_user(user.id).exists?(:user_id => user.id, :post_id => post.id) + Favorite.destroy_all(:user_id => user.id, :post_id => post.id) + Post.update_all("fav_count = fav_count - 1", "id = #{post.id}") + Post.update_all("score = score - 1", "id = #{post.id}") if user.is_privileged? + post.delete_user_from_fav_string(user.id) + user.remove_favorite!(post) + user.decrement!(:favorite_count) + post.remove_favorite!(user) + end end diff --git a/app/models/post.rb b/app/models/post.rb index 190a9e865..c57f993e8 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -525,11 +525,7 @@ class Post < ActiveRecord::Base end def add_favorite!(user) - return if favorited_by?(user.id) - append_user_to_fav_string(user.id) - Post.connection.execute_sql("update posts set fav_count = fav_count + 1 where id = #{id}") - Post.connection.execute_sql("update posts set score = score + 1 where id = #{id}") if CurrentUser.is_privileged? - user.add_favorite!(self) + Favorite.add(self, user) end def delete_user_from_fav_string(user_id) @@ -537,11 +533,7 @@ class Post < ActiveRecord::Base end def remove_favorite!(user) - return unless favorited_by?(user.id) - Post.connection.execute_sql("update posts set fav_count = fav_count - 1 where id = #{id}") - Post.connection.execute_sql("update posts set score = score - 1 where id = #{id}") if CurrentUser.is_privileged? - delete_user_from_fav_string(user.id) - user.remove_favorite!(self) + Favorite.remove(self, user) end def favorited_user_ids diff --git a/app/models/user.rb b/app/models/user.rb index e66277190..e56d6d94c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -204,17 +204,11 @@ class User < ActiveRecord::Base end def add_favorite!(post) - return if Favorite.for_user(id).exists?(:user_id => id, :post_id => post.id) - Favorite.create(:user_id => id, :post_id => post.id) - increment!(:favorite_count) - post.add_favorite!(self) + Favorite.add(post, self) end def remove_favorite!(post) - return unless Favorite.for_user(id).exists?(:user_id => id, :post_id => post.id) - Favorite.destroy_all(:user_id => id, :post_id => post.id) - decrement!(:favorite_count) - post.remove_favorite!(self) + Favorite.remove(post, self) end end diff --git a/script/fixes/013.rb b/script/fixes/013.rb new file mode 100644 index 000000000..3d336f464 --- /dev/null +++ b/script/fixes/013.rb @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby + +require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config', 'environment')) + +ActiveRecord::Base.connection.execute("set statement_timeout = 0") + +Post.select("id, score, up_score, down_score, fav_count").find_each do |post| + post.update_column(:score, post.up_score - post.down_score + post.fav_count) +end diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index c4b12771c..2a53a0942 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -713,7 +713,7 @@ class PostTest < ActiveSupport::TestCase should "not decrement the post's score for basic users" do @member = FactoryGirl.create(:user) CurrentUser.scoped(@member, "127.0.0.1") do - @post.remove_favorite!(@user) + @post.remove_favorite!(@member) end @post.reload assert_equal(1, @post.score) @@ -757,7 +757,7 @@ class PostTest < ActiveSupport::TestCase should "not increment the post's score for basic users" do @member = FactoryGirl.create(:user) CurrentUser.scoped(@member, "127.0.0.1") do - @post.add_favorite!(@user) + @post.add_favorite!(@member) end @post.reload assert_equal(0, @post.score) diff --git a/test/unit/upload_test.rb b/test/unit/upload_test.rb index c7b2443db..23198c5e7 100644 --- a/test/unit/upload_test.rb +++ b/test/unit/upload_test.rb @@ -187,6 +187,7 @@ class UploadTest < ActiveSupport::TestCase @upload = FactoryGirl.create(:source_upload) assert_difference("CurrentUser.post_upload_count", 1) do @upload.process! + puts @upload.errors.full_messages CurrentUser.reload end end