# Canteen Asset Geolocation Tool Mobile-friendly webapp for tracking physical assets with barcode scanning and GPS check-ins. Built with FastAPI + SQLite + vanilla JS. ## Quick Start ```bash ./start.sh ``` Then open `https://:8901` on your phone. Accept the self-signed cert warning. ## Default Login The server seeds a default admin account on first startup: | Field | Value | |----------|------------| | Username | `admin` | | Password | `changeme` | **Change this password on first login** via the Settings → Users tab. ## Features - **Scan tab** — Barcode scanning via camera. Auto-looks up assets or offers to create new ones. - **Assets tab** — Browse, search, filter, create, edit, delete assets. View check-in history per asset. - **Dashboard tab** — Stats: total assets, check-ins, breakdown by category and status. CSV export. - GPS auto-acquired on page load for location-tagged check-ins. ## Tech Stack | Layer | Tech | |----------|-----------------------------| | Backend | FastAPI + SQLite (WAL mode) | | Frontend | Vanilla HTML/CSS/JS | | Scanner | ZXing library (CDN) | | TLS | Self-signed cert, port 8901 | ## API Base URL: `https://:8901` | Method | Endpoint | Description | |--------|-------------------------------|------------------------------------| | GET | `/health` | Health check | | POST | `/api/assets` | Create asset | | GET | `/api/assets` | List assets (filterable) | | GET | `/api/assets/search?barcode=` | Lookup by barcode | | GET | `/api/assets/{id}` | Get single asset | | PUT | `/api/assets/{id}` | Update asset | | DELETE | `/api/assets/{id}` | Delete asset + check-ins | | POST | `/api/checkins` | Create check-in | | GET | `/api/checkins` | List check-ins (filterable) | | GET | `/api/stats` | Dashboard stats | | GET | `/api/export/assets` | Export assets CSV | | GET | `/api/export/checkins` | Export check-ins CSV | | POST | `/api/geofences` | Create geofence (opt. `user_ids`) | | GET | `/api/geofences` | List geofences (includes assigned users) | | PUT | `/api/geofences/{id}` | Update geofence (+ reassign users) | | DELETE | `/api/geofences/{id}` | Delete geofence | | GET | `/api/users/{id}/geofences` | List geofences assigned to a user | | GET | `/api/locations` | List locations | | GET | `/api/locations/{id}` | Get location with rooms | | GET | `/api/rooms` | List rooms | | GET | `/api/activity` | Activity feed | ### Asset fields `barcode` (unique, required), `name` (required), `description`, `category` (Furniture/Appliances/Utensils & Serveware/Equipment/Other), `status` (active/maintenance/retired), `photo_path`, `created_at`, `updated_at`. ### Check-in fields `asset_id` (required), `latitude`, `longitude`, `accuracy`, `photo_path`, `notes`, `created_at`. ## Environment Variables | Variable | Default | Description | |-----------------|----------------------------|-----------------------| | `CANTEEN_PORT` | `8901` | Listen port | | `CANTEEN_DB_PATH` | `./assets.db` | SQLite database path | | `CANTEEN_WIPE_DB` | (empty) | Set to `1` to clear DB on start | ## Running Tests ```bash pip install -r requirements.txt python -m pytest tests/ -v ``` ## Project Structure ``` canteen-asset-tracker/ ├── server.py # FastAPI app (all routes, DB, error handling) ├── start.sh # One-command startup with cert gen ├── static/ │ └── index.html # SPA frontend (3 tabs + scanner) ├── tests/ │ └── test_server.py # 47 integration tests ├── uploads/ # Photo storage (gitignored) ├── cert.pem # Self-signed TLS cert (auto-generated) ├── key.pem # TLS private key (auto-generated) ├── requirements.txt # Python deps └── README.md ```