Skip to main content

Módulo Departments

src/app/modules/departments/

Gestiona los departamentos del tenant (equipos de atención) y la pertenencia de usuarios a cada uno. Cada departamento define su mensaje de bienvenida, la política de asignación automática, si se exige motivo de contacto y su propia regla de auto-resolución de tickets.

Modelos​

Department (colección departments)​

CampoTipoDescripción
tenantIdObjectId → TenantTenant propietario
namestringNombre
colorstringColor hexadecimal (por defecto #000000)
greetingMessagestringMensaje de bienvenida (por defecto vacío)
autoAssignmentbooleanAsignación automática de chats (por defecto false)
assignOfflineUsersbooleanPermite asignar a usuarios desconectados (por defecto false)
redistributeChatsbooleanRedistribuye chats (por defecto false)
contactReasonRequirementenumnone, optional o required (por defecto none)
overrideGlobalResolutionbooleanSi es true, usa autoResolution en lugar de la configuración global (por defecto false)
autoResolutionsubdocumentoVer a continuación

Subdocumento autoResolution (sin _id):

CampoPor defectoDescripción
enabledfalseActiva la auto-resolución
sendFarewellMessagetrueEnvía mensaje de despedida al resolver
resolveInMinutes5Minutos de inactividad hasta resolver
notifyInMinutes1Minutos de aviso previo
notificationMessagevacíoTexto del aviso

DepartmentUser (colección department_users)​

Relación usuario-departamento, sin timestamps.

CampoTipoDescripción
tenantIdObjectId → Tenant—
departmentIdObjectId → Department—
userIdObjectId → User—
assignToDepartmentbooleanEl usuario es miembro del departamento
autoAssignbooleanEl usuario participa en la asignación automática

Índices: (departmentId, tenantId) y (userId, tenantId).

Endpoints​

Base: /api/v1/departments. Controlador con @Auth() y PermissionsGuard; todo se filtra por el tenantId del usuario autenticado.

MétodoRutaPermisoDescripción
POST/departments/createDEPARTMENT_CREATECrea un departamento
GET/departments/get-allDEPARTMENT_READLista; paginada si se envían page y limit
GET/departments/get-one/:idDEPARTMENT_READObtiene uno por _id
PATCH/departments/update/:idDEPARTMENT_UPDATEActualiza
DELETE/departments/remove/:idDEPARTMENT_DELETEElimina el departamento y sus relaciones
GET/departments/:id/usersDEPARTMENT_READUsuarios del tenant con su estado en el departamento
PATCH/departments/:id/usersDEPARTMENT_UPDATEReemplaza o actualiza la pertenencia de usuarios

get-all acepta name (regex insensible a mayúsculas), userId (restringe a los departamentos donde ese usuario tiene assignToDepartment) y page/limit. Con paginación devuelve data.meta { total, page, limit }.

DTOs​

Las validaciones corresponden a class-validator (ValidationPipe global). "Opcional" significa que el campo lleva @IsOptional().

Parámetros de ruta​

ParámetroTipoObligatorioValidaciónUsado en
idstringSíNinguna; se convierte con new Types.ObjectId(id)get-one/:id, update/:id, remove/:id, :id/users (GET y PATCH)

CreateDepartmentDto (body de POST /departments/create)​

CampoTipoObligatorioValidacionesDescripción
namestringSí@IsString, @IsNotEmptyNombre del departamento
colorstringNo@IsHexColorColor hexadecimal; por defecto #000000 en el modelo
greetingMessagestringNo@IsStringMensaje de bienvenida
autoAssignmentbooleanNo@IsBooleanAsignación automática
assignOfflineUsersbooleanNo@IsBooleanAsignar a usuarios desconectados
redistributeChatsbooleanNo@IsBooleanRedistribuir chats
contactReasonRequirementstringNo@IsEnum: none, optional, requiredExigencia de motivo de contacto
overrideGlobalResolutionbooleanNo@IsBooleanUsar la auto-resolución propia en lugar de la global
autoResolutionAutoResolutionDtoNo@ValidateNested, @TypeConfiguración de auto-resolución

AutoResolutionDto (anidado en autoResolution)​

CampoTipoObligatorioValidacionesDescripción
enabledbooleanNo@IsBooleanActiva la auto-resolución
sendFarewellMessagebooleanNo@IsBooleanEnviar despedida al resolver
resolveInMinutesnumberNo@IsInt, @Min(1)Minutos hasta resolver
notifyInMinutesnumberNo@IsInt, @Min(1)Minutos de aviso previo
notificationMessagestringNo@IsStringTexto del aviso

UpdateDepartmentDto (body de PATCH /departments/update/:id)​

PartialType(CreateDepartmentDto): mismos campos y validaciones, todos opcionales (incluido name).

QueryDepartmentDto (query de GET /departments/get-all)​

Combina paginación y filtros con IntersectionType.

CampoTipoObligatorioValidacionesDescripción
pagenumberNo@IsInt, @Min(1), @Type(() => Number)Página; la paginación solo se aplica si llegan page y limit
limitnumberNo@IsInt, @Min(1), @Type(() => Number)Tamaño de página
namestringNo@IsStringFiltro por nombre (regex insensible a mayúsculas)
userIdstringNo@IsMongoIdRestringe a departamentos donde el usuario tiene assignToDepartment

UpdateDepartmentUsersDto (body de PATCH /departments/:id/users)​

CampoTipoObligatorioValidacionesDescripción
usersDepartmentUserEntryDto[]Sí@IsArray, @ValidateNested({ each: true }), @TypeEntradas a actualizar

DepartmentUserEntryDto:

CampoTipoObligatorioValidacionesDescripción
userIdstringSí@IsMongoIdUsuario
assignToDepartmentbooleanNo@IsBooleanMiembro del departamento; si se omite se guarda false
autoAssignbooleanNo@IsBooleanParticipa en la asignación automática; si se omite se guarda false

Servicios​

  • DepartmentService: CRUD por tenant. Si llega userId en el filtro, primero resuelve los departamentos del usuario en DepartmentUserRepository y luego restringe el listado. remove borra el departamento y después sus registros DepartmentUser.
  • DepartmentUserService: getUsersForDepartment combina todos los usuarios del tenant con las asignaciones del departamento (los flags faltantes quedan en false) y devuelve userId, username, email, assignToDepartment y autoAssign. updateUsersForDepartment hace upsert por cada entrada recibida y devuelve la lista actualizada.

Gotchas​

  • El :id de las rutas es el _id de MongoDB y se convierte con new Types.ObjectId(id) sin validar antes: un id mal formado produce un error no controlado en lugar de un 404.
  • PATCH /:id/users hace upsert solo de las entradas enviadas; no elimina a los usuarios ausentes del arreglo, y un flag omitido se sobrescribe con false.
  • El DepartmentsModule exporta repositorios y servicios y otros módulos lo importan (por ejemplo internal-chat, quick-response, meta y el job de inactividad de tickets).