30 lines
1.3 KiB
PHP
30 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Jobs\ScanDocumentForMalware;
|
|
use App\Services\DocumentManagementAccess;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class DocumentMalwareController extends Controller
|
|
{
|
|
public function retry(Request $request, string $id): RedirectResponse
|
|
{
|
|
DB::transaction(function () use ($id, $request): void {
|
|
$document = app(DocumentManagementAccess::class)->documents($request->user())->where('id', $id)->lockForUpdate()->first();
|
|
abort_unless($document && $document->status !== 'deleted' && $document->deleted_at === null, 404);
|
|
abort_unless(in_array($document->malware_scan_status, ['pending', 'inconclusive', 'failed'], true), 422,
|
|
'Só é possível repetir uma análise pendente, inconclusiva ou falhada. Para substituir um ficheiro, carregue uma nova versão.');
|
|
|
|
DB::table('documents')->where('id', $id)->update([
|
|
'status' => 'quarantined', 'malware_scan_status' => 'pending', 'malware_failure_reason' => null, 'updated_at' => now(),
|
|
]);
|
|
ScanDocumentForMalware::dispatch($id)->afterCommit();
|
|
});
|
|
|
|
return back()->with('success', 'Nova análise colocada na fila. O ficheiro permanece privado até haver resultado.');
|
|
}
|
|
}
|