mirror of
https://github.com/discourse/discourse.git
synced 2024-11-30 13:29:42 +08:00
ad3ec5809f
Original PR was reverted because of broken migration https://github.com/discourse/discourse/pull/12058 I fixed it by adding this line ``` AND topics.id IN(SELECT id FROM topics ORDER BY created_at DESC LIMIT :max_new_topics) ``` This time it is left joining a limited amount of topics. I tested it on few databases and it worked quite smooth
61 lines
2.4 KiB
Ruby
61 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Jobs
|
|
class CleanDismissedTopicUsers < ::Jobs::Scheduled
|
|
every 1.day
|
|
|
|
def execute(args)
|
|
delete_overdue_dismissals!
|
|
delete_over_the_limit_dismissals!
|
|
end
|
|
|
|
private
|
|
|
|
def delete_overdue_dismissals!
|
|
sql = <<~SQL
|
|
DELETE FROM dismissed_topic_users dtu1
|
|
USING dismissed_topic_users dtu2
|
|
JOIN topics ON topics.id = dtu2.topic_id
|
|
JOIN users ON users.id = dtu2.user_id
|
|
JOIN categories ON categories.id = topics.category_id
|
|
LEFT JOIN user_stats ON user_stats.user_id = users.id
|
|
LEFT JOIN user_options ON user_options.user_id = users.id
|
|
WHERE topics.created_at < GREATEST(CASE
|
|
WHEN COALESCE(user_options.new_topic_duration_minutes, :default_duration) = :always THEN users.created_at
|
|
WHEN COALESCE(user_options.new_topic_duration_minutes, :default_duration) = :last_visit THEN COALESCE(users.previous_visit_at,users.created_at)
|
|
ELSE (:now::timestamp - INTERVAL '1 MINUTE' * COALESCE(user_options.new_topic_duration_minutes, :default_duration))
|
|
END, users.created_at, :min_date)
|
|
AND dtu1.id = dtu2.id
|
|
SQL
|
|
sql = DB.sql_fragment(sql,
|
|
now: DateTime.now,
|
|
last_visit: User::NewTopicDuration::LAST_VISIT,
|
|
always: User::NewTopicDuration::ALWAYS,
|
|
default_duration: SiteSetting.default_other_new_topic_duration_minutes,
|
|
min_date: Time.at(SiteSetting.min_new_topics_time).to_datetime)
|
|
DB.exec(sql)
|
|
end
|
|
|
|
def delete_over_the_limit_dismissals!
|
|
user_ids = DismissedTopicUser.distinct(:user_id).pluck(:user_id)
|
|
sql = <<~SQL
|
|
DELETE FROM dismissed_topic_users
|
|
WHERE dismissed_topic_users.id NOT IN (
|
|
SELECT valid_dtu.id FROM users
|
|
LEFT JOIN dismissed_topic_users valid_dtu ON valid_dtu.user_id = users.id
|
|
AND valid_dtu.topic_id IN (
|
|
SELECT topic_id FROM dismissed_topic_users dtu2
|
|
JOIN topics ON topics.id = dtu2.topic_id
|
|
WHERE dtu2.user_id = users.id
|
|
ORDER BY topics.created_at DESC
|
|
LIMIT :max_new_topics
|
|
)
|
|
WHERE users.id IN(:user_ids)
|
|
)
|
|
SQL
|
|
sql = DB.sql_fragment(sql, max_new_topics: SiteSetting.max_new_topics, user_ids: user_ids)
|
|
DB.exec(sql)
|
|
end
|
|
end
|
|
end
|