48 lines
1.7 KiB
PHP
48 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace Modules\Core\Command;
|
|
|
|
use Illuminate\Console\Command;
|
|
use Modules\Core\Privacy\Enums\ErasureRequestStatus;
|
|
use Modules\Core\Privacy\Jobs\EraseDataSubjectJob;
|
|
use Modules\Core\Privacy\Models\DataErasureRequest;
|
|
|
|
/**
|
|
* Finds every erasure request whose grace period (config('core.privacy.
|
|
* grace_period_days')) has passed and dispatches one EraseDataSubjectJob per
|
|
* request — see docs/privacy.md. This command itself just finds due requests and
|
|
* dispatches; the actual erasure work happens in the queue, one job per request,
|
|
* so one failing request doesn't block the others. Meant to run daily via the
|
|
* scheduler; each consuming app wires that in its own Console\Kernel (or
|
|
* bootstrap/app.php schedule closure on Laravel 11+), the same way it owns any
|
|
* other scheduled task — this package doesn't register schedules itself.
|
|
*/
|
|
class ProcessErasureRequestsCommand extends Command
|
|
{
|
|
protected $signature = 'boboko:privacy:process-erasure-requests';
|
|
|
|
protected $description = 'Dispatch an erasure job for every pending data-erasure request whose grace period has passed';
|
|
|
|
public function handle(): void
|
|
{
|
|
$due = DataErasureRequest::where('status', ErasureRequestStatus::Pending)
|
|
->where('scheduled_for', '<=', now())
|
|
->get();
|
|
|
|
if ($due->isEmpty()) {
|
|
$this->info('No due erasure requests.');
|
|
|
|
return;
|
|
}
|
|
|
|
foreach ($due as $request) {
|
|
EraseDataSubjectJob::dispatch($request);
|
|
|
|
$scope = $request->isForCustomer() ? 'customer' : 'user';
|
|
$this->info("Dispatched erasure job for {$scope} #{$request->subject_id} (request #{$request->id})");
|
|
}
|
|
|
|
$this->info('Dispatched '.$due->count().' erasure job(s).');
|
|
}
|
|
}
|