# frozen_string_literal: true module Jobs class EnqueueSuspectUsers < ::Jobs::Scheduled every 2.hours def execute(_args) return unless SiteSetting.approve_suspect_users return if SiteSetting.must_approve_users users = User .distinct .activated .human_users .where(approved: false) .joins(:user_profile, :user_stat) .where("users.created_at <= ? AND users.created_at >= ?", 1.day.ago, 6.months.ago) .where("LENGTH(COALESCE(user_profiles.bio_raw, user_profiles.website, '')) > 0") .where( "user_stats.posts_read_count <= 1 OR user_stats.topics_entered <= 1 OR user_stats.time_read < ?", 1.minute.to_i, ) .joins( "LEFT OUTER JOIN reviewables r ON r.target_id = users.id AND r.target_type = 'User'", ) .where("r.id IS NULL") .joins(<<~SQL) LEFT OUTER JOIN ( SELECT user_id FROM user_custom_fields WHERE user_custom_fields.name = 'import_id' ) AS ucf ON ucf.user_id = users.id SQL .where("ucf.user_id IS NULL") .limit(10) users.each do |user| user_profile = user.user_profile reviewable = ReviewableUser.needs_review!( target: user, created_by: Discourse.system_user, reviewable_by_moderator: true, payload: { username: user.username, name: user.name, email: user.email, bio: user_profile.bio_raw, website: user_profile.website, }, ) if reviewable.created_new reviewable.add_score( Discourse.system_user, ReviewableScore.types[:needs_approval], reason: :suspect_user, force_review: true, ) end end end end end