Test Failed
Push — master ( 276ee0...707900 )
by Pavel
06:09
created

DownloadBackupController::__invoke()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
nc 2
nop 1
dl 0
loc 18
c 1
b 0
f 0
cc 2
rs 9.9666
1
<?php
2
3
namespace PavelMironchik\LaravelBackupPanel\Http\Controllers;
4
5
use Illuminate\Http\Request;
6
use Illuminate\Http\Response;
7
use PavelMironchik\LaravelBackupPanel\Rules\BackupDisk;
8
use PavelMironchik\LaravelBackupPanel\Rules\PathToZip;
9
use Spatie\Backup\BackupDestination\Backup;
10
use Spatie\Backup\BackupDestination\BackupDestination;
11
use Symfony\Component\HttpFoundation\StreamedResponse;
12
13
class DownloadBackupController extends Controller
14
{
15
    public function __invoke(Request $request)
16
    {
17
        $validated = $request->validate([
18
            'disk' => new BackupDisk(),
19
            'path' => ['required', new PathToZip()],
20
        ]);
21
22
        $backupDestination = BackupDestination::create($validated['disk'], config('backup.backup.name'));
23
24
        $backup = $backupDestination->backups()->first(function (Backup $backup) use ($validated) {
25
            return $backup->path() === $validated['path'];
26
        });
27
28
        if (! $backup) {
29
            return response('Backup not found', Response::HTTP_UNPROCESSABLE_ENTITY);
30
        }
31
32
        return $this->respondWithBackupStream($backup);
33
    }
34
35
    public function respondWithBackupStream(Backup $backup): StreamedResponse
36
    {
37
        $fileName = pathinfo($backup->path(), PATHINFO_BASENAME);
38
39
        $downloadHeaders = [
40
            'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
41
            'Content-Type' => 'application/zip',
42
            'Content-Length' => $backup->size(),
43
            'Content-Disposition' => 'attachment; filename="'.$fileName.'"',
44
            'Pragma' => 'public',
45
        ];
46
47
        return response()->stream(function () use ($backup) {
48
            $stream = $backup->stream();
49
50
            fpassthru($stream);
51
52
            if (is_resource($stream)) {
53
                fclose($stream);
54
            }
55
        }, 200, $downloadHeaders);
56
    }
57
}
58