- Added customer profile controller with endpoints for retrieving, updating, and deactivating user profiles. - Introduced address model and routes for managing user addresses. - Created business application model and service for handling business applications, including approval and rejection processes. - Developed business contact and credit account models to support business customer functionalities. - Implemented settlement term model for managing payment terms. - Added email templates for business application notifications (approved, rejected, received, and status changes). - Enhanced validation schemas for customer and business inputs to ensure data integrity. - Created unit tests for business application service and validation schemas to ensure functionality and correctness. - Added migration scripts to set up new database tables and columns for customer and business features.
4.2 KiB
ZUMRI Customer and Business API
All endpoints require a Phase 1 access token and are mounted under both /api and /api/v1; new clients should use /api/v1. Examples use placeholders.
Customer profile
GET /api/v1/profile/mePATCH /api/v1/profile/me
Editable fields are first/last name, phone, date of birth, en|si|ta locale, theme, marketing email/push preference, in-app preference, and owned avatar/background upload IDs. Identity state, type, roles, permissions, tokens, passwords, business review data, partner ID, and credit settings are rejected.
{"firstName":"<first-name>","preferredLanguage":"en","marketingEmailEnabled":false}
Media responses contain an upload ID and short-lived authorized URL, never an object key.
Addresses
GET /api/v1/addressesPOST /api/v1/addressesGET /api/v1/addresses/:idPATCH /api/v1/addresses/:idDELETE /api/v1/addresses/:id
No user ID is accepted. Every query includes the authenticated owner. Setting either default flag clears the prior default under a transaction and User row lock. Deleting a default leaves that default unset. Future orders must snapshot addresses; they must never depend on mutable Address rows.
{"label":"Home","recipientName":"<name>","phoneNumber":"<phone>","addressLine1":"<line>","city":"<city>","countryCode":"LK","isDefaultShipping":true}
Account deactivation
POST /api/v1/user/me/deactivate with {"confirmation":"DEACTIVATE","password":"<current-password>"}. Password is required for password-based identities. Social-only identities require explicit confirmation. The operation sets DEACTIVATED, increments token version, revokes all sessions, and clears cookies. Self-reactivation is not supported; an authorized manual administrative process is required.
Business applications
POST /api/v1/business/applicationsGET /api/v1/business/applications/meGET /api/v1/business/applications/:id
Only verified ACTIVE customer accounts can apply. Ownership is applied to ID reads. Concurrent active applications are serialized by locking the applicant User.
{"businessName":"<business>","legalName":"<legal-name>","registrationNumber":"<registration>","businessType":"<type>","contactEmail":"owner@example.com","contactPhone":"<phone>"}
Private supporting documents use the Phase 2 upload API with purpose BUSINESS_REGISTRATION, TAX_DOCUMENT, IDENTITY_DOCUMENT, or OTHER_SUPPORTING_DOCUMENT. Only the owner or a reviewer with business.applications.review can obtain a signed URL.
Business self-service
GET /api/v1/business/mePATCH /api/v1/business/mePOST /api/v1/business/me/contactsPOST /api/v1/business/me/addresses
Partner ID, review status, domain status, credit, settlement term, identity type, and approval metadata cannot be changed through self-service.
Administrative review
GET /api/v1/admin/business/applications—business.applications.readGET /api/v1/admin/business/applications/:id— same permissionPOST /api/v1/admin/business/applications/:id/approve—business.applications.reviewPOST /api/v1/admin/business/applications/:id/reject— same permission; requires a reasonGET /api/v1/admin/business/accounts—business.accounts.readPATCH /api/v1/admin/business/accounts/:id/status—business.accounts.update
Lists accept bounded page, limit, status/name filters and allowlisted sorting. Approval atomically locks the application/applicant, creates one profile and disabled credit account, assigns a ZUM-BIZ-###### partner ID, changes account type to business_customer, revokes sessions, and marks the application approved.
Credit and settlement primitives
PATCH /api/v1/admin/business/accounts/:id/credit—business.credit.managePATCH /api/v1/admin/business/accounts/:id/settlement-term—business.settlement.manage
{"creditLimit":"100000.00","currency":"LKR","status":"ACTIVE"}
Credit uses DECIMAL(15,2). There is intentionally no used or available balance until a future authoritative commerce/settlement ledger exists. Settlement terms are seeded configuration records only; this phase creates no invoices or settlements.