85 lines
2.7 KiB
PHP
85 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Actions;
|
|
|
|
use App\Enums\IdentityVerificationStatus;
|
|
use App\Models\IdentityVerificationRequest;
|
|
use App\Models\User;
|
|
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,
|
|
__('api.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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|