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.CreatedTenant.UpdatedTenant.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>/).