A container‑ready Flask + Gunicorn backend that ingests real‑time vehicle telemetry, generates alerts, and exposes fleet‑level analytics APIs. This repository is the Phase 2 deliverable for the MOTORQ assignment.
├── app.py # Flask bootstrap – registers blueprints
├── blueprints/ # Modular route groups
│ ├── vehicles.py
│ ├── telemetry.py
│ └── analytics.py
├── db.py # SQLite connection + schema
├── state_tracker.py # Out‑of‑order / sanity checks
├── telemetry_generator.py # Sends random telemetry every 30 s (optional)
├── generate_vals.py # One‑shot seeder (10 vehicles + telemetry)
├── Dockerfile # Builds the API image
├── docker-compose.yml # Orchestrates api + generator
└── requirements.txt # Python deps
# build & start (API on http://localhost:8088)
docker compose up --build -d
# tail the logs
docker compose logs -f apipython -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
export FLASK_APP=app.py
flask --app app.py --debug run # http://localhost:5000SQLite file: created automatically as
motorq_test.dbin the project root.
python generate_vals.py --host http://localhost:8088 # or 5000 if non‑dockerNeed a constant stream?
telemetry_generator.py (already running inside Docker as motorq-gen) posts random data every 30 s.
| Method | Endpoint | Description | Body / Query params |
|---|---|---|---|
| POST | /vehicle/register |
Create / update a vehicle | {VIN, manufacturer, model, fleetId, owner, registration_status} |
| GET | /vehicle/all |
List every vehicle | – |
| GET | /vehicle/<vin> |
Get one vehicle by VIN | – |
| GET | /vehicle/query |
Filter by fleetId / status | ?fleetId=Corporate®istration_status=Active |
| POST | /vehicle/inactive |
Mark a VIN decommissioned | { "VIN": 123 } |
| POST | /telemetry |
Ingest one telemetry record | { VIN, latitude, longitude, speed, engine_status, fuel_percentage, odometer, diagnostic_codes } |
| GET | /alerts |
All alerts (speed > 100 km/h or fuel < 15 %) | – |
| GET | /analytics/ |
Global or owner‑filtered KPIs | ?owner=Alice (opt.) |
| GET | /analytics/fleet/<owner> |
24‑h fleet insights for that owner | – |
All endpoints return JSON and meaningful HTTP status codes (400 on bad input, 404 on missing VIN, 409 on out‑of‑order telemetry, etc.).
| Service | Image tag | Purpose | Host port |
|---|---|---|---|
| api | fleet-api |
Gunicorn + Flask REST backend | 8088 → 5000 |
| generator | fleet-generator |
Posts random telemetry (demo load) | – |
Change the host port by editing
ports:indocker-compose.yml(e.g."8000:5000").
| Variable | Default | Description |
|---|---|---|
FLASK_ENV |
production |
Set to development to see tracebacks inside container |
| (none) | – | SQLite path is hard‑coded to /app/motorq_test.db inside the image |
# health
curl http://localhost:8088/vehicle/all
# register one more vehicle
curl -X POST http://localhost:8088/vehicle/register \
-H "Content-Type: application/json" \
-d '{"VIN":3001,"manufacturer":"Demo","model":"One","fleetId":"Corporate","owner":"QA","registration_status":"Active"}'
# post telemetry
curl -X POST http://localhost:8088/telemetry \
-H "Content-Type: application/json" \
-d '{"VIN":3001,"latitude":12.9,"longitude":77.6,"speed":112,"engine_status":"ON","fuel_percentage":12,"odometer":4567,"diagnostic_codes":"None"}'
# check alerts
curl http://localhost:8088/alerts | jq .