Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

12 - API Mapping (Transport Module)

Exact wire contracts for the Transport module. Base path /api/v1 (URI versioning, main.ts); all endpoints JWT-guarded (transport.controller.ts:23-26), tenant-scoped (base.repository.ts:20-30). Envelopes per 00-shared/07 §2-3. Permissions from permissions.constants.ts:62-74 (guards on endpoints not yet wired - AGENTS.md).


1. Vehicles (transport.controller.ts:30-58)

MethodPathPermissionDTO / sourceDescription
POST/transport/vehiclestransport.vehicle.createCreateVehicleDto (create-vehicle.dto.ts:5-42)Add a vehicle; 409 dup plate (transport.service.ts:38-45); emits VehicleCreated (:47-57)
GET/transport/vehicles?page=1&limit=20transport.vehicle.read-List, sort plateNumber asc, paginated meta (transport.service.ts:61-76; transport.controller.ts:36-40)
GET/transport/vehicles/:idtransport.vehicle.read-Get by ID; 404 (transport.service.ts:78-82)
PATCH/transport/vehicles/:idtransport.vehicle.updateUpdateVehicleDto (PartialType, update-vehicle.dto.ts:4)Update; 404 (transport.service.ts:84-91)
DELETE/transport/vehicles/:idtransport.vehicle.delete-Soft delete; 409 if on a route (transport.service.ts:93-110); emits VehicleDeleted

2. Routes (transport.controller.ts:60-88)

MethodPathPermissionDTO / sourceDescription
POST/transport/routestransport.route.createCreateRouteDto (create-route.dto.ts:21-60)Create; 409 dup name (transport.service.ts:112-130); emits RouteCreated
GET/transport/routes?page=1&limit=20transport.route.read-List, sort name asc (transport.service.ts:132-147)
GET/transport/routes/:idtransport.route.read-404 (transport.service.ts:149-153)
PATCH/transport/routes/:idtransport.route.updateUpdateRouteDto (PartialType)Update incl. stops/vehicleId/driverId; ObjectId conversion (transport.service.ts:155-165)
DELETE/transport/routes/:idtransport.route.delete-Soft delete; 409 if active assignments (transport.service.ts:167-174)

3. Drivers (transport.controller.ts:90-118)

MethodPathPermissionDTO / sourceDescription
POST/transport/driverstransport.driver.createCreateDriverDto (create-driver.dto.ts:4-50)Add; 409 dup license OR phone (transport.service.ts:176-199)
GET/transport/drivers?page=1&limit=20transport.driver.read-List, sort firstName asc (transport.service.ts:201-216)
GET/transport/drivers/:idtransport.driver.read-404 (transport.service.ts:218-222)
PATCH/transport/drivers/:idtransport.driver.updateUpdateDriverDto (PartialType)Update; date re-parse (transport.service.ts:224-238)
DELETE/transport/drivers/:idtransport.driver.delete-Soft delete; 409 if on a route (transport.service.ts:240-249)

4. Assignments (transport.controller.ts:120-136)

MethodPathPermissionDTO / sourceDescription
POST/transport/assigntransport.assignAssignRouteDto (assign-route.dto.ts:4-26)Assign student to route; 409 dup (route, student) (transport.service.ts:251-280); emits StudentRouteAssigned
GET/transport/assignments/:studentIdtransport.assign (or route.read context)-Student's assignments, route populated (transport.service.ts:282-286, route-assignment.repository.ts:20-24)
DELETE/transport/assignments/:idtransport.assign-Remove assignment (soft delete); 404 (transport.service.ts:288-291)

5. Request examples

POST /api/v1/transport/vehicles
{ "plateNumber": "ABC-123", "model": "Toyota Coaster", "capacity": 30,
  "type": "bus", "year": 2022, "color": "white" }

POST /api/v1/transport/routes
{ "name": "Route A", "startPoint": "Main Gate", "endPoint": "City Center",
  "stops": [ { "name": "Market", "order": 1 }, { "name": "Station", "order": 2 } ],
  "vehicleId": "64f...", "driverId": "64f...", "estimatedDuration": 45 }

POST /api/v1/transport/assign
{ "routeId": "64f...", "studentId": "64f...", "shift": "both",
  "stopName": "Market", "notes": "Gate 2 pickup" }

6. Response shapes

  • List: { data: VehicleDoc[], meta: { page, limit, totalItems, totalPages, hasNext, hasPrevious } } (buildPaginationMeta, transport.service.ts:75).
  • Single/created/updated: { data: <Doc> } (envelope interceptor, 00-shared/07).
  • Student assignments: { data: RouteAssignment[] } with routeId populated (route-assignment.repository.ts:20-24).
  • Delete: 200/204 envelope, no body.

7. Error map

CodeMeaningSource
401unauthenticatedJwtAuthGuard (transport.controller.ts:25)
404entity missingtransport.service.ts:80, 101, 151, 173, 220, 237, 248, 290
409dup plate / route name / license / phone / assignmenttransport.service.ts:42-44, 115, 181-183, 187-189, 257
409dependency blocks deletetransport.service.ts:98, 170, 245
400DTO validation (class-validator)create-*.dto.ts

8. Planned / not yet in source

PathStatusSource
Live tracking, bus attendance, fee calc, emergency endpoints(planned)IMPLEMENTATION_PLAN.md:229
Assignment status PATCH (active/inactive)(planned) - schema field exists, no endpoint (route-assignment.schema.ts:23-28)gap
Search/filter query params (q, status, type)(planned) - lists filter {} (transport.service.ts:69, 141, 210)gap
Parent bus-tracking read(forward-looking)docs/user-flows/END_TO_END_USER_FLOWS.md:392-406
Notifications (e.g. transport.delay)(planned)docs/user-flows/END_TO_END_USER_FLOWS.md:430