Módulo Quick Response
src/app/modules/quick-response/
Plantillas de respuesta rápida que los agentes pueden insertar mediante un atajo (shortcut). Cada plantilla se asocia a uno o más departamentos y puede filtrarse por el departamento de un ticket.
Modelo — QuickResponse
Colección quick-responses, con timestamps.
| Campo | Tipo | Descripción |
|---|---|---|
_id | ObjectId | ID de MongoDB |
identifier | string (UUID) | ID externo único; es el que usan las rutas con :id |
tenantId | ObjectId → Tenant | Tenant |
shortcut | string | Atajo de texto; único por tenant |
message | string | Texto de la respuesta |
departmentIds | ObjectId[] → Department | Departamentos donde aplica (por defecto lista vacía en el modelo, pero el DTO exige al menos uno) |
isActive | boolean | Por defecto true |
createdAt / updatedAt | Date | Timestamps |
Índices: único (shortcut, tenantId) y (tenantId, departmentIds).
Endpoints
Base: /api/v1/quick-responses. Controlador con @Auth() y PermissionsGuard; todo se filtra por el tenant del usuario.
| Método | Ruta | Permiso | Descripción |
|---|---|---|---|
POST | /quick-responses/create | QUICK_RESPONSE_CREATE | Crea una plantilla |
GET | /quick-responses/get-all | QUICK_RESPONSE_READ | Lista; paginada si se envían page y limit |
GET | /quick-responses/get-one/:id | QUICK_RESPONSE_READ | Obtiene una plantilla |
PATCH | /quick-responses/update/:id | QUICK_RESPONSE_UPDATE | Actualiza |
PATCH | /quick-responses/toggle-active/:id | QUICK_RESPONSE_UPDATE | Invierte isActive |
DELETE | /quick-responses/remove/:id | QUICK_RESPONSE_DELETE | Elimina |
Con paginación, la respuesta incluye data.meta { total, page, limit }.
DTOs
Validaciones de class-validator. Los límites provienen de QUICK_RESPONSE_VALIDATION.
Parámetros de ruta
| Parámetro | Tipo | Obligatorio | Validación | Usado en |
|---|---|---|---|---|
id | string | Sí | Ninguna; se busca por identifier (UUID), no por _id | get-one/:id, update/:id, toggle-active/:id, remove/:id |
CreateQuickResponseDto (body de POST /quick-responses/create)
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
shortcut | string | Sí | @IsString, @MinLength(1), @MaxLength(50) | Atajo; si ya existe en el tenant responde 409 |
message | string | Sí | @IsString, @MinLength(1), @MaxLength(1000) | Texto de la respuesta |
departmentIds | string[] | Sí | @IsArray, @ArrayMinSize(1), @IsMongoId({ each: true }) | Departamentos; todos deben existir en el tenant (se eliminan duplicados), si no 400 |
isActive | boolean | No | @IsBoolean | Por defecto true |
tenantId lo toma el controlador del usuario autenticado.
UpdateQuickResponseDto (body de PATCH /quick-responses/update/:id)
Mismos campos y validaciones que el de creación, todos opcionales (@IsOptional). Si cambia shortcut y ya lo usa otra plantilla, responde 409. Si llega departmentIds, se revalida (al menos uno y todos del tenant).
QueryQuickResponseDto (query de GET /quick-responses/get-all)
Extiende FilterQuickResponseDto con paginación.
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
page | number | No | @Type(() => Number), @IsInt, @Min(1) | Página |
limit | number | No | @Type(() => Number), @IsInt, @Min(1) | Tamaño de página |
shortcut | string | No | @IsString | Búsqueda parcial por atajo (regex escapada, insensible a mayúsculas) |
search | string | No | @IsString | Busca en shortcut y message; tiene prioridad sobre shortcut |
isActive | boolean | No | @Transform ('true' o true produce true; null o ausente queda sin filtro), @IsBoolean | Filtra por estado |
ticketId | string | No | @IsMongoId | Restringe a las plantillas del departamento del ticket y fuerza isActive = true; si el ticket no existe o no tiene departamento, devuelve lista vacía |
Gotchas
- La paginación solo se aplica si llegan ambos
pageylimit. - Con
ticketId, el resultado siempre incluye solo plantillas activas, aunque se envíeisActive=false. - No existe el modelo anterior con
titleybody: el esquema real usashortcut,messageydepartmentIds. - Un
idde ruta que no sea el UUIDidentifierproduce404.