discourse/db/migrate/20190130163001_migrate_reviewable_flagged_posts.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

122 lines
3.3 KiB
Ruby

# frozen_string_literal: true
class MigrateReviewableFlaggedPosts < ActiveRecord::Migration[5.2]
def up
# for the migration we'll do 1.0 + trust_level and not take into account user flagging accuracy
# It should be good enough for old flags whose scores are not as important as pending flags.
execute(<<~SQL)
INSERT INTO reviewables (
type,
status,
topic_id,
reviewable_by_moderator,
category_id,
payload,
target_type,
target_id,
target_created_by_id,
score,
created_by_id,
created_at,
updated_at
)
SELECT 'ReviewableFlaggedPost',
CASE
WHEN MAX(pa.agreed_at) IS NOT NULL THEN 1
WHEN MAX(pa.disagreed_at) IS NOT NULL THEN 2
WHEN MAX(pa.deferred_at) IS NOT NULL THEN 3
WHEN MAX(pa.deleted_at) IS NOT NULL THEN 4
ELSE 0
END,
t.id,
true,
t.category_id,
json_build_object(),
'Post',
pa.post_id,
p.user_id,
0,
MAX(pa.user_id),
MIN(pa.created_at),
MAX(pa.updated_at)
FROM post_actions AS pa
INNER JOIN posts AS p ON pa.post_id = p.id
INNER JOIN topics AS t ON t.id = p.topic_id
INNER JOIN post_action_types AS pat ON pat.id = pa.post_action_type_id
WHERE pat.is_flag
AND pat.name_key <> 'notify_user'
AND p.user_id > 0
AND p.deleted_at IS NULL
AND t.deleted_at IS NULL
GROUP BY pa.post_id,
t.id,
t.category_id,
p.user_id
SQL
execute(<<~SQL)
INSERT INTO reviewable_scores (
reviewable_id,
user_id,
reviewable_score_type,
status,
score,
meta_topic_id,
created_at,
updated_at
)
SELECT r.id,
pa.user_id,
pa.post_action_type_id,
CASE
WHEN pa.agreed_at IS NOT NULL THEN 1
WHEN pa.disagreed_at IS NOT NULL THEN 2
WHEN pa.deferred_at IS NOT NULL THEN 3
WHEN pa.deleted_at IS NOT NULL THEN 3
ELSE 0
END,
1.0 +
(CASE
WHEN pau.moderator OR pau.admin THEN 5.0
ELSE pau.trust_level
END) +
(CASE
WHEN pa.staff_took_action THEN 5.0
ELSE 0.0
END),
rp.topic_id,
pa.created_at,
pa.updated_at
FROM post_actions AS pa
INNER JOIN post_action_types AS pat ON pat.id = pa.post_action_type_id
INNER JOIN users AS pau ON pa.user_id = pau.id
INNER JOIN reviewables AS r ON pa.post_id = r.target_id
LEFT OUTER JOIN posts AS rp ON rp.id = pa.related_post_id
WHERE pat.is_flag
AND r.type = 'ReviewableFlaggedPost'
SQL
execute(<<~SQL)
UPDATE reviewables
SET score = COALESCE((
SELECT sum(score)
FROM reviewable_scores AS rs
WHERE rs.reviewable_id = reviewables.id
AND rs.status = 0
), 0),
potential_spam = EXISTS(
SELECT 1
FROM reviewable_scores AS rs
WHERE rs.reviewable_id = reviewables.id
AND rs.reviewable_score_type = 8
)
SQL
end
def down
execute "DELETE FROM reviewables WHERE type = 'ReviewableFlaggedPost'"
execute "DELETE FROM reviewable_scores"
end
end