feat: add weekly schedule shifts and bulk departures
Build and Push Docker Images / detect-changes (push) Successful in 11s
Build and Push Docker Images / build-auth-api (push) Successful in 1m1s
Build and Push Docker Images / build-employee-api (push) Successful in 59s
Build and Push Docker Images / build-transit-api (push) Successful in 56s
Build and Push Docker Images / build-error-log-api (push) Successful in 1m11s
Build and Push Docker Images / build-admin-ui (push) Successful in 1m37s
Build and Push Docker Images / deploy-test-node (push) Successful in 5s
Build and Push Docker Images / detect-changes (push) Successful in 11s
Build and Push Docker Images / build-auth-api (push) Successful in 1m1s
Build and Push Docker Images / build-employee-api (push) Successful in 59s
Build and Push Docker Images / build-transit-api (push) Successful in 56s
Build and Push Docker Images / build-error-log-api (push) Successful in 1m11s
Build and Push Docker Images / build-admin-ui (push) Successful in 1m37s
Build and Push Docker Images / deploy-test-node (push) Successful in 5s
This commit is contained in:
+81
-9
@@ -61,9 +61,56 @@ Alle endpoints vereisen een `Authorization: Bearer {token}` header.
|
||||
|
||||
### Schedule
|
||||
|
||||
Schedules are weekly templates. Each row in `transit.schedules` represents one
|
||||
departure time for one bus line and one `day_of_week`:
|
||||
|
||||
- `1` to `5`: weekdays
|
||||
- `6`: Saturday
|
||||
- `0`: Sunday
|
||||
|
||||
Driver assignments are stored separately in `transit.shifts` with
|
||||
`(schedule_id, driver_id)`, where `driver_id` references `workers.users(id)`.
|
||||
The current `shifts` shape represents the active assignment. To retain different
|
||||
assignments for different calendar weeks, add a `week_start` (or assignment date
|
||||
range) column and include it in the unique key.
|
||||
|
||||
**GET** `/driver/schedules/daily?date=2026-09-18`
|
||||
|
||||
- Returns only weekly schedule templates assigned to the authenticated driver through `transit.shifts`.
|
||||
|
||||
**PATCH** `/driver/weekly-schedules/:scheduleId/status`
|
||||
|
||||
- Updates the status of an assigned weekly schedule.
|
||||
|
||||
**GET** `/admin/weekly-schedules`
|
||||
|
||||
- Lists weekly templates and their current driver assignments.
|
||||
|
||||
**GET** `/admin/shift-drivers`
|
||||
|
||||
- Lists drivers from `workers.users` for shift assignment.
|
||||
|
||||
**POST** `/admin/weekly-schedules`
|
||||
|
||||
- Creates one template. Body: `{ "busLineId": 1, "dayOfWeek": 1, "startTime": "08:00", "endTime": "09:00", "driverId": 12 }`.
|
||||
|
||||
**POST** `/admin/weekly-schedules/bulk`
|
||||
|
||||
- Creates multiple departures in one transaction. The API derives each end time
|
||||
from the selected bus line duration. Body: `{ "busLineId": 1, "dayOfWeeks": [1,2,3,4,5], "startTimes": ["06:00", "06:30", "07:00"], "driverId": 12 }`.
|
||||
|
||||
**PUT** `/admin/weekly-schedules/:scheduleId/shift`
|
||||
|
||||
- Replaces the driver assignment. Pass `{ "driverId": 12 }` or `{ "driverId": null }`.
|
||||
|
||||
The legacy `/admin/schedules` and `/schedule/daily` endpoints remain for older
|
||||
clients, but new clients must use the weekly schedule endpoints above.
|
||||
|
||||
**GET** `/schedule/daily?date=2024-05-05`
|
||||
|
||||
- Ophalen van dagplanning voor chauffeur
|
||||
- Response:
|
||||
|
||||
```json
|
||||
{
|
||||
"date": "2024-05-05",
|
||||
@@ -88,14 +135,16 @@ Alle endpoints vereisen een `Authorization: Bearer {token}` header.
|
||||
```
|
||||
|
||||
**GET** `/routes/:routeId`
|
||||
|
||||
- Details van een specifieke route
|
||||
- Response: `{ "route": {...} }`
|
||||
|
||||
### Public Schedule Overview
|
||||
|
||||
**GET** `/schedules/overview?date=2026-05-06&lineId=1`
|
||||
|
||||
- Haalt een datum-gebonden overzicht op van geplande diensten
|
||||
- Herhaalde diensten worden naar de geselecteerde datum gematerialiseerd via `weekdays`
|
||||
- Weekly templates are selected by `day_of_week` and driver assignments by `shifts`
|
||||
- Incidentele diensten worden alleen meegenomen op hun exacte datum
|
||||
- Filters: `driverId`/`chauffeurId`, `stopId`/`busStopId`, `lineId`, `status`
|
||||
- Response: `{ "date": "2026-05-06", "summary": {...}, "schedules": [...] }`
|
||||
@@ -103,6 +152,7 @@ Alle endpoints vereisen een `Authorization: Bearer {token}` header.
|
||||
De legacy endpoint **GET** `/schedules` blijft beschikbaar voor bestaande clients.
|
||||
|
||||
Voorbeeld:
|
||||
|
||||
```bash
|
||||
curl "http://localhost:5001/schedules/overview?date=2026-05-06&chauffeurId=12&busStopId=3"
|
||||
```
|
||||
@@ -110,8 +160,10 @@ curl "http://localhost:5001/schedules/overview?date=2026-05-06&chauffeurId=12&bu
|
||||
### Navigation
|
||||
|
||||
**POST** `/navigation/route`
|
||||
|
||||
- Opslaan van berekende route van OSRM
|
||||
- Body:
|
||||
|
||||
```json
|
||||
{
|
||||
"routeId": 1,
|
||||
@@ -129,8 +181,10 @@ curl "http://localhost:5001/schedules/overview?date=2026-05-06&chauffeurId=12&bu
|
||||
```
|
||||
|
||||
**GET** `/bus-lines/:busLineId/stops`
|
||||
|
||||
- Alle stops van een buslijn (voor navigatie waypoints)
|
||||
- Response:
|
||||
|
||||
```json
|
||||
{
|
||||
"stops": [
|
||||
@@ -138,8 +192,8 @@ curl "http://localhost:5001/schedules/overview?date=2026-05-06&chauffeurId=12&bu
|
||||
"id": 1,
|
||||
"order": 1,
|
||||
"name": "Central Station",
|
||||
"latitude": 52.5200,
|
||||
"longitude": 13.4050
|
||||
"latitude": 52.52,
|
||||
"longitude": 13.405
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -148,13 +202,15 @@ curl "http://localhost:5001/schedules/overview?date=2026-05-06&chauffeurId=12&bu
|
||||
### GPS Tracking
|
||||
|
||||
**POST** `/gps/track`
|
||||
|
||||
- Real-time positie opslaan
|
||||
- Body:
|
||||
|
||||
```json
|
||||
{
|
||||
"routeId": 1,
|
||||
"latitude": 52.5210,
|
||||
"longitude": 13.4060,
|
||||
"latitude": 52.521,
|
||||
"longitude": 13.406,
|
||||
"speed": 45.5,
|
||||
"heading": 180,
|
||||
"accuracy": 5.0
|
||||
@@ -162,15 +218,17 @@ curl "http://localhost:5001/schedules/overview?date=2026-05-06&chauffeurId=12&bu
|
||||
```
|
||||
|
||||
**GET** `/gps/route/:routeId`
|
||||
|
||||
- Alle opgeslagen positie punten van een route
|
||||
- Response:
|
||||
|
||||
```json
|
||||
{
|
||||
"positions": [
|
||||
{
|
||||
"id": 1,
|
||||
"latitude": 52.5210,
|
||||
"longitude": 13.4060,
|
||||
"latitude": 52.521,
|
||||
"longitude": 13.406,
|
||||
"speed": 45.5,
|
||||
"heading": 180,
|
||||
"recordedAt": "2024-05-05T08:15:00Z"
|
||||
@@ -182,6 +240,7 @@ curl "http://localhost:5001/schedules/overview?date=2026-05-06&chauffeurId=12&bu
|
||||
### Route Status
|
||||
|
||||
**PATCH** `/routes/:routeId/status`
|
||||
|
||||
- Update route status
|
||||
- Body: `{ "status": "in_progress" }`
|
||||
- Valid statuses: `scheduled`, `in_progress`, `completed`, `cancelled`
|
||||
@@ -191,19 +250,23 @@ curl "http://localhost:5001/schedules/overview?date=2026-05-06&chauffeurId=12&bu
|
||||
Alle admin-endpoints vereisen naast een geldig JWT-token ook dat je `userCode` voorkomt in `ADMIN_USER_CODES`.
|
||||
|
||||
**POST** `/admin/stops`
|
||||
|
||||
- Maak een herbruikbare stop aan
|
||||
- Body:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Central Station",
|
||||
"latitude": 52.5200,
|
||||
"longitude": 13.4050
|
||||
"latitude": 52.52,
|
||||
"longitude": 13.405
|
||||
}
|
||||
```
|
||||
|
||||
**POST** `/admin/bus-lines/:busLineId/stops`
|
||||
|
||||
- Koppel een bestaande stop aan een buslijn
|
||||
- Body:
|
||||
|
||||
```json
|
||||
{
|
||||
"stopId": 1,
|
||||
@@ -215,12 +278,14 @@ Alle admin-endpoints vereisen naast een geldig JWT-token ook dat je `userCode` v
|
||||
## Database Schema
|
||||
|
||||
### bus_types
|
||||
|
||||
- `id` - Primary key
|
||||
- `name` - Bus type name (Standard Bus, etc.)
|
||||
- `seat_capacity` - Number of seats
|
||||
- `license_plate` - Unique license plate
|
||||
|
||||
### bus_lines
|
||||
|
||||
- `id` - Primary key
|
||||
- `line_number` - Unique line number (1, 5, 12, etc.)
|
||||
- `start_stop` - Start stop name
|
||||
@@ -228,11 +293,13 @@ Alle admin-endpoints vereisen naast een geldig JWT-token ook dat je `userCode` v
|
||||
- `estimated_duration_minutes` - Expected route duration
|
||||
|
||||
### stops
|
||||
|
||||
- `id` - Primary key
|
||||
- `name` - Stop name
|
||||
- `latitude`, `longitude` - Stop location
|
||||
|
||||
### route_stops
|
||||
|
||||
- `id` - Primary key
|
||||
- `bus_line_id` - Which bus line the stop belongs to
|
||||
- `stop_id` - Reusable stop reference
|
||||
@@ -240,6 +307,7 @@ Alle admin-endpoints vereisen naast een geldig JWT-token ook dat je `userCode` v
|
||||
- `estimated_arrival_minutes` - Optional ETA per stop
|
||||
|
||||
### routes
|
||||
|
||||
- `id` - Primary key
|
||||
- `user_id` - Chauffeur (references workers.users)
|
||||
- `bus_line_id` - Which line (references bus_lines)
|
||||
@@ -248,6 +316,7 @@ Alle admin-endpoints vereisen naast een geldig JWT-token ook dat je `userCode` v
|
||||
- `status` - scheduled/in_progress/completed/cancelled
|
||||
|
||||
### navigation_routes
|
||||
|
||||
- `id` - Primary key
|
||||
- `route_id` - Link to route (unique)
|
||||
- `polyline_geojson` - GeoJSON LineString van de route
|
||||
@@ -255,6 +324,7 @@ Alle admin-endpoints vereisen naast een geldig JWT-token ook dat je `userCode` v
|
||||
- `total_duration_seconds` - Estimated duration
|
||||
|
||||
### gps_tracking
|
||||
|
||||
- `id` - Primary key
|
||||
- `route_id` - Which route
|
||||
- `latitude`, `longitude` - Current position
|
||||
@@ -287,6 +357,7 @@ await scheduleService.updateRouteStatus(1, 'in_progress');
|
||||
## Error Handling
|
||||
|
||||
Alle endpoints retourneren error responses:
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "error_code",
|
||||
@@ -295,6 +366,7 @@ Alle endpoints retourneren error responses:
|
||||
```
|
||||
|
||||
Common errors:
|
||||
|
||||
- `missing_token` - No Authorization header
|
||||
- `invalid_token` - Token verification failed
|
||||
- `missing_required_fields` - Required data missing
|
||||
|
||||
+3144
-1704
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user