Architecture overview
Nova Print is a multi-frontend, single-backend system. Four client apps call one Django REST API under /api/. Orders from POS and ecommerce both land as POSOrder rows; customer-facing shareable flows go through customerlink and the checkout app.
Clients → Django /api/
| Client | Typical auth | Primary API areas |
|---|---|---|
Admin (frontend-admin-dashboard) | JWT (/api/token/, refresh) | /api/admin/orders/, warehouse products/stock, ecommerce settings, design catalog, reports, notifications SSE |
POS (frontend-pos) | POS access key after /api/pos-auth/ | /api/pos-orders/, /api/pos-catalog/, /api/customer-links/, POS SSE streams |
Ecommerce (frontend-ecommerce) | Customer session/token + public catalog | /api/ ecommerce catalog, checkout, customers, track-order |
Checkout (printbazar-checkout) | Public (link code in URL) | /api/checkout/<pos_slug>/<link_code>/… and catalog variants |
Root routing is assembled in backend-main/config/urls.py:
api/token/,api/token/refresh/— SimpleJWTapi/users/—usersapi/—warehouse,pos,customerlink,appsettings,ecommerce,designcatalog
Frontends configure a base URL ending in /api (see e.g. frontend-ecommerce/src/lib/apiBase.ts, frontend-admin-dashboard/src/lib/apiBase.ts).
System diagram
flowchart LR
subgraph clients [Frontends]
Admin[Admin dashboard<br/>Vite/React]
POS[POS terminal<br/>Vite/React]
Shop[Ecommerce storefront<br/>Next.js]
Checkout[Checkout chat<br/>Vite/React]
end
subgraph api [backend-main Django]
Gateway["/api/"]
WH[warehouse]
POSApp[pos]
EC[ecommerce]
CL[customerlink]
DC[designcatalog]
US[users]
AS[appsettings]
end
Admin -->|JWT| Gateway
POS -->|POS access key| Gateway
Shop -->|customer / public| Gateway
Checkout -->|public link code| Gateway
Gateway --> WH
Gateway --> POSApp
Gateway --> EC
Gateway --> CL
Gateway --> DC
Gateway --> US
Gateway --> AS
EC -->|creates POSOrder<br/>order_source=ecommerce| POSApp
CL -->|POS places order<br/>from Submitted link| POSApp
WH -->|Product / WarehouseStock| POSApp
WH -->|listings / stock checks| EC
DC -->|Designs| CL
DC -->|Designs| EC
Cross-cutting patterns
- Shared order model. Ecommerce COD/Razorpay fulfillment creates
POSOrderwithorder_source='ecommerce'(ecommerce/checkout_orders.py(backend-main/ecommerce/checkout_orders.py)). POS and customer-link conversions useorder_source='pos'(default onpos.models.POSOrder(backend-main/pos/models.py)). - Ecommerce POS binding. Singleton
EcommerceSettings(backend-main/ecommerce/models.py) optionally points at aPointOfSaleused as the fulfillment terminal for online orders. - Real-time. In-process SSE for orders (
pos/sse.py(backend-main/pos/sse.py)) and customer-link comments/status (customerlink/sse.py(backend-main/customerlink/sse.py)). Multi-worker deploy needs an external pub/sub — Verify production Redis/process topology; code comments note in-memory limits. - Payments. Storefront Razorpay uses
PendingRazorpayCheckoutuntil capture; only then is aPOSOrdercreated. COD creates the order immediately withpayment_status=not_required.
Related docs
- Domain model — entities and FKs
- Order lifecycle — statuses and archive
- Customer link lifecycle — shareable checkout + SSE