Live addresses domain for the mall: shared contract (AddressBookEntry + five client methods), mock adapter state v3, live domain pick, addresses page CRUD, checkout saved-address picker with manual fallback, demo seed, and the archived change plus address-book capability spec.
1.7 KiB
1.7 KiB
Tasks: replace-mock-api-wave-7
1. Backend
apps/api/migrations/0009_addresses.sql: table +addresses_one_defaultpartial unique indexapps/api/src/routes/addresses.rs: list/create/update/delete/set-default; customer role;WHERE user_idownership (404 cross-user); transactional default switching; first address auto-default; delete-default promotes latest remaining- Register module + router;
AddressBookEntryrow model
2. Shared contract
packages/shared/src/types.ts:AddressBookEntrypackages/shared/src/api.ts:listMyAddresses,createAddress,updateAddress,deleteAddress,setDefaultAddress
3. Mock adapter
apps/mall/mock/api.ts: same five methods over persisted mock state (seed fromMOCK_ADDRESSES)apps/mall/plugins/api.ts:addresseslive pick +DEFAULT_LIVE_DOMAINSentry
4. Mall pages
user/addresses.vue: real CRUD via$api(modal add/edit, delete, set-default)checkout/index.vue: load addresses from$api; radio select; inline manual form fallback when empty; submit selected address- Locale keys (user/checkout domains, en+zh)
5. Seed + tests
scripts/seed-demo.mjs: two idempotent demo customer addressesapps/api/tests/addresses.rs: CRUD, cross-user 404, single-default invariant, delete-default promotion, non-customer 403
6. Verify
cargo test -p vmall-apigreen (docker vmall_test + Redis)pnpm --filter @vmall/mall build+ shop-admin + admin builds green (contract change)openspec validate replace-mock-api-wave-7 --strictgreen- Browser smoke: address CRUD in user center; checkout with saved address end-to-end