Multimedia y Archivos
La API de Multimedia y Archivos gestiona el almacenamiento, procesamiento e indexación de archivos multimedia (ej. imágenes de productos, banners, documentos adjuntos) utilizando Google Cloud Storage u otros proveedores de almacenamiento.
Flujo de Subida de Archivos
La subida de archivos sigue un flujo de dos pasos para evitar que el tráfico pesado pase por los servidores de la aplicación Go:
sequenceDiagram
Client->>Go API: POST /api/v1/media/upload
Go API-->>Client: 201 Created (File ID + Presigned GCS URL)
Client->>GCS Storage: PUT (Subida binaria del archivo)
GCS Storage-->>Client: 200 OK
Client->>Go API: POST /api/v1/media/:id/confirm
Go API-->>Client: 200 OK (File Status: uploaded)
Endpoints
1. Iniciar subida
Genera un registro temporal en la base de datos y retorna una URL de subida firmada directamente hacia el almacenamiento en la nube (GCS).
POST /api/v1/media/upload
Payload de entrada:
{
"original_name": "polo_rojo.jpg",
"content_type": "image/jpeg",
"size_bytes": 1048576
}
Respuesta 201 Created:
{
"data": {
"file_id": "a9c3d2b2-f046-40d3-852f-423089c73ba3",
"upload_url": "https://storage.googleapis.com/omnibuy-media-bucket/tenants/mi-tienda/a9c3d2b2-f046-40d3-852f-423089c73ba3?GoogleAccessId=...",
"expires_at": "2026-06-02T21:00:00Z"
}
}
Nota: La URL firmada expira en un periodo corto (normalmente 15 minutos).
2. Confirmar subida
Se llama después de realizar con éxito la subida directa a la URL firmada. Marca el archivo en estado uploaded (subido) y activa el procesamiento asíncrono (ej. generación de variantes optimizadas para web).
POST /api/v1/media/:id/confirm
Respuesta 200 OK:
{
"data": {
"id": "a9c3d2b2-f046-40d3-852f-423089c73ba3",
"tenant_id": "8a1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"original_name": "polo_rojo.jpg",
"storage_key": "tenants/mi-tienda/a9c3d2b2-f046-40d3-852f-423089c73ba3",
"content_type": "image/jpeg",
"size_bytes": 1048576,
"status": "uploaded",
"alt_text": "",
"variants": [],
"public_url": "https://storage.googleapis.com/omnibuy-media-bucket/tenants/mi-tienda/a9c3d2b2-f046-40d3-852f-423089c73ba3",
"created_at": "2026-06-02T20:45:00Z",
"updated_at": "2026-06-02T20:45:10Z"
}
}
3. Listar archivos
Retorna la lista de archivos registrados para el tenant.
GET /api/v1/media
Soporta paginación por cursores.
4. Obtener archivo
GET /api/v1/media/:id
5. Actualizar texto alternativo (Alt Text)
Modifica el campo de accesibilidad para la imagen.
PATCH /api/v1/media/:id/alt-text
Payload de entrada:
{
"alt_text": "Polo rojo clásico de algodón Pima"
}
Respuesta 200 OK
6. Agregar variante procesada
Añade información de una versión procesada de la imagen (ej. miniatura, versión optimizada webp). Este endpoint suele ser consumido por workers de procesamiento en segundo plano.
POST /api/v1/media/:id/variants
Payload de entrada:
{
"name": "thumbnail",
"storage_key": "tenants/mi-tienda/variants/a9c3d2b2-f046-40d3-852f-423089c73ba3_thumb.jpg",
"width": 150,
"height": 150,
"size_bytes": 12450,
"public_url": "https://storage.googleapis.com/omnibuy-media-bucket/tenants/mi-tienda/variants/a9c3d2b2-f046-40d3-852f-423089c73ba3_thumb.jpg"
}
Respuesta 200 OK
7. Registrar fallo de procesamiento o subida
Marca el archivo en estado failed en caso de errores en la red o en las colas de conversión.
POST /api/v1/media/:id/fail
Payload de entrada:
{
"reason": "La conversión de formato no pudo completarse (imagen corrupta)."
}
Respuesta 200 OK
8. Eliminar archivo
Elimina el archivo de la base de datos y lo remueve del almacenamiento persistente en la nube (GCS).
DELETE /api/v1/media/:id
Respuesta 204 No Content