Skip to content

Apollo-Level2-Web-Dev/Batch-4-Assignment-8

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

4 Commits
Β 
Β 

Repository files navigation

Assignment-8 Bike Servicing Management API

🎯 Objective

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.


πŸ›  Technologies Required

  • Node.js
  • Express.js
  • TypeScript
  • Prisma ORM
  • PostgreSQL

🧱 Database Schema

Use Prisma with UUIDs for all primary keys.

1. Customer Table

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

2. Bike Table

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

3. ServiceRecord Table

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”

πŸ“¦ API Features & Endpoints


1. Customer Management


βœ… 1. POST /api/customers - Create a new customer

πŸ“₯ Request Body

{
  "name": "John Doe",
  "email": "john.doe@example.com",
  "phone": "123-456-7890"
}

πŸ“€ Response Example (201 Created)

{
  "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"
  }
}

βœ… 2. GET /api/customers - Get all customers

πŸ“€ Response Example (200 Ok)

{
  "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"
    },
    {...}
  ]
}

βœ… 3. GET /api/customers/87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194 - Get a specific customer by ID

πŸ“€ Response Example (200 Ok)

{
  "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"
  }
}

βœ… 4. PUT /api/customers/87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194 - Update customer details

πŸ“₯ Request Body (any of the fields can be updated)

{
  "name": "Johnathan Doe",
  "phone": "555-123-9999"
}

πŸ“€ Response Example (200 Ok)

{
  "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"
  }
}


βœ… 5. DELETE /api/customers/87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194 - Delete a customer

πŸ“€ Response Example (200 Ok)

{
  "success": true,
  "message": "Customer deleted successfully"
}

2. Bike Management


βœ… 1. POST /api/bikes - Add a new bike

πŸ“₯ Request Body (201 Created)

{
  "brand": "Yamaha",
  "model": "R15",
  "year": 2022,
  "customerId": "87b3d7e1-8d9a-4f51-bf01-6f1e92f0f194"
}

πŸ“€ Response Example (200 Ok)

{
  "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"
  }
}

βœ… 2. GET /api/bikes - Get all bikes

πŸ“€ Response Example (200 Ok)

{
  "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"
    }
  ]
}

βœ… 3. GET /api/bikes/f3f1b192-3e62-402e-9bd3-d351a5a10e92 - Get a specific bike by ID

πŸ“€ Response Example (200 Ok)

{
  "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"
  }
}

3. Service Management


βœ… 1. POST /api/services – Create a service record

πŸ“₯ Request Body

{
  "bikeId": "f3f1b192-3e62-402e-9bd3-d351a5a10e92",
  "serviceDate": "2025-04-11T10:00:00.000Z",
  "description": "Oil change",
  "status": "pending"
}

πŸ“€ Response Example (201 Created)

{
  "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"
  }
}

βœ… 2. GET /api/services – Get all service records

πŸ“€ Response Example (200 Ok)

{
  "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"
    },
    {...}
  ]
}

βœ… 3. GET /api/services/a1e4a182-c80d-4ff7-9a3d-873929f9d0e6 – Get a specific service record

πŸ“€ Response Example (200 Ok)

{
  "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

πŸ“₯ Request Body (optional: custom completionDate, else default to now)

{
  "completionDate": "2025-04-11T15:30:00.000Z"
}

πŸ“€ Response Example (200 Ok)

{
  "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"
  }
}

🎁 Bonus (10 Marks)

🧯 Error Handling

Standardized Error Response Structure

{
  "success": false,
  "status": 404,
  "message": "Customer not found",
  "stack": "Optional stack trace shown only in development"
}


⏳ Pending or Overdue Services

βœ… GET /api/services/status – Pending or Overdue Services (older than 7 days)

This route returns all services that:

  • Have status = "pending" or "in-progress", and
  • serviceDate is older than 7 days

πŸ“€ Response Example (200 Ok)

{
  "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"
    }
  ]
}

πŸ“„ Submission Guidelines

βœ… README

Include:

  • Project name & summary
  • Live backend link (e.g., Railway, Render)
  • Tech stack
  • Setup guide
  • Key features

βœ… What to Submit:

  • βœ… GitHub Repo Link
  • βœ… Live Backend URL

πŸ“… Deadlines:

  • Full Marks (60): 18 April, 2025
  • 50 Marks: 19 April, 2025
  • Late (30 Marks): After 19 April, 2025

⚠️ IMPORTANT ALERT - STRICT REQUIREMENTS ⚠️

PLEASE NOTE CAREFULLY:

  1. All API endpoints must be implemented exactly as specified in the requirements document
  2. You must follow the exact same request and response structures provided

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published