Files
alrahma_sunday_school_api/app/Services/Users/InactiveUserCleanupService.php
T
2026-06-08 23:30:22 -04:00

63 lines
1.7 KiB
PHP

<?php
namespace App\Services\Users;
use App\Models\ParentModel;
use Illuminate\Support\Facades\DB;
class InactiveUserCleanupService
{
public function cleanup(int $minutes = 15): array
{
$cutoff = now()->subMinutes($minutes)->toDateTimeString();
$users = DB::table('users')
->select('id')
->where('status', 'Inactive')
->where('created_at', '<', $cutoff)
->get()
->map(fn ($row) => (array) $row)
->all();
if (empty($users)) {
$orphans = $this->purgeOrphanedUserRoles();
return [
'deleted_users' => 0,
'deleted_parents' => 0,
'deleted_roles' => $orphans,
];
}
$userIds = array_map(static fn ($u) => (int) ($u['id'] ?? 0), $users);
$userIds = array_values(array_filter($userIds));
$deletedParents = 0;
DB::transaction(function () use ($userIds, &$deletedParents): void {
$deletedParents = ParentModel::query()
->whereIn('firstparent_id', $userIds)
->delete();
DB::table('user_roles')->whereIn('user_id', $userIds)->delete();
DB::table('users')->whereIn('id', $userIds)->delete();
});
$orphans = $this->purgeOrphanedUserRoles();
return [
'deleted_users' => count($userIds),
'deleted_parents' => (int) $deletedParents,
'deleted_roles' => $orphans,
];
}
private function purgeOrphanedUserRoles(): int
{
return DB::table('user_roles')
->whereNotIn('user_id', function ($q) {
$q->select('id')->from('users');
})
->delete();
}
}