mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 02:30:57 +08:00
30990006a9
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
122 lines
3.3 KiB
Ruby
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
|