refactor(media): atomic upload_token via transaction and tighten test assertions

This commit is contained in:
Paulo Castellano 2026-05-15 16:16:42 -03:00
parent b17026f3a1
commit d50348562b
3 changed files with 19 additions and 6 deletions

View file

@ -10,6 +10,7 @@
use App\Models\Workspace;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\Response;
class UploadController extends Controller
@ -29,9 +30,13 @@ public function store(StoreUploadRequest $request, string $token): JsonResponse
$workspace = Workspace::findOrFail((string) $request->query('ws'));
$media = $workspace->addMedia($request->file('media'), 'assets');
$media->upload_token = $token;
$media->save();
$media = DB::transaction(function () use ($workspace, $request, $token): Media {
$media = $workspace->addMedia($request->file('media'), 'assets');
$media->upload_token = $token;
$media->save();
return $media;
});
return response()->json([
'upload_token' => $token,

View file

@ -14,6 +14,9 @@ public function authorize(): bool
return true;
}
/**
* @return array<string, mixed>
*/
public function rules(): array
{
$allowed = implode(',', array_merge(

View file

@ -38,13 +38,18 @@ function signedUploadUrl(Workspace $ws, string $token, ?int $expiresInMinutes =
'media' => $file,
]);
$response->assertCreated()
->assertJsonStructure(['upload_token', 'media_id', 'type', 'mime_type', 'original_filename']);
$media = Media::where('upload_token', $token)->first();
expect($media)->not->toBeNull();
expect($media->mediable_id)->toBe($this->workspace->id);
expect($media->mediable_type)->toBe('workspace');
$response->assertCreated()
->assertJson([
'upload_token' => $token,
'media_id' => $media->id,
'mime_type' => $media->mime_type,
'original_filename' => $media->original_filename,
]);
});
test('rejects unsigned request', function () {