Files
danbooru/app/models/favorite.rb
evazion 7fa23c5fbf users: give all users unlimited favorites.
Let all users have unlimited favorites. Formerly the limit was 10k
favorites for regular members, 20k for Gold, and unlimited for Platinum.

Limiting favorites doesn't make sense since upvotes are unlimited.
2021-10-07 06:27:09 -05:00

62 lines
1.9 KiB
Ruby

class Favorite < ApplicationRecord
class Error < StandardError; end
belongs_to :post
belongs_to :user
scope :for_user, ->(user_id) { where("favorites.user_id % 100 = ? AND favorites.user_id = ?", user_id.to_i % 100, user_id) }
scope :public_favorites, -> { where(user: User.bit_prefs_match(:enable_private_favorites, false)) }
def self.visible(user)
user.is_admin? ? all : for_user(user.id).or(public_favorites)
end
def self.search(params)
q = search_attributes(params, :id, :post)
if params[:user_id].present?
q = q.for_user(params[:user_id])
end
q.order(post_id: :desc)
end
def self.available_includes
[:post, :user]
end
def self.add(post:, user:)
Favorite.transaction do
User.where(id: user.id).select("id").lock("FOR UPDATE").first
if Favorite.for_user(user.id).where(:user_id => user.id, :post_id => post.id).exists?
raise Error, "You have already favorited this post"
end
Favorite.create!(:user_id => user.id, :post_id => post.id)
Post.where(:id => post.id).update_all("fav_count = fav_count + 1")
post.append_user_to_fav_string(user.id)
User.where(:id => user.id).update_all("favorite_count = favorite_count + 1")
user.favorite_count += 1
end
end
def self.remove(user:, post: nil, post_id: nil)
Favorite.transaction do
if post && post_id.nil?
post_id = post.id
end
User.where(id: user.id).select("id").lock("FOR UPDATE").first
return unless Favorite.for_user(user.id).where(:user_id => user.id, :post_id => post_id).exists?
Favorite.for_user(user.id).where(post_id: post_id).delete_all
Post.where(:id => post_id).update_all("fav_count = fav_count - 1")
post&.delete_user_from_fav_string(user.id)
User.where(:id => user.id).update_all("favorite_count = favorite_count - 1")
user.favorite_count -= 1
post.fav_count -= 1 if post
end
end
end