Đặc tả vòng đời Partner (đối tác) của BNG Booking Platform. Nguồn sự thật code:packages/platform-infrastructure/src/provisioning/provisioning-service.ts(transition + audit),packages/platform-infrastructure/src/auth/api-key-store.ts(cổng auth theo Partner status).
Kiểm chứng E2E:src/__tests__/partner-management-e2e.test.ts,src/__tests__/ops-partner.test.ts.
Partner = một Customer trong mô hình hiện có (1 Partner ↔ tối đa 1 Tenant). Beta-4 KHÔNG thêm bảng mới — tái dùng customers.status (đã có sẵn) làm trạng thái vòng đời. partnerId == customerId.
| Trạng thái | Ý nghĩa | Key của partner auth được? |
|---|---|---|
pending | Vừa tạo, chưa kích hoạt. | ❌ (cổng Partner chặn) |
active | Đang hoạt động bình thường. | ✅ (nếu key active/rotating + còn hạn) |
suspended | Tạm ngưng (nợ phí/nghi lạm dụng). Thuận nghịch. | ❌ (cổng Partner chặn — key KHÔNG bị huỷ) |
revoked | Chấm dứt vĩnh viễn. Terminal. | ❌ (mọi key bị revoke) |
Cổng Partner (auth):findActiveKeytừ chối key nếu Partner chủ quản khôngactive.
Nhờ vậy suspend/reactivate là THUẬN NGHỊCH: suspend chỉ đổistatus, không đụng row key;
reactivate đưastatusvềactive⇒ đúng key cũ hoạt động trở lại (không cần cấp lại).
create activate suspend
(∅) ──────────▶ pending ─────────────▶ active ──────────────▶ suspended
│ ▲ │ │
│ └───┘ reactivate ────────┘
│ │
│ revoke │ revoke │ revoke
▼ ▼ ▼
revoked (TERMINAL — huỷ mọi key)
| Từ | Thao tác | Đến | Audit event |
|---|---|---|---|
| ∅ | createPartner | pending | partner.created |
pending | activatePartner | active | partner.activated |
active | suspendPartner | suspended | partner.suspended |
suspended | reactivatePartner | active | partner.reactivated |
pending / active / suspended | revokePartner | revoked | partner.revoked |
PARTNER_INVALID_TRANSITION, exit code 2)pending → suspended (phải active trước): suspend chỉ từ active.pending → active qua reactivatePartner (sai ngữ nghĩa): dùng activatePartner.suspended → active qua activatePartner (sai ngữ nghĩa): dùng reactivatePartner.revoked (terminal).PARTNER_NOT_FOUND (exit 2).activateép nguồnpending;reactivateép nguồnsuspended(guardexpectFrom) — hai lối vàoactive
phân biệt rõ để audit đúng ngữ nghĩa.
revoked không có transition ra. (Khôi phục = tạo Partner mới.)revokePartner revoke mọi key còn sống của partner (không thể auth lại kể cả khi… không có "un-revoke").customers.status = active và key hợp lệ. Không có đường vòng.AuditEvent (append-only). Không thao tác nào đổi trạng thái mà không audit.secret/token/apikey/...); raw key không bao giờ vào audit.Scope audit đối tác: AuditEvent.tenantId = partnerId (audit quản trị đối tác ở cấp nền, tách khỏi audit nghiệp vụ theo tenant). entityRef = partnerId (event partner.*) hoặc keyId (event apikey.*).
| Thao tác | Audit action |
|---|---|
| Tạo Partner | partner.created |
| Kích hoạt | partner.activated |
| Suspend | partner.suspended |
| Reactivate | partner.reactivated |
| Cấp key | apikey.issued |
| Rotate key | apikey.rotated |
| Revoke key | apikey.revoked |
| Revoke Partner (kèm huỷ mọi key) | partner.revoked |
Xem PARTNER-AUDIT-VERIFICATION.md để biết cách tự kiểm chứng.
pending_delivery → active → (rotating) → revoked | expired — độc lập với Partner status, nhưng cổng Partner đứng trước: dù key active, nếu Partner không active thì vẫn 401. Chi tiết vận hành: ../operations/PARTNER-OPERATIONS.md.