From 2b59b455366dd2f160658491f0e1f967926cc04a Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 14 Jul 2024 13:14:59 +0100 Subject: [PATCH] feat: add queue task to purge inactive users --- core/includes/updates/212.php | 12 ++++ .../Default/core/registration.tpl | 9 +++ .../Core/classes/Tasks/PurgeInactiveUsers.php | 57 +++++++++++++++++++ modules/Core/language/en_UK.json | 3 + modules/Core/pages/panel/registration.php | 8 +++ 5 files changed, 89 insertions(+) create mode 100644 core/includes/updates/212.php create mode 100644 modules/Core/classes/Tasks/PurgeInactiveUsers.php diff --git a/core/includes/updates/212.php b/core/includes/updates/212.php new file mode 100644 index 0000000000..b6327884fc --- /dev/null +++ b/core/includes/updates/212.php @@ -0,0 +1,12 @@ +runMigrations(); + + PurgeInactiveUsers::schedule(new Language('core', 'en_UK')); + + $this->setVersion('2.2.0'); + } +}; diff --git a/custom/panel_templates/Default/core/registration.tpl b/custom/panel_templates/Default/core/registration.tpl index 24be861350..c5fe1198b5 100644 --- a/custom/panel_templates/Default/core/registration.tpl +++ b/custom/panel_templates/Default/core/registration.tpl @@ -130,6 +130,15 @@ {/foreach} +
+ + + + + +
diff --git a/modules/Core/classes/Tasks/PurgeInactiveUsers.php b/modules/Core/classes/Tasks/PurgeInactiveUsers.php new file mode 100644 index 0000000000..86ea7e78bd --- /dev/null +++ b/modules/Core/classes/Tasks/PurgeInactiveUsers.php @@ -0,0 +1,57 @@ +_container->get(Language::class); + + $errors = []; + + $cutoff = (int) Settings::get('purge_inactive_users_cutoff', '0'); + if (!$cutoff) { + $result = ['cutoff' => $cutoff, 'total' => 'Task disabled.']; + } else { + $cutoff_timestamp = strtotime("$cutoff days ago"); + $total = DB::getInstance()->query( + 'SELECT COUNT(*) c FROM nl2_users WHERE active = 0 AND joined < ?', + [$cutoff_timestamp] + )->first()->c; + + if ($total) { + $users = DB::getInstance()->query( + 'SELECT id FROM nl2_users WHERE active = 0 AND joined < ?', + [$cutoff_timestamp] + )->results(); + + foreach ($users as $user) { + EventHandler::executeEvent(new UserDeletedEvent(new User($user->id))); + } + } + + $result = [ + 'cutoff' => $cutoff, + 'cutoff_timestamp' => $cutoff_timestamp, + 'total' => $total, + 'users' => $users ?? [], + ]; + } + + $this->setOutput(['result' => $result, 'errors' => $errors]); + $this->reschedule($language); + + return Task::STATUS_COMPLETED; + } + + private function reschedule(Language $language) { + Queue::schedule((new PurgeInactiveUsers())->fromNew( + Module::getIdFromName('Core'), + $language->get('admin', 'purge_inactive_users'), + [], + Date::next()->getTimestamp() + )); + } + + public static function schedule(Language $language) { + (new self())->reschedule($language); + } +} diff --git a/modules/Core/language/en_UK.json b/modules/Core/language/en_UK.json index c88111d7a0..d657a1732f 100644 --- a/modules/Core/language/en_UK.json +++ b/modules/Core/language/en_UK.json @@ -522,6 +522,9 @@ "admin/profile_widgets": "Profile Widgets", "admin/public": "Public", "admin/purge_errors": "Purge Errors", + "admin/purge_inactive_users": "Purge Inactive Users", + "admin/purge_inactive_users_after": "Purge inactive users after (days)", + "admin/purge_inactive_users_info": "When set to a value greater than 0, this will automatically purge users that have not validated their accounts after the specified number of days", "admin/query_error_deleted_successfully": "Query error deleted successfully.", "admin/query_errors": "Query Errors", "admin/query_errors_purged_successfully": "Query errors purged successfully.", diff --git a/modules/Core/pages/panel/registration.php b/modules/Core/pages/panel/registration.php index 55804e3873..ed55ab651c 100644 --- a/modules/Core/pages/panel/registration.php +++ b/modules/Core/pages/panel/registration.php @@ -78,6 +78,11 @@ $validation_action = json_decode(Settings::get('validate_user_action'), true); $new_value = json_encode(['action' => $validation_action['action'] ?? 'promote', 'group' => $_POST['promote_group']]); Settings::set('validate_user_action', $new_value); + + if (is_numeric(Input::get('purge_users')) && (int) Input::get('purge_users') >= 0) { + // Purge users after x days + Settings::set('purge_inactive_users_cutoff', Input::get('purge_users')); + } } if (!count($errors)) { @@ -168,6 +173,9 @@ 'SUBMIT' => $language->get('general', 'submit'), 'ENABLE_REGISTRATION' => $language->get('admin', 'enable_registration'), 'REGISTRATION_ENABLED' => $registration_enabled, + 'PURGE_USERS_AFTER' => $language->get('admin' , 'purge_inactive_users_after'), + 'PURGE_USERS_AFTER_INFO' => $language->get('admin', 'purge_inactive_users_info'), + 'PURGE_USERS_AFTER_VALUE' => Settings::get('purge_inactive_users_cutoff', '0'), ]); $template->onPageLoad();