# 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