isAdmin(), 403); abort_unless( in_array($status, [IdentityVerificationStatus::APPROVED, IdentityVerificationStatus::REJECTED], true), 422, ); abort_if( $status === IdentityVerificationStatus::REJECTED && blank($rejectionReason), 422, 'CERTIFICATION_REJECTION_REASON_REQUIRED', ); $reviewedRequest = DB::transaction(function () use ( $rejectionReason, $reviewer, $status, $verificationRequest, ): IdentityVerificationRequest { $lockedRequest = IdentityVerificationRequest::query() ->whereKey($verificationRequest->getKey()) ->lockForUpdate() ->firstOrFail(); abort_unless($lockedRequest->status === IdentityVerificationStatus::PENDING, 409); $lockedRequest->update([ 'status' => $status, 'reviewed_at' => now(), 'reviewed_by' => $reviewer->getKey(), 'rejection_reason' => $status === IdentityVerificationStatus::REJECTED ? trim((string) $rejectionReason) : null, ]); if ($status === IdentityVerificationStatus::APPROVED) { $lockedRequest->user()->update([ 'account_verified_at' => now(), ]); } return $lockedRequest->fresh(['user', 'reviewer']); }); $this->deleteReviewedDocument($reviewedRequest); $reviewedRequest->user->notify( (new CertificationReviewedNotification($reviewedRequest)) ->locale($reviewedRequest->user->preferredLocale()), ); return $reviewedRequest->fresh(['user', 'reviewer']); } private function deleteReviewedDocument(IdentityVerificationRequest $verificationRequest): void { if (! $verificationRequest->hasDocument()) { return; } try { Storage::disk($verificationRequest->document_disk) ->delete($verificationRequest->document_path); $verificationRequest->update([ 'document_path' => null, 'document_deleted_at' => now(), ]); } catch (\Throwable $exception) { report($exception); } } }