The application follows a microservice architecture with the following services:
- User Service: Handles user registration, authentication, and account management.
- Ride Service: Manages ride requests, driver applications, and ride lifecycle.
- Payment Service: Processes cash payments and generates receipts.
- Admin Service: Provides admin functionalities for user and ride oversight.
Each service has its own MongoDB database (or collection within a shared database for simplicity) and exposes RESTful APIs. Services communicate via HTTP APIs. The frontend is built with React and Tailwind CSS, interacting with the backend via these APIs.
The database is split into collections aligned with the microservices. Below is the schema design:
-
Users
{ "_id": ObjectId, "email": String, // Unique, e.g., "user@example.com" "password": String, // Hashed password "name": String, // Full name "role": String, // Enum: ["passenger", "driver", "admin"] "phone": String, // Optional for drivers "isActive": Boolean, // For admin deactivation "createdAt": Date } -
Sessions
{ "_id": ObjectId, "userId": ObjectId, // Reference to Users "token": String, // JWT token "createdAt": Date, "expiresAt": Date }
-
RideRequests
{ "_id": ObjectId, "passengerId": ObjectId, // Reference to Users "pickupLocation": String, // e.g., "Shahbag" "dropoffLocation": String, // e.g., "Dhanmondi" "targetTime": Date, // Desired pickup time "desiredFare": Number, // Proposed fare "status": String, // Enum: ["posted", "confirmed", "completed", "cancelled"] "driverId": ObjectId, // Reference to Users (null until selected) "createdAt": Date } -
RideApplications
{ "_id": ObjectId, "rideRequestId": ObjectId, // Reference to RideRequests "driverId": ObjectId, // Reference to Users "appliedAt": Date }
- Payments
{ "_id": ObjectId, "rideRequestId": ObjectId, // Reference to RideRequests "amount": Number, // Paid amount "paymentMethod": String, // "cash" for MVP "status": String, // Enum: ["pending", "completed"] "receiptSentAt": Date, // When receipt was emailed "createdAt": Date }
- Uses the same
UsersandRideRequestscollections for oversight (read-only access).
Below are the minimal APIs required to cover the MVP scope, organized by microservice.
Handles user account management and authentication.
-
POST /api/users/register
- Description: Register a new passenger or driver.
- Request Body:
{ "email": String, "password": String, "name": String, "role": String, // "passenger" or "driver" "phone": String // Optional, required for drivers } - Response:
201 { userId, email, name, role }
-
POST /api/users/login
- Description: Authenticate user and return JWT token.
- Request Body:
{ "email": String, "password": String } - Response:
200 { token, userId, role }
-
POST /api/users/logout
- Description: Invalidate user session.
- Headers:
Authorization: Bearer <token> - Response:
200 { message: "Logged out" }
-
GET /api/users/:userId
- Description: Get user details (for passenger viewing driver details).
- Headers:
Authorization: Bearer <token> - Response:
200 { userId, name, phone, role }
Manages ride lifecycle for passengers and drivers.
-
POST /api/rides
- Description: Passenger posts a new ride request.
- Headers:
Authorization: Bearer <token> - Request Body:
{ "pickupLocation": String, "dropoffLocation": String, "targetTime": ISODate, "desiredFare": Number } - Response:
201 { rideRequestId, pickupLocation, dropoffLocation, targetTime, desiredFare }
-
GET /api/rides
- Description: Drivers browse available ride requests (status: "posted").
- Headers:
Authorization: Bearer <token> - Query Params:
?status=posted - Response:
200 [{ rideRequestId, pickupLocation, dropoffLocation, targetTime, desiredFare, passengerId }]
-
POST /api/rides/:rideRequestId/apply
- Description: Driver applies to a ride request.
- Headers:
Authorization: Bearer <token> - Response:
201 { applicationId, rideRequestId, driverId }
-
GET /api/rides/:rideRequestId/applications
- Description: Passenger views driver applications for their ride.
- Headers:
Authorization: Bearer <token> - Response:
200 [{ applicationId, driverId, driverName, driverPhone, appliedAt }]
-
POST /api/rides/:rideRequestId/select
- Description: Passenger selects a driver for the ride.
- Headers:
Authorization: Bearer <token> - Request Body:
{ "driverId": String } - Response:
200 { rideRequestId, driverId, status: "confirmed" }
-
POST /api/rides/:rideRequestId/cancel
- Description: Passenger or driver cancels a ride (before start).
- Headers:
Authorization: Bearer <token> - Response:
200 { rideRequestId, status: "cancelled" }
-
POST /api/rides/:rideRequestId/complete
- Description: Driver marks ride as completed.
- Headers:
Authorization: Bearer <token> - Response:
200 { rideRequestId, status: "completed" }
Handles cash payments and receipt generation.
-
POST /api/payments/:rideRequestId
- Description: Record cash payment after ride completion.
- Headers:
Authorization: Bearer <token> - Request Body:
{ "amount": Number } - Response:
201 { paymentId, rideRequestId, amount, status: "completed" }
-
POST /api/payments/:paymentId/receipt
- Description: Generate and send digital receipt via email.
- Headers:
Authorization: Bearer <token> - Response:
200 { paymentId, receiptSentAt }
Provides admin oversight functionalities.
-
GET /api/admin/users
- Description: Admin views all users.
- Headers:
Authorization: Bearer <token> - Response:
200 [{ userId, email, name, role, isActive }]
-
PATCH /api/admin/users/:userId/deactivate
- Description: Admin deactivates a user account.
- Headers:
Authorization: Bearer <token> - Response:
200 { userId, isActive: false }
-
GET /api/admin/rides
- Description: Admin views all rides (posted, ongoing, completed).
- Headers:
Authorization: Bearer <token> - Query Params:
?status=posted|confirmed|completed|cancelled - Response:
200 [{ rideRequestId, passengerId, driverId, status, pickupLocation, dropoffLocation, targetTime, desiredFare }]
Below are the key workflows for the MVP, describing how users interact with the system.
- Passenger/Driver:
- Registers via
/api/users/registerwith email, password, name, and role. - Logs in via
/api/users/loginto receive a JWT token. - Uses the token for authenticated requests.
- Logs out via
/api/users/logoutto invalidate the session.
- Registers via
- Passenger:
- Posts a ride request via
/api/rideswith pickup, drop-off, time, and fare. - Views driver applications via
/api/rides/:rideRequestId/applications. - Selects a driver via
/api/rides/:rideRequestId/select. - Optionally cancels the ride via
/api/rides/:rideRequestId/cancel.
- Posts a ride request via
- Driver:
- Browses available rides via
/api/rides?status=posted. - Applies to a ride via
/api/rides/:rideRequestId/apply. - If selected, completes the ride via
/api/rides/:rideRequestId/complete. - Optionally cancels a confirmed ride via
/api/rides/:rideRequestId/cancel.
- Browses available rides via
- Passenger/Driver:
- After ride completion, driver records cash payment via
/api/payments/:rideRequestId. - System generates and sends a receipt via
/api/payments/:paymentId/receipt.
- After ride completion, driver records cash payment via
- Admin:
- Views all users via
/api/admin/users. - Deactivates a user via
/api/admin/users/:userId/deactivate. - Monitors rides via
/api/admin/rideswith optional status filtering.
- Views all users via
The React frontend is a single-page application (SPA) that interacts with the above APIs. Key components include:
-
Auth Components:
Register: Form for user signup (email, password, name, role, phone).Login: Form for user login.Logout: Button to clear session.
-
Passenger Components:
RideForm: Form to post a ride request (pickup, drop-off, time, fare).RideList: Displays user’s posted rides.DriverApplications: Shows driver applications for a ride with a "Select" button.CancelRide: Button to cancel a ride.
-
Driver Components:
AvailableRides: Lists posted ride requests with an "Apply" button.MyRides: Shows driver’s applied and confirmed rides with "Complete" or "Cancel" buttons.
-
Admin Components:
UserManagement: Table of users with a "Deactivate" button.RideMonitoring: Table of rides with status filters.
-
Shared Components:
Navbar: Navigation with role-based links (Passenger, Driver, Admin).ReceiptView: Displays ride details and payment receipt.
The frontend uses Tailwind CSS for styling, with a responsive design for mobile and desktop.
- JWT-based authentication for all APIs except
/api/users/registerand/api/users/login. - Tokens are stored in the browser’s localStorage and sent in the
Authorizationheader. - Role-based access control ensures passengers, drivers, and admins access only their respective endpoints.
- Receipts are generated as plain text emails with ride details (pickup, drop-off, fare, driver name, etc.).
- Sent via an email service (e.g., Nodemailer or a third-party provider like SendGrid) triggered by
/api/payments/:paymentId/receipt.
- Microservice Communication: Services communicate via HTTP REST APIs. For scalability, consider an API Gateway (e.g., Kong or Express Gateway) in production.
- Database: MongoDB collections can be in a single database for the MVP, with separate databases per service in production.
- Security:
- Hash passwords using bcrypt.
- Validate JWT tokens for protected routes.
- Sanitize user inputs to prevent injection attacks.
- Error Handling: Return standardized error responses (e.g.,
400 Bad Request,401 Unauthorized,404 Not Found). - Scalability: Use MongoDB indexes on
email,rideRequestId, andstatusfor efficient queries.
This design covers the complete MVP scope with minimal APIs and a clear microservice structure, ready for implementation with React, Node.js, Express, MongoDB, and Tailwind CSS.