Subidas a almacenamiento privado
Configura subidas privadas S3 con políticas, entitlement, cuota, checksum y borrado duradero.
Sincronizado con el commit
7d452a6del starter.
Define STORAGE_PROVIDER como s3, r2 o minio y configura bucket, región, endpoint y credenciales. Los objetos son privados; el navegador recibe URLs firmadas breves, nunca credenciales. Configura CORS para el origen web y headers PUT; evita ACL salvo que el proveedor las exija.
Contrato
POST /api/storage/uploadsvalida organización,storage.upload, política (general,images,documents,verified), tipo y el menor límite entre plan, entorno y política; reserva cuota atómicamente.- El navegador hace PUT directo; XHR solo expone progreso.
POST /api/storage/uploads/completeverifica metadatos y SHA-256 opcional y activa la fila.GET /api/storage/files/[uuid]?download=1entrega URL de descarga limitada a la organización.DELETE /api/storage/files/[uuid]hace soft-delete y programastorage_object_deleteduradero.
Las subidas abandonadas liberan reserva tras una hora. El borrado reintenta por la cola, así que cron debe funcionar. El servicio genera las keys; el cliente no elige keys del bucket.
Prueba flujo completo, MIME/checksum incorrecto, carreras de cuota, URL caducada, acceso cruzado, reintento y limpieza. Consulta docs/storage-providers.md del starter para CORS.