Skip to content

Connections Module Overview

El módulo connections gestiona las integraciones con servicios externos que DaraMex consume — correo SMTP, bots de Telegram y servicios de Google (Gmail, Sheets, Calendar) vía OAuth 2.0.

Tras la refactor connections-redesign el contrato entre catálogo y runtime es un slug por entrada de available_connections, y cada connection apunta por FK al catálogo. Ya no existen los campos provider/type en la tabla connections.

Slugs soportados

SlugAuth typeForma del configOrigen
smtpcredentialshost, port, user, password, secureRegistry in-code
telegramcredentialsbotToken, chatId?Registry in-code
gmailoauthGoogleOAuthConfigRegistry in-code (scopes: gmail.send, gmail.modify)
sheetsoauthGoogleOAuthConfigRegistry in-code (scopes: spreadsheets, drive.file, drive.readonly)
calendaroauthGoogleOAuthConfigRegistry in-code (scopes: calendar, calendar.events)

El contrato entre DB y código se mantiene por el slug. Ver Registry Contract.

Modelo de visibilidad

Cada conexión pertenece a un usuario (addedById, NOT NULL) dentro de orgId + agencyId. La visibilidad gobierna quién más la ve:

ValorSemántica
private (default)Sólo el autor (addedById) puede ver, actualizar o eliminar la conexión
restrictedCualquier usuario dentro del mismo orgId + agencyId puede verla

Autorización en dos capas:

  1. CASL a nivel de controlador via @CheckPolicies sobre el subject connections.connection para las acciones read, create, update, delete.
  2. Filtrado por visibilidad dentro de las queries/commands: GetConnectionsQuery combina buildAccessFilter(...) + connection.isVisibleTo(userId); GetConnectionByIdQuery y los update/delete comprueban isVisibleTo antes de operar (ownershipViolation en caso contrario).

Forma de la entidad

ts
type ConnectionProps = {
  orgId: string;
  agencyId: string;
  addedById: string;
  availableConnectionId: string;   // FK → connections.available_connections(id)
  visibility: 'private' | 'restricted';
  label: string | null;            // antes `name`; opcional
  status: 'active' | 'error' | 'disconnected';
  config: IConnectionConfig;       // SmtpConfig | TelegramConfig | GoogleOAuthConfig
};

En la respuesta HTTP (IConnectionResponse) se adjunta además el slug joineado desde el catálogo para comodidad del cliente.

Las credenciales sensibles (password, botToken, accessToken, refreshToken) se guardan cifradas en config (AES-256-GCM).

Endpoints principales

Todas las rutas están prefijadas con /connections.

MétodoRutaDescripción
GET/availableLista del catálogo (slug, displayName, authType, cover, icon, description)
GET/available/:idEntrada puntual del catálogo
GET/available/:id/form-schemaDescriptor de formulario ({ fields: [] } para OAuth)
POST/available/seedSincroniza el catálogo con el registry in-code (idempotente)
PUT/available/:idEdita sólo displayName, icon, cover, description
DELETE/available/:idElimina la entrada si no hay connections que la referencien (409 si hay)
GET/Lista conexiones visibles al usuario dentro del scope org + agency
GET/:idObtiene una conexión por ID (respeta visibilidad)
POST/Crea una conexión de cualquier slug credentials
PUT/:idActualiza label, status, config, visibility
DELETE/:idElimina (revoca token Google en fire-and-forget si aplica)
POST/testPrueba la conectividad sin persistir ({ availableConnectionId, config })
POST/oauth/startInicia flujo OAuth ({ availableConnectionId, label?, visibility? }) — rechaza slugs credentials con oauth_not_supported
GET/oauth/callbackCallback OAuth; resuelve el estado contra el slug declarado en el state token

El flujo de descubrimiento por parte del frontend está descrito en Auth Discovery Flow.

Rate limits

  • POST /oauth/start: 10 req/min por usuario (userId)
  • POST /test: 5 req/min por usuario (userId)

Políticas de plataforma

Tres políticas uuid7 gobiernan la edición del catálogo (subject connections.available-connection):

  • update.platform.connections.available-connectionPUT /available/:id
  • delete.platform.connections.available-connectionDELETE /available/:id
  • manage.platform.connections.available-connectionPOST /available/seed

Se asignan a roles platform-admin durante el seed de system policies.

Páginas relacionadas