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.
| Campo | Tipo | Descripción |
|---|---|---|
_id | ObjectId | ID de MongoDB |
tenantId | ObjectId → Tenant | Tenant propietario |
name | string | Nombre de la etiqueta |
color | string | Color hexadecimal |
description | string | Descripción (por defecto vacía) |
isActive | boolean | Por defecto true |
createdAt / updatedAt | Date | Timestamps |
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étodo | Ruta | Permiso | Descripción |
|---|---|---|---|
POST | /labels/create | LABEL_CREATE | Crea una etiqueta |
GET | /labels/get-all | LABEL_READ | Lista; paginada si se envían page y limit |
GET | /labels/get-one/:id | LABEL_READ | Obtiene una etiqueta |
PATCH | /labels/update/:id | LABEL_UPDATE | Actualiza una etiqueta |
DELETE | /labels/remove/:id | LABEL_DELETE | Elimina 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ámetro | Tipo | Obligatorio | Validación | Usado en |
|---|---|---|---|---|
id | string | Sí | Ninguna en el controlador; _id de MongoDB | get-one/:id, update/:id, remove/:id |
CreateLabelDto (body de POST /labels/create)
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
name | string | Sí | @IsString, @MinLength(1), @MaxLength(100) | Nombre; si ya existe en el tenant, el servicio responde 409 |
color | string | Sí | @IsHexColor | Color hexadecimal |
description | string | No | @IsString, @MaxLength(500) | Descripción |
isActive | boolean | No | @IsBoolean | Por 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)
| 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 |
name | string | No | @IsString | Regex insensible a mayúsculas |
color | string | No | @IsHexColor | Filtro por color |
isActive | boolean | No | @Transform ('true' o true produce true; ausente queda sin filtro), @IsBoolean | Filtro por estado |
La paginación solo se aplica si llegan ambos page y limit.
Gotchas
- El modelo no tiene
icon: usadescription. - Las etiquetas se asignan a un contacto con
PATCH /contacts/:id/assign-labels(ver Contact).