discourse/db/migrate/20190130163001_migrate_reviewable_flagged_posts.rb

120 lines
3.2 KiB
Ruby

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