1.6 KiB
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.