Rutas y layouts
Árbol raíz
app-routing.module.ts define cuatro rutas, con anchorScrolling: "enabled" y scrollPositionRestoration: "enabled":
| Ruta | Destino |
|---|---|
"" (exacta) | Redirige a whaticket/chat |
"" con ContentComponent | Hijos de shared/routes/content.routes.ts (área autenticada) |
"" con FullComponent | Hijos de shared/routes/full.routes.ts (solo auth) |
** | Redirige a auth/login |
ContentComponent(shared/components/layout/content) es el shell autenticado: header, sidebar y, al tener perfil cargado, abre los dos sockets (InternalChatSocketService.connectyChatSocketService.connect) y despachaInternalChatActions.loadConversations. Al destruirse los desconecta. El layout visual se elige con el query paramlayout(Dubai,London,Seoul,Paris,Tokyo,Madrid,Moscow,NewYork,Rome).FullComponentes el layout sin chrome para login.
Módulos lazy del layout autenticado
Todos se cargan con loadChildren: () => import(...). La columna Permiso es el acrónimo de data.permission evaluado por permissionGuard; "solo AuthGuard" significa que la ruta no exige permiso.
PAGE_URLS | Módulo | Guards | Permiso |
|---|---|---|---|
dashboard | DashboardModule | AuthGuard | solo AuthGuard |
access-control/roles | RolesModule | AuthGuard, permissionGuard | ACCESS_CONTROL_READ |
access-control/permissions | PermissionsModule | idem | ACCESS_CONTROL_READ |
access-control/role-permissions | RolePermissionsModule | idem | ACCESS_CONTROL_READ |
access-control/modules | ModulesModule | idem | ACCESS_CONTROL_READ |
access-control/permissions-builder | PermissionsBuilderModule | idem | ACCESS_CONTROL_READ |
whaticket | WhaticketModule | AuthGuard | solo AuthGuard |
internal-chat | InternalChatModule | AuthGuard | solo AuthGuard |
labels | LabelsModule | AuthGuard, permissionGuard | LABEL_READ |
scheduled-messages | ScheduledMessagesModule | idem | MESSAGE_READ |
locked-tickets | LockedTicketsModule | idem | TICKET_UNLOCK_ANY |
quick-responses | QuickResponsesModule | idem | QUICK_RESPONSE_READ |
contacts | ContactsModule | idem | CONTACT_READ |
users | UsersModule | idem | USER_READ |
profile | ProfileModule | AuthGuard | solo AuthGuard |
departments | DepartmentsModule | AuthGuard, permissionGuard | DEPARTMENT_READ |
connections | ConnectionsModule | AuthGuard, permissionGuard | CONNECTION_READ |
settings | SettingsModule | AuthGuard, permissionGuard | SETTINGS_READ |
Rutas anidadas dentro de los módulos:
| Ruta completa | Módulo hijo | Permiso |
|---|---|---|
whaticket/chat | ChatModule (features/whaticket/chat) | TICKET_READ |
internal-chat/conversations | conversations.module.ts | INTERNAL_CHAT_READ |
profile/starred-messages | starred-messages | sin permiso |
Cada módulo de feature repite la guarda en su propio *-routing.module.ts (por ejemplo ConnectionsRoutingModule usa canActivate: [permissionGuard] con data: { permission: 'CONNECTION_READ' }). La ruta de settings, además, suma AuthGuard y AdminGuard en su routing de feature (settings-routing.module.ts), de modo que exige tipo de usuario admin además del permiso.
Layout de autenticación
features/auth/auth.module.ts, cargado bajo auth:
| Ruta | Componente | Guard |
|---|---|---|
auth/login | LoginComponent | LoggedInAuthGuard (si ya hay sesión vigente redirige a /) |
auth/reconnect | ReconnectComponent | — (pantalla a la que se envía en modo iframe cuando falla la sesión) |
Guards
| Guard | Archivo | Comportamiento |
|---|---|---|
AuthGuard | core/guards/auth.guard.ts | Si la sesión expiró: en iframe deja pasar (espera el handshake postMessage); fuera de iframe despacha userLogout y va a /auth/login |
LoggedInAuthGuard | core/guards/loggedIn.guard.ts | Evita mostrar login con sesión activa |
AdminGuard | core/guards/admin.guard.ts | Compara userType del perfil con 'admin' (TYPES_USER_PERMISSIONS.ADMIN); si no, redirige a /dashboard |
permissionGuard | core/guards/permission.guard.ts | Guard funcional; lee route.data['permission'] y consulta MyPermissionsService; si falla o se niega navega a /profile/profile-detail (ver nota) |
:::caution Destino de redirección sin ruta
permissionGuard navega a /profile/profile-detail, pero profile-routing.module.ts solo define '' y starred-messages. Esa URL cae en el comodín **, que redirige a auth/login; como LoggedInAuthGuard rechaza el login con sesión vigente y envía a / (que redirige a whaticket/chat). El spec del guard (permission.guard.spec.ts) fija la URL /profile/profile-detail.
:::
Detalle de permisos en Auth, interceptores y RBAC.
Menú lateral
El sidebar se alimenta de MENU_ITEMS en core/helpers/ui/nav.constant.ts. Cada ítem puede llevar permission; los ítems sin permission (Dashboard, Chat interno, Mensajes destacados, contenedores de submenú) se muestran siempre. Elementos presentes: Dashboard, Control de acceso (5 subítems), Mensajería (Chats, Chat interno, Mensajes destacados, Tickets bloqueados), Conexiones, Contactos, Usuarios, Etiquetas, Respuestas rápidas, Departamentos y Configuración. Mensajes programados no figura en el menú (la ruta existe en content.routes.ts).