Files
daily-meal-api/app/Actions/ReviewIdentityVerification.php
T
leonm 8b60283eeb
CI / 🧪 Tests Laravel (push) Successful in 2m34s
CI / 🐳 Build & Push Images (push) Successful in 2m26s
feat: translation codes
2026-08-14 12:46:29 +02:00

91 lines
2.9 KiB
PHP

<?php
namespace App\Actions;
use App\Enums\IdentityVerificationStatus;
use App\Models\IdentityVerificationRequest;
use App\Models\User;
use App\Notifications\CertificationReviewedNotification;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class ReviewIdentityVerification
{
public function execute(
IdentityVerificationRequest $verificationRequest,
IdentityVerificationStatus $status,
User $reviewer,
?string $rejectionReason = null,
): IdentityVerificationRequest {
abort_unless($reviewer->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);
}
}
}