-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Expand file tree
/
Copy pathDownloadExport.php
More file actions
48 lines (38 loc) · 1.46 KB
/
Copy pathDownloadExport.php
File metadata and controls
48 lines (38 loc) · 1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
namespace Filament\Actions\Exports\Http\Controllers;
use Filament\Actions\Exports\Enums\Contracts\ExportFormat as ExportFormatInterface;
use Filament\Actions\Exports\Enums\ExportFormat;
use Filament\Actions\Exports\Models\Export;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Gate;
use Symfony\Component\HttpFoundation\StreamedResponse;
class DownloadExport
{
public function __invoke(Request $request, Export $export): StreamedResponse
{
abort_unless(auth(
$request->hasValidSignature(absolute: false)
? $request->query('authGuard')
: null,
)->check(), 401);
$user = auth(
$request->hasValidSignature(absolute: false)
? $request->query('authGuard')
: null,
)->user();
$exportPolicy = Gate::getPolicyFor($export::class);
if (filled($exportPolicy) && method_exists($exportPolicy, 'view')) {
Gate::forUser($user)->authorize('view', Arr::wrap($export));
} else {
abort_unless($export->user()->is($user), 403);
}
$format = $this->resolveFormatFromRequest($request);
abort_unless($format !== null, 404);
return $export->exporter::getDownloader($format)($export);
}
protected function resolveFormatFromRequest(Request $request): ?ExportFormatInterface
{
return ExportFormat::tryFrom($request->query('format'));
}
}