Skip to main content

Módulo Label

src/app/modules/label/

Etiquetas para categorizar contactos (ver Contact) y motivos de contacto de tickets.

Modelo — Label​

Colección labels, con timestamps. Índice único (name, tenantId): el nombre no se repite dentro de un tenant.

CampoTipoDescripción
_idObjectIdID de MongoDB
tenantIdObjectId → TenantTenant propietario
namestringNombre de la etiqueta
colorstringColor hexadecimal
descriptionstringDescripción (por defecto vacía)
isActivebooleanPor defecto true
createdAt / updatedAtDateTimestamps

Endpoints​

Base: /api/v1/labels. Controlador con @Auth() y PermissionsGuard; todo se limita al tenant del usuario. Las operaciones con :id usan el _id de MongoDB.

MétodoRutaPermisoDescripción
POST/labels/createLABEL_CREATECrea una etiqueta
GET/labels/get-allLABEL_READLista; paginada si se envían page y limit
GET/labels/get-one/:idLABEL_READObtiene una etiqueta
PATCH/labels/update/:idLABEL_UPDATEActualiza una etiqueta
DELETE/labels/remove/:idLABEL_DELETEElimina una etiqueta

Con paginación la respuesta incluye data.meta { total, page, limit }.

DTOs​

Validaciones de class-validator. Límites de LABEL_VALIDATION.

Parámetros de ruta​

ParámetroTipoObligatorioValidaciónUsado en
idstringSíNinguna en el controlador; _id de MongoDBget-one/:id, update/:id, remove/:id

CreateLabelDto (body de POST /labels/create)​

CampoTipoObligatorioValidacionesDescripción
namestringSí@IsString, @MinLength(1), @MaxLength(100)Nombre; si ya existe en el tenant, el servicio responde 409
colorstringSí@IsHexColorColor hexadecimal
descriptionstringNo@IsString, @MaxLength(500)Descripción
isActivebooleanNo@IsBooleanPor defecto true

tenantId lo toma el controlador del usuario autenticado.

UpdateLabelDto (body de PATCH /labels/update/:id)​

Mismos campos que CreateLabelDto, todos opcionales (@IsOptional). Si cambia name y otra etiqueta del tenant ya lo usa, el servicio responde 409.

QueryLabelDto / FilterLabelDto (query de GET /labels/get-all)​

CampoTipoObligatorioValidacionesDescripción
pagenumberNo@Type(() => Number), @IsInt, @Min(1)Página
limitnumberNo@Type(() => Number), @IsInt, @Min(1)Tamaño de página
namestringNo@IsStringRegex insensible a mayúsculas
colorstringNo@IsHexColorFiltro por color
isActivebooleanNo@Transform ('true' o true produce true; ausente queda sin filtro), @IsBooleanFiltro por estado

La paginación solo se aplica si llegan ambos page y limit.

Gotchas​

  • El modelo no tiene icon: usa description.
  • Las etiquetas se asignan a un contacto con PATCH /contacts/:id/assign-labels (ver Contact).