This guide explains how to implement the backend API for the finalized CIB data model with single‑role‑per‑user:
- Each user has exactly one role via
users.role_id. - Role scope lives in
roles.scope(global,organization). - Organization membership is tracked by
organization_users.
The guide includes per‑module playbooks, API shapes, status machines, and Mermaid diagrams.
- API Conventions & Contracts
- Auth, Sessions & RBAC (Single‑Role)
- Organizations & Membership
- Accounts & Beneficiaries
- Approvals Engine (Checking*)
- Transfers
- Bill Payments & Tax Payments
- Bulk Processing
- Scheduling & Cut‑off Windows
- Notifications
- Statements & Reports
- Outbox & Audit (EDA Support)
- Idempotency & Safe Retries
- Database & Migrations (RLS, Constraints, Indexes)
- Observability & SLOs
- Error Codes & Retry Semantics
- OpenAPI Fragments (YAML)
- Data Models
C4Context
title CIB System Context
Person(corpUser, "Corporate User")
System_Boundary(cib, "CIB Backend") {
System(api, "REST API")
SystemDb(db, "Postgres DB")
SystemQueue(outbox, "Outbox Publisher")
}
System(core, "Core Banking", "Payments, Accounts, Statements")
System(mail, "Email/SMS Gateway")
Rel(corpUser, api, "Uses (JWT/Session)")
Rel(api, db, "CRUD / SQL")
Rel(api, outbox, "Insert Outbox Events")
Rel(outbox, core, "Publishes Payment/Beneficiary events")
Rel(api, mail, "Sends notifications")
sequenceDiagram
autonumber
participant UI as Portal UI
participant API as CIB API
participant DB as Postgres
participant AP as Approvals Engine
participant OB as Outbox Worker
participant CORE as Core Banking
UI->>API: POST /transfers (draft)
API->>DB: insert transfers(status='draft')
API->>AP: materialize approval steps (checking_*)
AP->>DB: create checking_transactions + assignments
API-->>UI: 201 (pending_approval)
UI->>API: POST /approvals/{id}/decisions approve
API->>DB: insert checking_transaction_decisions
AP->>DB: update checking_transactions.status=approved (if N-of satisfied)
API->>DB: enqueue schedules or mark queued (cutoff_windows)
API-->>UI: 200 (queued | scheduled)
OB->>DB: read outbox_events pending
OB->>CORE: push payment
CORE-->>OB: ack/ref
OB->>DB: update transfer status (released/settled/failed)