From 9f211df038388a01a2d5097fa06737126ae7e6db Mon Sep 17 00:00:00 2001 From: lgb <353856593@qq.com> Date: Thu, 21 Mar 2024 11:09:25 +0800 Subject: [PATCH] improve user destroy --- app/Repositories/UserRepository.php | 23 ++++++++++++++++++----- include/cleanup.php | 13 +++++++------ include/constants.php | 4 ++-- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index 7071ebbf..38b67183 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -17,6 +17,7 @@ use App\Models\UsernameChangeLog; use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Arr; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Nexus\Database\NexusDB; @@ -623,13 +624,21 @@ class UserRepository extends BaseRepository return true; } - public function destroy($id, $reasonKey = 'user.destroy_by_admin') + public function destroy(Collection|int $id, $reasonKey = 'user.destroy_by_admin') { if (!isRunningInConsole()) { user_can('user-delete', true); } - $uidArr = Arr::wrap($id); - $users = User::query()->with('language')->whereIn('id', $uidArr)->get(['id', 'username', 'lang']); + if (is_int($id)) { + $uidArr = Arr::wrap($id); + $users = User::query()->with('language')->whereIn('id', $uidArr)->get(['id', 'username', 'lang']); + } else { + $users = $id; + $uidArr = $users->pluck('id')->toArray(); + } + if (empty($uidArr)) { + return; + } $tables = [ 'users' => 'id', 'hit_and_runs' => 'uid', @@ -641,6 +650,8 @@ class UserRepository extends BaseRepository 'attendance' => 'uid', 'attendance_logs' => 'uid', 'login_logs' => 'uid', + 'oauth_access_tokens' => 'user_id', + 'oauth_auth_codes' => 'user_id', ]; foreach ($tables as $table => $key) { \Nexus\Database\NexusDB::table($table)->whereIn($key, $uidArr)->delete(); @@ -655,8 +666,10 @@ class UserRepository extends BaseRepository ]; } UserBanLog::query()->insert($userBanLogs); - do_action("user_delete", $id); - fire_event("user_destroyed", $id); + if (is_int($id)) { + do_action("user_delete", $id); + fire_event("user_destroyed", $id); + } return true; } diff --git a/include/cleanup.php b/include/cleanup.php index febdfd75..0de1d89e 100644 --- a/include/cleanup.php +++ b/include/cleanup.php @@ -670,18 +670,19 @@ function docleanup($forceAll = 0, $printProgress = false) { } //destroy disabled accounts + $userRep = new \App\Repositories\UserRepository(); $destroyDisabledDays = get_setting('account.destroy_disabled'); if ($destroyDisabledDays > 0) { $secs = $destroyDisabledDays*24*60*60; $dt = date("Y-m-d H:i:s",(TIMENOW - $secs)); - $users = \App\Models\User::query() + \App\Models\User::query() ->where('enabled', 'no') ->where("last_access","<", $dt) - ->get(['id']); - if ($users->isNotEmpty()) { - $userRep = new \App\Repositories\UserRepository(); - $userRep->destroy($users->pluck('id')->toArray(), 'cleanup.destroy_disabled_account'); - } + ->select(['id', 'username', 'lang']) + ->orderBy("id", "asc") + ->chunk(2000, function (\Illuminate\Support\Collection $users) use ($userRep) { + $userRep->destroy($users, 'cleanup.destroy_disabled_account'); + }); } $log = "destroy disabled accounts"; do_log($log); diff --git a/include/constants.php b/include/constants.php index 3f1f2a07..a1411b7f 100644 --- a/include/constants.php +++ b/include/constants.php @@ -1,6 +1,6 @@