discourse/app/jobs/regular/truncate_user_flag_stats.rb
Sam Saffron 30990006a9 DEV: enable frozen string literal on all files
This reduces chances of errors where consumers of strings mutate inputs
and reduces memory usage of the app.

Test suite passes now, but there may be some stuff left, so we will run
a few sites on a branch prior to merging
2019-05-13 09:31:32 +08:00

51 lines
1.6 KiB
Ruby

# frozen_string_literal: true
class Jobs::TruncateUserFlagStats < Jobs::Base
def self.truncate_to
100
end
# To give users a chance to improve, we limit their flag stats to the last N flags
def execute(args)
raise Discourse::InvalidParameters.new(:user_ids) unless args[:user_ids].present?
args[:user_ids].each do |u|
user_stat = UserStat.find_by(user_id: u)
next if user_stat.blank?
total = user_stat.flags_agreed + user_stat.flags_disagreed + user_stat.flags_ignored
next if total < self.class.truncate_to
params = ReviewableScore.statuses.slice(:agreed, :disagreed, :ignored).
merge(user_id: u, truncate_to: self.class.truncate_to)
result = DB.query(<<~SQL, params)
SELECT SUM(CASE WHEN x.status = :agreed THEN 1 ELSE 0 END) AS agreed,
SUM(CASE WHEN x.status = :disagreed THEN 1 ELSE 0 END) AS disagreed,
SUM(CASE WHEN x.status = :ignored THEN 1 ELSE 0 END) AS ignored
FROM (
SELECT rs.status
FROM reviewable_scores AS rs
INNER JOIN reviewables AS r ON r.id = rs.reviewable_id
INNER JOIN posts AS p ON p.id = r.target_id
WHERE rs.user_id = :user_id
AND r.type = 'ReviewableFlaggedPost'
AND rs.status IN (:agreed, :disagreed, :ignored)
AND rs.user_id <> p.user_id
ORDER BY rs.created_at DESC
LIMIT :truncate_to
) AS x
SQL
user_stat.update_columns(
flags_agreed: result[0].agreed || 0,
flags_disagreed: result[0].disagreed || 0,
flags_ignored: result[0].ignored || 0,
)
end
end
end