Saltar a contenido

tenant-mgmt

Control plane: CRUD de tenants, registry de strategies, feature flags.

Endpoints

API GW HTTP https://1zwzz5s116.execute-api.us-east-2.amazonaws.com:

Método Path Auth Notas
GET /v1/tenants JWT (super-admin o admin propio) listado paginado, ?limit=, ?cursor=
GET /v1/tenants/:id JWT detalle, incluye ETag
POST /v1/tenants JWT super-admin crea tenant
PATCH /v1/tenants/:id JWT admin del tenant optimistic con If-Match: <etag>
DELETE /v1/tenants/:id JWT super-admin soft delete (suspend)
GET /v1/tenants/:id/strategies JWT strategies habilitadas
PUT /v1/tenants/:id/strategies/:name JWT admin habilita/configura

Schema en DDB

Tabla zen-dev-tenants:

Atributo Tipo Notas
pk S TENANT#<id>
sk S META (registro principal); STRATEGY#<name> (overrides)
name S
tier S starter \| business \| enterprise
status S active \| suspended
features M feature flags
version N incrementa en cada update (optimistic concurrency)
createdAt / updatedAt S ISO

GSI byStatus para listados por estado.

Optimistic concurrency con If-Match

PATCH /v1/tenants/iplacex-demo
If-Match: "12"
Content-Type: application/json

{ "name": "IPLACEX Demo v2" }

Si la versión actual no es 12 → 412 Precondition Failed. El cliente re-lee, fusiona y reintenta.

Outbox pattern

Tabla zen-dev-tenants también almacena (en la misma transacción TransactWrite) un ítem OUTBOX#<eventId> con el payload del evento.

Un Lambda relay con DDB Streams empuja a EventBridge y borra el outbox tras confirmación. Garantiza exactly-at-least-once del lado producer. Detalle en ADR-0004.

Eventos publicados:

  • Tenant.Created
  • Tenant.Updated
  • Tenant.Suspended

Validación

Zod schemas en services/tenant-mgmt/src/domain/schemas.ts. Errores devuelven 400 con detalle por campo.

Tests

  • 14 tests unit en services/tenant-mgmt/tests/unit/.
  • Integration tests con LocalStack para path completo handler → DDB → outbox → relay → EB mock.

Roadmap

  • Multi-region replication (DDB global tables) en qa/prod.
  • API para tenants enterprise con stack físico dedicado (infra/tenants/<id>/).