40 lines
1.6 KiB
Markdown
40 lines
1.6 KiB
Markdown
# Domain: Accounts, Content, Shops, Identity
|
|
|
|
## Customer accounts (`modules/account/`)
|
|
|
|
Three buckets per customer: `available` and `frozen` (monetary, per currency)
|
|
plus `points` (no currency). Balances change only through
|
|
`credit`/`debit`/`freeze`/`release`, each appending one immutable
|
|
`customer_account_entries` row in the same transaction as the business write.
|
|
The ledger is the audit trail; balances are never set absolutely. Credits in
|
|
a currency the customer never held lazily create the zero row
|
|
(`ensure_monetary_account`).
|
|
|
|
Planned on this foundation: wallet top-up/withdrawal and merchant settlement
|
|
(`openspec/changes/add-wallet-settlement`).
|
|
|
|
## Storefront content (`modules/content/`)
|
|
|
|
Four ordered home-content kinds (banners, promos, quick links, floor
|
|
adverts), platform-managed by whole-list replacement (`PUT
|
|
/admin/content/{kind}` reindexes positions atomically). Quick-link glyphs are
|
|
inline SVG path data.
|
|
|
|
## Shops (`modules/shop/`)
|
|
|
|
Platform creates/suspends shops; shop profiles are a side table with
|
|
bilingual address/notice/after-sale and platform-owned scores. Merchants edit
|
|
their own profile via `PUT /api/shop/profile` — scores are platform-only and
|
|
the merchant upsert never touches them.
|
|
|
|
## Identity (`modules/identity/`, `src/auth.rs`)
|
|
|
|
Email+password register/login, JWT bearer tokens. `AuthUser` carries
|
|
`id/role/shop_id`; `require(&[roles])` for RBAC, `own_shop()` /
|
|
`require_shop()` for tenant scoping (cross-shop resources return 404).
|
|
`ensure_accounts` runs inside the registration transaction.
|
|
|
|
## Key files
|
|
|
|
See `docs/code_index/platform.md`.
|