Módulo Dashboard
src/app/modules/dashboard/
Expone métricas agregadas del tenant (contactos, usuarios, tickets, mensajes y etiquetas) para el panel de estadísticas. No define modelos propios: el servicio consulta directamente los modelos Contact, User, Ticket, Message y Label.
Archivos
| Ruta | Rol |
|---|---|
dashboard.controller.ts | Seis endpoints GET, todos de solo lectura |
dashboard.service.ts | Consultas countDocuments y pipelines de agregación |
dashboard.module.ts | Registra los modelos con MongooseModule.forFeature e importa UserModule |
core/constants/dashboard.constants.ts | Nombres de rutas (API_ROUTES) y de query params (QUERY_STRING) |
Endpoints
Base: /api/v1/dashboard. El controlador solo usa @Auth(): no declara @RequirePermission, por lo que cualquier usuario autenticado del tenant puede consultarlos. Todas las consultas se filtran por el tenantId del usuario.
| Método | Ruta | Query | Descripción |
|---|---|---|---|
GET | /dashboard/overview | from, to | Totales de contactos, usuarios, tickets y mensajes |
GET | /dashboard/top-contacts | limit, from, to | Contactos con más tickets |
GET | /dashboard/top-users | limit, from, to | Agentes con más tickets asignados |
GET | /dashboard/top-labels | limit, from, to | Etiquetas más usadas en contactos |
GET | /dashboard/messages-timeline | from, to | Mensajes por día |
GET | /dashboard/tickets-by-type | from, to | Tickets agrupados por sendType |
Las respuestas tienen la forma { data: { results } } y no incluyen message.
Respuestas
- overview:
resultses un objeto contotalContacts,activeContacts,totalUsers,activeUsers,totalTicketsytotalMessages. - top-contacts: arreglo de
{ ticketCount, name, phone, isActive };namevaleUnknownsi el contacto no existe. - top-users: arreglo de
{ ticketCount, name, username, email };nameconcatena nombre y apellido. - top-labels: arreglo de
{ contactCount, name, color }; usaUnknowny#ccccomo valores por defecto. - messages-timeline: arreglo de
{ date, count }con fecha en formatoYYYY-MM-DD, ordenado de forma ascendente. - tickets-by-type: arreglo de
{ type, count }ordenado de mayor a menor.
DTOs y parámetros
El módulo no define DTOs: los query params se leen individualmente con @Query('from'), @Query('to') y @Query('limit'), sin class-validator ni pipes. No hay body ni parámetros de ruta.
| Parámetro (query) | Tipo | Obligatorio | Validación / conversión | Usado en |
|---|---|---|---|---|
from | string (fecha) | No | new Date(value); si es inválida se ignora en silencio. Se aplica como createdAt >= from | Todos los endpoints |
to | string (fecha) | No | Igual que from; se ajusta a las 23:59:59.999 del día (hora del servidor) y se aplica como createdAt <= to | Todos los endpoints |
limit | string numérico | No | +limit, sin validación ni tope; por defecto 10 | top-contacts, top-users, top-labels |
Gotchas
overviewaplica el filtro de fechas a contactos, tickets y mensajes, pero no a los totales de usuarios.messages-timelinesinfromnitolimita el resultado a los últimos 30 días.limitse convierte con+limitsin validación ni tope; un valor no numérico produceNaNy puede fallar el$limitdel pipeline.- Los filtros de fecha usan
createdAt, no la fecha de último movimiento del ticket. - Los
top-usersconsideran solo tickets conUserIdasignado.