Adjunta y envía un archivo en una conversación — requiere valchat-inbox:manage
El agente adjunta un archivo desde el Inbox — lo sube, se guarda y se manda. Mismo permiso que `POST conversations/:id/messages` (`valchat-inbox:manage`, ver `whatsapp.controller.ts`): adjuntar un archivo es la misma acción que mandar texto, solo cambia el contenido. Mismo techo duro de `limits.fileSize` que `receiveFromWorker` (el de documento, el más alto) — el chequeo por-tipo real corre después en `WhatsappMediaService.saveFromPath`; esto solo evita escribir a disco un upload desproporcionado antes de llegar ahí. Esta ruta SÍ pasa por `JwtAuthGuard`/`CheckPermission` (no es `@Public()`), así que el riesgo de disco-lleno de un caller no autenticado no aplica acá — igual se limpia el temporal en el único rechazo temprano posible (`!file`, que en la práctica no debería dejar nada escrito).
El agente adjunta un archivo desde el Inbox — lo sube, se guarda y se
manda. Mismo permiso que POST conversations/:id/messages
(valchat-inbox:manage, ver whatsapp.controller.ts): adjuntar un
archivo es la misma acción que mandar texto, solo cambia el contenido.
Mismo techo duro de limits.fileSize que receiveFromWorker (el de
documento, el más alto) — el chequeo por-tipo real corre después en
WhatsappMediaService.saveFromPath; esto solo evita escribir a disco un
upload desproporcionado antes de llegar ahí. Esta ruta SÍ pasa por
JwtAuthGuard/CheckPermission (no es @Public()), así que el riesgo de
disco-lleno de un caller no autenticado no aplica acá — igual se limpia
el temporal en el único rechazo temprano posible (!file, que en la
práctica no debería dejar nada escrito).
Authorization
bearer Ingresa tu access token JWT (sin el prefijo Bearer)
In: header
Path Parameters
Response Body
application/json
curl -X POST "https://example.com/api/v1/whatsapp/conversations/string/media"{}Worker de WhatsApp — sube los bytes de un adjunto entrante POST
El worker sube los bytes de un adjunto entrante ANTES de mandar el webhook JSON de `inbound` — mismo secreto que `/whatsapp/worker/*`. La API decide el nombre final (`WhatsappMediaService.save`), nunca confía en uno que venga en el multipart. `limits.fileSize` en el interceptor corta un upload gigante ANTES de que multer lo termine de escribir a disco — el chequeo por-tipo de `WhatsappMediaService.saveFromPath` (16MB imagen/audio/video, 100MB documento) corre después, con el archivo ya completo en el temporal; este límite es solo el techo duro global (el de documento, el más alto) para no confiar en que un caller no autenticado no mande algo desproporcionado antes de que el bearer se valide.
Descarga/muestra un adjunto de WhatsApp — requiere valchat-inbox:read GET
Sirve un adjunto al dashboard. Autenticado con JWT normal (no el bearer del worker) — exige `valchat-inbox:read` y que el mensaje sea del tenant del usuario (el `where` de abajo lleva `tenantId` del JWT, nunca del caller). Nunca hay una URL pública para esto.