Skip to main content

Conexiones (features/connections)

Pantalla de administración de los canales del tenant: Web (widget), WhatsApp por QR e Instagram. Esta página es el índice de la feature; el detalle de cada componente, el modelo de canal y el flujo OAuth ya están documentados en la sección Meta y conexiones y no se repiten aquí. El backend de los endpoints está en Connection y Meta.

Ruta y permisos​

  • shared/routes/content.routes.ts carga ConnectionsModule bajo connections (PAGE_URLS.CONNECTIONS) con canActivate: [AuthGuard, permissionGuard] y data: { permission: 'CONNECTION_READ' }.
  • connections-routing.module.ts repite permissionGuard y el mismo permiso en la ruta vacía, que renderiza ConnectionsPageComponent.
  • Menú lateral: ítem connections (sidebarMenu.connections) con permission: 'CONNECTION_READ' en core/helpers/ui/nav.constant.ts.
AcrónimoEfecto en la UI
CONNECTION_READRuta y menú
CONNECTION_CREATEBotón "+" (selector de canal) y "Reautorizar" de Instagram
CONNECTION_UPDATEEditar, código de instalación, "Reconectar"
CONNECTION_DELETEEliminar y "Cerrar sesión" de WhatsApp

Todos se aplican con *appShowWithPermission en connections-table.component.html.

Archivos​

ArchivoRolDocumentación
connections.module.ts, connections-routing.module.tsDeclaran 7 componentes; importan NgbDropdownModule, NgbModalModule, NgbTooltipModule, NgSelectModule, TranslateModule, SharedModuleEsta página
connections.constants.tsCHANNEL_TYPE, CONNECTION_CHANNELS (web, WhatsApp QR e Instagram con enabled: true; WhatsApp Cloud y Facebook con enabled: false), insignias de estado, constantes del retorno OAuth (META_OAUTH_QUERY, META_OAUTH_RESULT, META_OAUTH_REASONS), META_NOT_CONFIGURED_CODE e INSTAGRAM_EXPIRY_WARNING_DAYS = 7Iconos de canal, OAuth de Instagram
pages/connections-pageBreadcrumb y tabla; sin lógicaUI de conexiones
components/connections-tableGrilla de tarjetas, paginación incremental, estado de sesión en vivo y acciones por canalUI de conexiones
components/connections-filterFiltro por nombre y canalUI de conexiones
components/connection-channel-modalSelector de canal (los deshabilitados muestran "Próximamente")UI de conexiones
components/connection-web-modalAlta, edición y snippet del widgetUI de conexiones
components/connection-whatsapp-modalQR y formulario de atenciónUI de conexiones
components/connection-instagram-modalConfiguración posterior al OAuthOAuth de Instagram

Servicios​

ConnectionService (core/services/api/connection.service.ts) concentra los endpoints /connections/* y POST /meta/oauth/instagram/authorize; la tabla completa de métodos está en UI de conexiones. El estado de la sesión de WhatsApp llega por ChatSocketService (whatsapp_qr y whatsapp_session_status, ver Sockets). La feature no usa un slice de NgRx: cada tabla mantiene su lista en memoria y recarga al cerrar un modal con closed.

Pruebas​

SpecCubre
components/connections-table/connections-table.component.spec.tsEnrutado del selector hacia el modal de WhatsApp, recarga al cerrar, parche en sitio de la tarjeta con whatsappSessionStatus$, estado por defecto init, "Cerrar sesión" solo tras confirmar
components/connection-whatsapp-modal/connection-whatsapp-modal.component.spec.tsAlta + arranque de sesión, reconexión sin recrear, eventos de socket filtrados por connectionId, avance al formulario tras connected, guardado de los seis campos y limpieza de conexiones huérfanas al destruir

No hay specs para los modales web e Instagram, el filtro ni el selector de canal.

Gotchas​

  • La constante INSTAGRAM_EXPIRY_WARNING_DAYS (7) y las de retorno OAuth se leen desde la tabla; el retorno de Meta llega como query params en /connections (ver OAuth de Instagram).
  • Cerrar el modal de WhatsApp sin guardar ni emparejar elimina la conexión que ese mismo modal creó.
  • Los canales deshabilitados siguen apareciendo en el filtro porque este itera CONNECTION_CHANNELS completo.
  • El token de acceso de Meta nunca llega al frontend.
  • Los iconos y colores de canal se reutilizan en el chat (ver Chat).