Skip to content

Subida de avatar de agente (S3 presign)

El panel no envía el binario al endpoint de agentes. El flujo es:

  1. PresignPOST /storage/documents/upload con el body validado por uploadDocumentSchema (name, size, contentType, fileRouteType). Para avatares se usa fileRouteType: AVATAR (FileRouteType en @repo/schemas).
  2. S3 — Se arma un FormData con todas las entradas de fields y, al final, formData.set('file', file). Se hace POST a la url con XMLHttpRequest + send(formData) (cuerpo multipart, no JSON; no fijar Content-Type a mano). No usar el apiClient de Axios para esta petición (evitar cabeceras de auth).
  3. Agente — Tras un upload correcto, se toma la key desde fields.key y se envía en createAgent / updateAgent como avatar. La API es la que resuelve dominio + key para las respuestas con URL pública.

Implementación de referencia: storage-documents.service.ts y helpers en s3-presigned-upload.ts. El diálogo de crear/editar agente sube solo si el usuario eligió un archivo nuevo (avatarFile en el formulario); en edición, si no hay archivo nuevo, no se envía avatar en el PATCH para no sobrescribir con una URL de preview.

Para mostrar avatares cuando la API devuelve solo la key S3, el panel usa VITE_PUBLIC_STORAGE_URL (origen del bucket público, sin / final) y resolvePublicStorageObjectUrl en public-storage-url.ts. Ver apps/panel/.env.example.