mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 11:41:09 -04:00
* Create PHP CS Fixer config and add to CI workflow * Run php cs fixer on project * Add newline at end of file * Update to use PHP CS Fixer v3 * Run v3 config on project * Run seperate config in CI
58 lines
1.8 KiB
PHP
58 lines
1.8 KiB
PHP
<?php
|
|
|
|
// Implementation taken from nova-backup-tool - https://github.com/spatie/nova-backup-tool/
|
|
|
|
namespace Crater\Http\Controllers\V1\Backup;
|
|
|
|
use Crater\Rules\Backup\PathToZip;
|
|
use Illuminate\Http\Request;
|
|
use Spatie\Backup\BackupDestination\Backup;
|
|
use Spatie\Backup\BackupDestination\BackupDestination;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\HttpFoundation\StreamedResponse;
|
|
|
|
class DownloadBackupController extends ApiController
|
|
{
|
|
public function __invoke(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'path' => ['required', new PathToZip()],
|
|
]);
|
|
|
|
$backupDestination = BackupDestination::create(config('filesystems.default'), config('backup.backup.name'));
|
|
|
|
$backup = $backupDestination->backups()->first(function (Backup $backup) use ($validated) {
|
|
return $backup->path() === $validated['path'];
|
|
});
|
|
|
|
if (! $backup) {
|
|
return response('Backup not found', Response::HTTP_UNPROCESSABLE_ENTITY);
|
|
}
|
|
|
|
return $this->respondWithBackupStream($backup);
|
|
}
|
|
|
|
public function respondWithBackupStream(Backup $backup): StreamedResponse
|
|
{
|
|
$fileName = pathinfo($backup->path(), PATHINFO_BASENAME);
|
|
|
|
$downloadHeaders = [
|
|
'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
|
|
'Content-Type' => 'application/zip',
|
|
'Content-Length' => $backup->size(),
|
|
'Content-Disposition' => 'attachment; filename="'.$fileName.'"',
|
|
'Pragma' => 'public',
|
|
];
|
|
|
|
return response()->stream(function () use ($backup) {
|
|
$stream = $backup->stream();
|
|
|
|
fpassthru($stream);
|
|
|
|
if (is_resource($stream)) {
|
|
fclose($stream);
|
|
}
|
|
}, 200, $downloadHeaders);
|
|
}
|
|
}
|