koel/app/Services/SongStorage/S3CompatibleStorage.php

63 lines
1.7 KiB
PHP
Raw Normal View History

<?php
namespace App\Services\SongStorage;
use App\Models\Song;
use App\Models\User;
use App\Services\FileScanner;
use App\Values\SongStorageTypes;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
2024-02-05 11:50:06 +00:00
class S3CompatibleStorage extends CloudStorage
{
2024-02-05 11:50:06 +00:00
public function __construct(protected FileScanner $scanner, private string $bucket)
{
2024-02-05 11:50:06 +00:00
parent::__construct($scanner);
}
public function storeUploadedFile(UploadedFile $file, User $uploader): Song
{
2024-02-05 11:50:06 +00:00
return DB::transaction(function () use ($file, $uploader): Song {
$result = $this->scanUploadedFile($file, $uploader);
$song = $this->scanner->getSong();
2024-02-05 11:50:06 +00:00
$key = $this->generateStorageKey($file->getClientOriginalName(), $uploader);
2024-02-05 11:50:06 +00:00
Storage::disk('s3')->put($key, File::get($result->path));
$song->update([
'path' => "s3://$this->bucket/$key",
'storage' => SongStorageTypes::S3,
]);
2024-02-05 11:50:06 +00:00
File::delete($result->path);
return $song;
});
}
public function getSongPresignedUrl(Song $song): string
{
return Storage::disk('s3')->temporaryUrl($song->storage_metadata->getPath(), now()->addHour());
}
public function delete(Song $song, bool $backup = false): void
{
$disk = Storage::disk('s3');
$path = $song->storage_metadata->getPath();
if ($backup) {
$disk->move($path, "backup/$path");
}
$disk->delete($song->storage_metadata->getPath());
}
public function supported(): bool
{
return SongStorageTypes::supported(SongStorageTypes::S3);
}
}