2019-05-02 17:17:27 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-03-18 10:25:15 -05:00
|
|
|
module Jobs
|
2019-10-01 23:01:53 -05:00
|
|
|
class CleanUpInactiveUsers < ::Jobs::Scheduled
|
2019-03-18 10:25:15 -05:00
|
|
|
every 1.day
|
|
|
|
|
|
|
|
def execute(args)
|
|
|
|
return if SiteSetting.clean_up_inactive_users_after_days <= 0
|
|
|
|
|
2023-01-09 06:20:10 -06:00
|
|
|
User
|
|
|
|
.where(
|
|
|
|
last_posted_at: nil,
|
|
|
|
trust_level: TrustLevel.levels[:newuser],
|
|
|
|
admin: false,
|
|
|
|
moderator: false,
|
|
|
|
)
|
2023-05-23 03:11:23 -05:00
|
|
|
.where("users.created_at < ?", SiteSetting.clean_up_inactive_users_after_days.days.ago)
|
2019-03-18 20:53:18 -05:00
|
|
|
.where(
|
2023-05-22 13:56:24 -05:00
|
|
|
"users.last_seen_at < ? OR users.last_seen_at IS NULL",
|
2023-01-09 06:20:10 -06:00
|
|
|
SiteSetting.clean_up_inactive_users_after_days.days.ago,
|
|
|
|
)
|
2023-05-22 13:56:24 -05:00
|
|
|
.where
|
|
|
|
.missing(:posts, :topics)
|
2019-04-09 07:24:19 -05:00
|
|
|
.limit(1000)
|
2023-01-09 06:20:10 -06:00
|
|
|
.pluck(:id)
|
|
|
|
.each_slice(50) { |slice| destroy(slice) }
|
2019-04-26 07:51:33 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def destroy(ids)
|
|
|
|
destroyer = UserDestroyer.new(Discourse.system_user)
|
|
|
|
|
|
|
|
User.transaction do
|
|
|
|
ids.each do |id|
|
|
|
|
begin
|
2019-11-17 23:14:15 -06:00
|
|
|
user = User.find_by(id: id)
|
|
|
|
next unless user
|
2023-01-09 06:20:10 -06:00
|
|
|
destroyer.destroy(
|
|
|
|
user,
|
|
|
|
transaction: false,
|
|
|
|
context: I18n.t("user.destroy_reasons.inactive_user"),
|
|
|
|
)
|
2019-04-26 07:51:33 -05:00
|
|
|
rescue => e
|
2023-01-09 06:20:10 -06:00
|
|
|
Discourse.handle_job_exception(
|
|
|
|
e,
|
|
|
|
message: "Cleaning up inactive users",
|
|
|
|
extra: {
|
|
|
|
user_id: id,
|
|
|
|
},
|
2019-04-26 07:51:33 -05:00
|
|
|
)
|
|
|
|
raise e
|
|
|
|
end
|
2019-03-18 10:25:15 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|