Skip to main content

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/​

ClientTypical authPrimary 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/ — SimpleJWT
  • api/users/ — users
  • api/ — 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 POSOrder with order_source='ecommerce' (ecommerce/checkout_orders.py (backend-main/ecommerce/checkout_orders.py)). POS and customer-link conversions use order_source='pos' (default on pos.models.POSOrder (backend-main/pos/models.py)).
  • Ecommerce POS binding. Singleton EcommerceSettings (backend-main/ecommerce/models.py) optionally points at a PointOfSale used 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 PendingRazorpayCheckout until capture; only then is a POSOrder created. COD creates the order immediately with payment_status=not_required.