TΓ i liα»u mΓ΄ tαΊ£ kiαΊΏn trΓΊc hα» thα»ng backend cho Electric Vehicle Dealer Management System.
- Tα»ng quan kiαΊΏn trΓΊc
- Layered Architecture
- Component Diagram
- Data Flow
- Authentication & Authorization Flow
- Business Process Flow
- Technology Stack
- API Structure
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT LAYER β
β (Next.js Frontend) β
β β
β - Dashboard Pages β
β - CRUD Operations β
β - Authentication UI β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ
β
β HTTPS/REST API
β (Bearer JWT Token)
β
βββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββ
β API GATEWAY LAYER β
β (Express.js Server) β
β β
β - CORS Configuration β
β - Request Parsing (JSON/URL-encoded) β
β - Error Handling β
β - Swagger Documentation β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ
β
β Route Dispatch
β
βββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββ
β ROUTING LAYER β
β (Express Routes) β
β β
β /api/auth /api/vehicles /api/dealers β
β /api/customers /api/quotes /api/orders β
β /api/payments /api/inventory /api/deliveries β
β /api/promotions /api/reports /api/dashboard β
β ... (19 route modules) β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ
β
β Middleware Chain
β
βββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββ
β MIDDLEWARE LAYER β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Authentication Middleware (protect) β β
β β - JWT Token Verification β β
β β - User Lookup β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββΌββββββββββββββββββββββββββββββ β
β β Authorization Middleware (allowRoles) β β
β β - Role-based Access Control β β
β β - Permission Checking β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ
β
β Business Logic
β
βββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββ
β CONTROLLER LAYER β
β (Business Logic) β
β β
β - authController - vehicleController β
β - orderController - paymentController β
β - inventoryController - dealerController β
β - quoteController - customerController β
β ... (20 controller modules) β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ
β
β Data Operations
β
βββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββ
β MODEL LAYER β
β (Mongoose ODM) β
β β
β - User - Order - Payment β
β - VehicleVariant - Quote - Delivery β
β - Dealer - Inventory - Feedback β
β - Customer - TestDrive - Promotion β
β ... (18 model schemas) β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ
β
β MongoDB Driver
β
βββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββ
β DATABASE LAYER β
β (MongoDB) β
β β
β Collections: β
β - users - orders - payments β
β - vehiclevariants - quotes - deliveries β
β - dealers - inventory - feedbacks β
β - customers - testdrives - promotions β
β ... β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
graph TB
subgraph "Presentation Layer"
FE[Next.js Frontend<br/>SDN-FE]
end
subgraph "Application Layer"
EX[Express Server<br/>index.js]
CORS[CORS Middleware]
PARSE[Body Parser]
ERR[Error Handler]
end
subgraph "Routing Layer"
ROUTES[Route Modules<br/>19 routes]
end
subgraph "Middleware Layer"
AUTH_MW[Auth Middleware<br/>protect]
ROLE_MW[Role Middleware<br/>allowRoles]
end
subgraph "Business Logic Layer"
CTRL[Controllers<br/>20 controllers]
end
subgraph "Data Access Layer"
MODELS[Mongoose Models<br/>18 schemas]
end
subgraph "Data Layer"
MONGO[(MongoDB<br/>Database)]
end
subgraph "External Services"
JWT_UTIL[JWT Utils<br/>Token Generation]
HASH_UTIL[Hash Utils<br/>bcryptjs]
SWAGGER[Swagger UI<br/>/api-docs]
end
FE -->|HTTPS/REST| EX
EX --> CORS
CORS --> PARSE
PARSE --> ROUTES
ROUTES --> AUTH_MW
AUTH_MW --> ROLE_MW
ROLE_MW --> CTRL
CTRL --> MODELS
MODELS --> MONGO
CTRL -.->|uses| JWT_UTIL
CTRL -.->|uses| HASH_UTIL
EX -.->|serves| SWAGGER
graph LR
subgraph "Core Components"
SERVER[Express Server]
DB[MongoDB Connection]
SWAGGER_DOC[Swagger Docs]
end
subgraph "Auth Components"
AUTH_CTRL[Auth Controller]
JWT[JWT Service]
AUTH_MW[Auth Middleware]
end
subgraph "Business Components"
VEHICLE[Vehicle Module]
DEALER[Dealer Module]
ORDER[Order Module]
INVENTORY[Inventory Module]
PAYMENT[Payment Module]
QUOTE[Quote Module]
CUSTOMER[Customer Module]
end
subgraph "Support Components"
DASHBOARD[Dashboard Module]
REPORT[Report Module]
PROMO[Promotion Module]
DELIVERY[Delivery Module]
FEEDBACK[Feedback Module]
TESTDRIVE[Test Drive Module]
end
SERVER --> DB
SERVER --> SWAGGER_DOC
SERVER --> AUTH_MW
AUTH_MW --> AUTH_CTRL
AUTH_CTRL --> JWT
SERVER --> VEHICLE
SERVER --> DEALER
SERVER --> ORDER
SERVER --> INVENTORY
SERVER --> PAYMENT
SERVER --> QUOTE
SERVER --> CUSTOMER
SERVER --> DASHBOARD
SERVER --> REPORT
SERVER --> PROMO
SERVER --> DELIVERY
SERVER --> FEEDBACK
SERVER --> TESTDRIVE
sequenceDiagram
participant Client
participant Express
participant Routes
participant AuthMW
participant RoleMW
participant Controller
participant Model
participant MongoDB
Client->>Express: HTTP Request<br/>(with JWT token)
Express->>Routes: Route Matching
Routes->>AuthMW: protect middleware
AuthMW->>AuthMW: Verify JWT Token
AuthMW->>Model: Find User by ID
Model->>MongoDB: Query User
MongoDB-->>Model: User Data
Model-->>AuthMW: User Object
AuthMW->>RoleMW: Check Role Permissions
RoleMW-->>Controller: Authorized Request
Controller->>Model: Business Logic Operations
Model->>MongoDB: Database Operations
MongoDB-->>Model: Query Results
Model-->>Controller: Processed Data
Controller-->>Routes: Response Data
Routes-->>Express: JSON Response
Express-->>Client: HTTP Response
sequenceDiagram
participant Client
participant AuthController
participant UserModel
participant JWTUtils
participant MongoDB
Client->>AuthController: POST /api/auth/login<br/>{email, password}
AuthController->>UserModel: Find User by Email
UserModel->>MongoDB: Query users collection
MongoDB-->>UserModel: User Document
UserModel-->>AuthController: User with passwordHash
AuthController->>AuthController: Compare Password<br/>(bcryptjs)
alt Password Valid
AuthController->>JWTUtils: generateToken(userId, role)
JWTUtils-->>AuthController: JWT Token
AuthController->>JWTUtils: generateRefreshToken(userId, role)
JWTUtils-->>AuthController: Refresh Token
AuthController-->>Client: 200 OK<br/>{token, refreshToken, user}
else Password Invalid
AuthController-->>Client: 401 Unauthorized<br/>{message: "Invalid credentials"}
end
graph TD
START[Client Request] --> CHECK_TOKEN{Has Bearer Token?}
CHECK_TOKEN -->|No| ERR1[401 Unauthorized<br/>No token]
CHECK_TOKEN -->|Yes| VERIFY[Verify JWT Token]
VERIFY --> VALID{Token Valid?}
VALID -->|No| ERR2[401 Unauthorized<br/>Token invalid]
VALID -->|Yes| LOOKUP[Lookup User from DB]
LOOKUP --> USER_EXISTS{User Exists?}
USER_EXISTS -->|No| ERR3[401 Unauthorized<br/>User not found]
USER_EXISTS -->|Yes| ATTACH[Attach User to req.user]
ATTACH --> CHECK_ROLE{Has Required Role?}
CHECK_ROLE -->|No| ERR4[403 Forbidden<br/>Insufficient permissions]
CHECK_ROLE -->|Yes| SUCCESS[Authorized<br/>Proceed to Controller]
SUCCESS --> DEALER_FILTER{DealerStaff/<br/>DealerManager?}
DEALER_FILTER -->|Yes| AUTO_FILTER[Auto-filter by<br/>req.user.dealer]
DEALER_FILTER -->|No| NO_FILTER[No filtering]
AUTO_FILTER --> CONTROLLER[Execute Controller Logic]
NO_FILTER --> CONTROLLER
Admin
βββ Full System Access
βββ User Management
βββ Dealer Management
βββ All EVM Staff permissions
EVMStaff
βββ Vehicle Management (Model/Variant/Color)
βββ Global Inventory Management
βββ Order Allocation & Approval
βββ Dealer Target Management
βββ Promotion Management
βββ System Reports
DealerManager
βββ Staff Management (within dealer)
βββ Quote Approval
βββ Order Approval
βββ Payment Confirmation
βββ Delivery Status Update
βββ Inventory Management (within dealer)
βββ Customer Management
βββ Dealer Reports
DealerStaff
βββ Vehicle Viewing & Comparison
βββ Customer Management
βββ Quote Creation
βββ Order Creation
βββ Payment Creation
βββ Delivery Creation
βββ Feedback Creation
graph LR
A[Customer Inquiry] --> B[DealerStaff:<br/>Create Quote]
B --> C{DealerManager<br/>Approves?}
C -->|No| REJ1[Rejected Quote]
C -->|Yes| D[Quote Status:<br/>accepted]
D --> E[Convert Quote<br/>to Order]
E --> F[Order Status:<br/>new]
F --> G{DealerManager<br/>Approves?}
G -->|No| REJ2[Rejected Order]
G -->|Yes| H[Order Status:<br/>confirmed]
H --> I[EVMStaff:<br/>Allocate Order]
I --> J{Inventory<br/>Available?}
J -->|No| REJ3[Rejected by EVM]
J -->|Yes| K[Order Status:<br/>allocated]
K --> L[Inventory Transfer<br/>EVM β Dealer]
L --> M[Payment Processing]
M --> N[Order Status:<br/>invoiced]
N --> O[Delivery Creation]
O --> P[Order Status:<br/>delivered]
P --> Q[Contract Generation]
graph TD
A[DealerManager:<br/>Vehicle Request] --> B[Request Status:<br/>pending]
B --> C{EVMStaff<br/>Review}
C -->|Check Inventory| D{Enough Stock?}
D -->|No| REJ[Reject Request]
D -->|Yes| E[Approve Request]
E --> F[Reserve Inventory<br/>in EVM Stock]
F --> G[Transfer Inventory<br/>to Dealer]
G --> H[Update Dealer Inventory]
I[EVMStaff:<br/>Inventory Transfer] --> J[Select Source Dealer]
J --> K[Select Target Dealer]
K --> L[Check Source Stock]
L --> M[Transfer Vehicles]
M --> N[Update Both Inventories]
| Layer | Technology | Version | Purpose |
|---|---|---|---|
| Runtime | Node.js | Latest LTS | JavaScript runtime |
| Framework | Express.js | ^5.1.0 | Web application framework |
| Database | MongoDB | Latest | NoSQL document database |
| ODM | Mongoose | ^8.18.3 | MongoDB object modeling |
| Package | Version | Purpose |
|---|---|---|
express |
^5.1.0 | Web framework |
mongoose |
^8.18.3 | MongoDB ODM |
jsonwebtoken |
^9.0.2 | JWT authentication |
bcryptjs |
^3.0.2 | Password hashing |
cors |
^2.8.5 | Cross-origin resource sharing |
dotenv |
^17.2.3 | Environment variables |
swagger-ui-express |
^5.0.1 | API documentation |
express-async-handler |
^1.2.0 | Async error handling |
/api
βββ /auth Authentication & User Management
β βββ POST /login User login
β βββ POST /register User registration
β βββ GET /me Get current user profile
β βββ POST /refresh Refresh JWT token
β
βββ /vehicles Vehicle Variants Management
β βββ GET / List all variants
β βββ GET /:id Get variant details
β βββ GET /compare Compare variants
β βββ POST / Create variant (EVMStaff, Admin)
β βββ PUT /:id Update variant (EVMStaff, Admin)
β βββ DELETE /:id Delete variant (Admin)
β
βββ /vehicle-models Vehicle Models Management
β βββ [CRUD operations]
β
βββ /vehicle-colors Vehicle Colors Management
β βββ [CRUD operations]
β
βββ /dealers Dealer Management
β βββ GET / List dealers
β βββ GET /:id Get dealer details
β βββ POST / Create dealer (Admin)
β βββ PATCH /:id Update dealer
β βββ DELETE /:id Delete dealer (Admin)
β βββ GET /:id/inventory Get dealer inventory
β
βββ /customers Customer Management (CRM)
β βββ [CRUD operations]
β
βββ /quotes Quote Management
β βββ POST / Create quote
β βββ PUT /:id/approve Approve quote (DealerManager)
β βββ PUT /:id/reject Reject quote (DealerManager)
β βββ PUT /:id/convert Convert to order
β
βββ /orders Order Management
β βββ POST / Create order
β βββ PUT /:id/approve Approve order (DealerManager)
β βββ PUT /:id/allocate Allocate order (EVMStaff)
β βββ PUT /:id/status Update order status
β βββ [Other operations]
β
βββ /payments Payment Management
β βββ [CRUD operations]
β
βββ /inventory Inventory Management
β βββ GET / List inventory
β βββ POST / Create inventory item
β βββ POST /transfer Transfer between dealers (EVMStaff)
β βββ [Other operations]
β
βββ /deliveries Delivery Management
β βββ [CRUD operations]
β
βββ /contracts Contract Management
β βββ [CRUD operations]
β
βββ /promotions Promotion Management
β βββ [CRUD operations]
β
βββ /test-drives Test Drive Management
β βββ [CRUD operations]
β
βββ /feedbacks Feedback Management
β βββ [CRUD operations]
β
βββ /reports Reporting
β βββ GET /sales Sales report
β βββ GET /debt Debt report
β βββ GET /inventory Inventory report
β
βββ /dashboard Dashboard Analytics
β βββ GET /summary Summary statistics
β βββ GET /trends Trend analysis
β
βββ /users User Management
βββ [CRUD operations]
Request Headers:
Authorization: Bearer <jwt_token>
Content-Type: application/json
Success Response:
{
"success": true,
"data": { ... }
}Error Response:
{
"message": "Error description",
"error": "Error details (development only)"
}SDN-BE/
βββ index.js # Application entry point
βββ package.json # Dependencies & scripts
βββ .env # Environment variables
β
βββ controllers/ # Business logic layer
β βββ authController.js
β βββ vehicleController.js
β βββ orderController.js
β βββ quoteController.js
β βββ ... (20 controllers)
β
βββ models/ # Data models (Mongoose schemas)
β βββ User.js
β βββ VehicleVariant.js
β βββ Order.js
β βββ Quote.js
β βββ ... (18 models)
β
βββ routes/ # API route definitions
β βββ authRoutes.js
β βββ vehicleRoutes.js
β βββ orderRoutes.js
β βββ ... (19 route files)
β
βββ middleware/ # Custom middleware
β βββ authMiddleware.js # JWT authentication & authorization
β
βββ utils/ # Utility functions
β βββ jwt.js # JWT token generation/verification
β βββ hash.js # Password hashing utilities
β
βββ swagger.json # API documentation
β
βββ seed.js # Database seeding script
-
JWT-based Authentication
- Token generation with user ID and role
- Token expiration: 1 day (access), 7 days (refresh)
- Bearer token in Authorization header
-
Role-Based Access Control (RBAC)
- 4 roles: Admin, EVMStaff, DealerManager, DealerStaff
- Middleware-based permission checking
- Auto-filtering by dealer for dealer roles
-
Password Security
- Bcrypt hashing with salt rounds
- Passwords never stored in plain text
- Environment variables for sensitive data (JWT_SECRET, MONGO_URI)
- MongoDB connection with authentication
- Input validation at controller level
- Error messages sanitized in production
- Configurable CORS policies
- Preflight request handling
- Credential support (configurable)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Production Environment β
β β
β ββββββββββββββββ ββββββββββββββββ β
β β Render β β MongoDB β β
β β (Hosting) ββββββββββββ€ Atlas β β
β β β HTTPS β (Cloud DB) β β
β β Express App β β β β
β ββββββββ¬ββββββββ ββββββββββββββββ β
β β β
β β HTTPS/REST API β
β β β
β ββββββββΌββββββββ β
β β Next.js FE β β
β β (Client) β β
β ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Development: Local MongoDB, PORT 5000
- Production: MongoDB Atlas, Render hosting
- Health check endpoint for monitoring
- Graceful shutdown handling
- Stateless Design: JWT tokens enable horizontal scaling
- MongoDB Sharding: Ready for database scaling
- Async Operations: Non-blocking I/O with Express
- Connection Pooling: Mongoose connection management
- Caching Ready: Can integrate Redis for session/token caching
- All endpoints require authentication except
/api/auth/loginand/api/auth/register - DealerStaff and DealerManager automatically filter data by their dealer
- Error handling is centralized in Express error middleware
- API documentation available at
/api-docs(Swagger UI) - Health check endpoint:
/health
Last Updated: 2024 Version: 1.0.0