$policyVersionIds * @param array $context */ public function __construct( public int $tenantId, public int $userId, public array $policyVersionIds, public int $retentionDays = 90, ?OperationRun $operationRun = null, public array $context = [], ) { $this->operationRun = $operationRun; } public function handle(OperationRunService $runs): void { if (! $this->operationRun instanceof OperationRun) { throw new RuntimeException('OperationRun is required for BulkPolicyVersionPruneJob.'); } $this->operationRun->refresh(); if ($this->operationRun->status === 'completed') { return; } $runs->updateRun($this->operationRun, 'running'); $ids = $this->normalizeIds($this->policyVersionIds); $runs->incrementSummaryCounts($this->operationRun, ['total' => count($ids)]); $chunkSize = (int) config('tenantpilot.bulk_operations.chunk_size', 10); $chunkSize = max(1, $chunkSize); foreach (array_chunk($ids, $chunkSize) as $chunk) { foreach ($chunk as $policyVersionId) { dispatch(new PolicyVersionPruneWorkerJob( tenantId: $this->tenantId, userId: $this->userId, policyVersionId: $policyVersionId, retentionDays: $this->retentionDays, operationRun: $this->operationRun, context: $this->context, )); } } } /** * @param array $ids * @return array */ private function normalizeIds(array $ids): array { $normalized = []; foreach ($ids as $id) { if (is_int($id)) { $normalized[] = $id; continue; } if (is_numeric($id)) { $normalized[] = (int) $id; } } $normalized = array_values(array_unique($normalized)); sort($normalized); return $normalized; } }