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