Saltar al contenido principal

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