Develop a backend API for a Bike Servicing Management System that allows a bike servicing center to manage customers
, bikes
, and service
records. The API will support CRUD operations for bikes, customers, and services, and include special endpoints for assigning and completing servicing jobs.
- Node.js
- Express.js
- TypeScript
- Prisma ORM
- PostgreSQL
Use Prisma with UUIDs for all primary keys.
Field | Type | Description |
---|---|---|
customerId |
UUID | Unique identifier for the customer |
name |
String | Full name of the customer |
email |
String | Unique email |
phone |
String | Contact number |
createdAt |
DateTime | Auto timestamp when created |
Field | Type | Description |
---|---|---|
bikeId |
UUID | Unique identifier for each bike |
brand |
String | Brand of the bike (e.g., Honda, Yamaha) |
model |
String | Model name |
year |
Int | Manufacturing year |
customerId |
UUID | Foreign key referencing Customer |
Field | Type | Description |
---|---|---|
serviceId |
UUID | Unique identifier for the service record |
bikeId |
UUID | FK to Bike |
serviceDate |
DateTime | Date the service started |
completionDate |
DateTime | Nullable. Date the service completed |
description |
String | Details of service (e.g., oil change) |
status |
String | Status: βpendingβ, βin-progressβ, βdoneβ |
{
"name": "John Doe",
"email": "john.doe@example.com",
"phone": "123-456-7890"
}
{
"success": true,
"message": "Customer created successfully",
"data": {
"customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194",
"name": "John Doe",
"email": "[email protected]",
"phone": "123-456-7890",
"createdAt": "2025-04-11T12:34:56.789Z"
}
}
{
"success": true,
"message": "Customers fetched successfully",
"data": [
{
"customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194",
"name": "John Doe",
"email": "john.doe@example.com",
"phone": "123-456-7890",
"createdAt": "2025-04-11T12:34:56.789Z"
},
{...}
]
}
{
"success": true,
"message": "Customer fetched successfully",
"data": {
"customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194",
"name": "John Doe",
"email": "[email protected]",
"phone": "123-456-7890",
"createdAt": "2025-04-11T12:34:56.789Z"
}
}
{
"name": "Johnathan Doe",
"phone": "555-123-9999"
}
{
"success": true,
"message": "Customer updated successfully",
"data": {
"customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194",
"name": "Johnathan Doe",
"email": "[email protected]",
"phone": "555-123-9999",
"createdAt": "2025-04-11T12:34:56.789Z"
}
}
{
"success": true,
"message": "Customer deleted successfully"
}
{
"brand": "Yamaha",
"model": "R15",
"year": 2022,
"customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194"
}
{
"success": true,
"message": "Bike added successfully",
"data": {
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"brand": "Yamaha",
"model": "R15",
"year": 2022,
"customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194"
}
}
{
"success": true,
"message": "Bikes fetched successfully",
"data": [
{
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"brand": "Yamaha",
"model": "R15",
"year": 2022,
"customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194"
}
]
}
{
"success": true,
"message": "Bike fetched successfully",
"data": {
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"brand": "Yamaha",
"model": "R15",
"year": 2022,
"customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194"
}
}
{
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"serviceDate": "2025-04-11T10:00:00.000Z",
"description": "Oil change",
"status": "pending"
}
{
"success": true,
"message": "Service record created successfully",
"data": {
"serviceId": "a1e4a182-c80d-4ff7-9a3d-873929f9d0e6",
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"serviceDate": "2025-04-11T10:00:00.000Z",
"completionDate": null,
"description": "Oil change",
"status": "pending"
}
}
{
"success": true,
"message": "Service records fetched successfully",
"data": [
{
"serviceId": "a1e4a182-c80d-4ff7-9a3d-873929f9d0e6",
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"serviceDate": "2025-04-11T10:00:00.000Z",
"completionDate": null,
"description": "Oil change",
"status": "pending"
},
{...}
]
}
{
"success": true,
"message": "Service record fetched successfully",
"data": {
"serviceId": "a1e4a182-c80d-4ff7-9a3d-873929f9d0e6",
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"serviceDate": "2025-04-11T10:00:00.000Z",
"completionDate": null,
"description": "Oil change",
"status": "pending"
}
}
β
4. PUT /api/services/a1e4a182-c80d-4ff7-9a3d-873929f9d0e6/complete
β Mark a service as completed
{
"completionDate": "2025-04-11T15:30:00.000Z"
}
{
"success": true,
"message": "Service marked as completed",
"data": {
"serviceId": "a1e4a182-c80d-4ff7-9a3d-873929f9d0e6",
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"serviceDate": "2025-04-11T10:00:00.000Z",
"completionDate": "2025-04-11T15:30:00.000Z",
"description": "Oil change",
"status": "done"
}
}
{
"success": false,
"status": 404,
"message": "Customer not found",
"stack": "Optional stack trace shown only in development"
}
This route returns all services that:
- Have
status
="pending"
or"in-progress"
, and serviceDate
is older than 7 days
{
"success": true,
"message": "Overdue or pending services fetched successfully",
"data": [
{
"serviceId": "a1e4a182-c80d-4ff7-9a3d-873929f9d0e6",
"bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
"serviceDate": "2025-04-01T10:00:00.000Z",
"completionDate": null,
"description": "Oil change",
"status": "pending"
},
{
"serviceId": "c9bce2ff-44a2-4b3f-bef7-04f5e35d21d2",
"bikeId": "a3d2d3cb-f72f-4b63-a7d6-20e57bc30ef1",
"serviceDate": "2025-04-02T12:00:00.000Z",
"completionDate": null,
"description": "Engine tuning",
"status": "in-progress"
}
]
}
Include:
- Project name & summary
- Live backend link (e.g., Railway, Render)
- Tech stack
- Setup guide
- Key features
- β GitHub Repo Link
- β Live Backend URL
- Full Marks (60): 18 April, 2025
- 50 Marks: 19 April, 2025
- Late (30 Marks): After 19 April, 2025
PLEASE NOTE CAREFULLY:
- All API endpoints must be implemented exactly as specified in the requirements document
- You must follow the exact same request and response structures provided