Files
scrum-poker-internal/app/Jobs/CloseInactiveRooms.php
T

57 lines
2.3 KiB
PHP

<?php
namespace App\Jobs;
use App\Models\Room;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\DB;
class CloseInactiveRooms implements ShouldQueue
{
use Queueable;
public function handle(): void
{
$closedAt = now();
$guestCutoff = $closedAt->subDays(config('rooms.guest_retention_days'));
$accountCutoff = $closedAt->subDays(config('rooms.account_retention_days'));
Room::query()
->whereNull('closed_at')
->where(function ($query) use ($guestCutoff, $accountCutoff): void {
$query
->where(function ($query) use ($guestCutoff): void {
$query->whereNull('owner_id')
->where('last_activity_at', '<=', $guestCutoff);
})
->orWhere(function ($query) use ($accountCutoff): void {
$query->whereNotNull('owner_id')
->where('last_activity_at', '<=', $accountCutoff);
});
})
->select('id')
->chunkById(100, function ($rooms) use ($closedAt, $guestCutoff, $accountCutoff): void {
Room::query()
->whereKey($rooms->pluck('id'))
->whereNull('closed_at')
->where(function ($query) use ($guestCutoff, $accountCutoff): void {
$query
->where(function ($query) use ($guestCutoff): void {
$query->whereNull('owner_id')
->where('last_activity_at', '<=', $guestCutoff);
})
->orWhere(function ($query) use ($accountCutoff): void {
$query->whereNotNull('owner_id')
->where('last_activity_at', '<=', $accountCutoff);
});
})
->update([
'closed_at' => $closedAt,
'state_version' => DB::raw('state_version + 1'),
'updated_at' => $closedAt,
]);
}, 'id');
}
}