Skip to main content

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.

CampoTipoDescripción
_idObjectIdID de MongoDB
identifierstring (UUID)ID externo único; es el que usan las rutas con :id
tenantIdObjectId → TenantTenant
shortcutstringAtajo de texto; único por tenant
messagestringTexto de la respuesta
departmentIdsObjectId[] → DepartmentDepartamentos donde aplica (por defecto lista vacía en el modelo, pero el DTO exige al menos uno)
isActivebooleanPor defecto true
createdAt / updatedAtDateTimestamps

Í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étodoRutaPermisoDescripción
POST/quick-responses/createQUICK_RESPONSE_CREATECrea una plantilla
GET/quick-responses/get-allQUICK_RESPONSE_READLista; paginada si se envían page y limit
GET/quick-responses/get-one/:idQUICK_RESPONSE_READObtiene una plantilla
PATCH/quick-responses/update/:idQUICK_RESPONSE_UPDATEActualiza
PATCH/quick-responses/toggle-active/:idQUICK_RESPONSE_UPDATEInvierte isActive
DELETE/quick-responses/remove/:idQUICK_RESPONSE_DELETEElimina

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ámetroTipoObligatorioValidaciónUsado en
idstringSíNinguna; se busca por identifier (UUID), no por _idget-one/:id, update/:id, toggle-active/:id, remove/:id

CreateQuickResponseDto (body de POST /quick-responses/create)​

CampoTipoObligatorioValidacionesDescripción
shortcutstringSí@IsString, @MinLength(1), @MaxLength(50)Atajo; si ya existe en el tenant responde 409
messagestringSí@IsString, @MinLength(1), @MaxLength(1000)Texto de la respuesta
departmentIdsstring[]Sí@IsArray, @ArrayMinSize(1), @IsMongoId({ each: true })Departamentos; todos deben existir en el tenant (se eliminan duplicados), si no 400
isActivebooleanNo@IsBooleanPor 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.

CampoTipoObligatorioValidacionesDescripción
pagenumberNo@Type(() => Number), @IsInt, @Min(1)Página
limitnumberNo@Type(() => Number), @IsInt, @Min(1)Tamaño de página
shortcutstringNo@IsStringBúsqueda parcial por atajo (regex escapada, insensible a mayúsculas)
searchstringNo@IsStringBusca en shortcut y message; tiene prioridad sobre shortcut
isActivebooleanNo@Transform ('true' o true produce true; null o ausente queda sin filtro), @IsBooleanFiltra por estado
ticketIdstringNo@IsMongoIdRestringe 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 page y limit.
  • Con ticketId, el resultado siempre incluye solo plantillas activas, aunque se envíe isActive=false.
  • No existe el modelo anterior con title y body: el esquema real usa shortcut, message y departmentIds.
  • Un id de ruta que no sea el UUID identifier produce 404.