Files
danbooru/app/models/post_approval.rb
evazion 34057b25e1 mod actions: record the subject of the mod action.
Add a polymorphic `subject` field that records the subject of the mod
action. The subject is the post, user, comment, artist, etc the mod
action is for.

* The subject for the user ban and unban actions is the user, not the ban itself.
* The subject for the user feedback update and deletion actions is the user,
  not the feedback itself.
* The subject for the post undeletion action is the post, not the approval itself.
* The subject for the move favorites action is the source post where the
  favorites were moved from, not the destination post where the favorites
  were moved to.
* The subject for the post permanent delete action is nil, because the
  post itself is hard deleted.
* When a post is permanently deleted, all mod actions related to the
  post are deleted as well.
2022-09-25 04:04:28 -05:00

48 lines
1.3 KiB
Ruby

# frozen_string_literal: true
class PostApproval < ApplicationRecord
belongs_to :user
belongs_to :post, inverse_of: :approvals
validate :validate_approval
after_create :approve_post
def validate_approval
post.lock!
if post.is_active?
errors.add(:post, "is already active and cannot be approved")
end
if post.uploader == user
errors.add(:base, "You cannot approve a post you uploaded")
end
if (post.approver == user || post.approvals.exists?(user: user)) && !policy(user).can_bypass_approval_limits?
errors.add(:base, "You have previously approved this post and cannot approve it again")
end
end
def approve_post
is_pending = post.is_pending
is_undeletion = post.is_deleted
post.flags.pending.update!(status: :rejected)
post.appeals.pending.update!(status: :succeeded)
post.update(approver: user, is_flagged: false, is_pending: false, is_deleted: false)
ModAction.log("undeleted post ##{post_id}", :post_undelete, subject: post, user: user) if is_undeletion
post.uploader.upload_limit.update_limit!(is_pending, true)
end
def self.search(params, current_user)
q = search_attributes(params, [:id, :created_at, :updated_at, :user, :post], current_user: current_user)
q.apply_default_order(params)
end
def self.available_includes
[:user, :post]
end
end