# AGENTS.md - Family Safety Tracker ## Overview Dart server app (Shelf + PostgreSQL) for sharing geolocation with family members. REST API with JWT auth, bcrypt password hashing, and auto-expiring position data. ## Quick Start ```bash dart pub get dart run bin/server.dart ``` Server starts on port `8080` (override with `PORT` env var). ## Code Structure - **`bin/`** - All application code lives here (not `lib/`, which is empty). - `bin/server.dart` - Entry point. Starts Shelf server, database connection, and cleanup timer. - `bin/routes/` - Route handlers (`auth_routes.dart`, `user_routes.dart`, `geo_routes.dart`) - `bin/repositories/` - Data access layer (`user_repo.dart`, `geoposition_repo.dart`) - `bin/models/` - Domain models (`user.dart`, `geoposition.dart`, `log.dart`) - `bin/database/` - Database connection and auto-migration - **`lib/`** - Empty scaffold directory (stale, can be ignored). ## Database - PostgreSQL with connection via environment variables (`POSTGRES_HOST`, `POSTGRES_DB`, etc.) or defaults. - **Auto-migration**: Tables are created on startup via `Database.initialize()`. No manual migration needed. - Tables: `users`, `geopositions`, `logs`. ## Runtime Behavior - Expired geopositions are cleaned up every 5 minutes by a periodic timer in `server.dart`. - Share links use UUIDs stored in-memory via `GeopositionRepository`. ## API Endpoints - `POST /login` - Authenticate with login/password, returns user data. - `/user` - CRUD for users. - `/geo` - POST to create position, UPDATE to update (with lifetime expiry). - `GET /watch?unique_id=...` - Returns latest position for a share link. - `/share` - Creates a one-time share link UUID. ## Testing ```bash dart test ``` Tests spawn the server process and hit endpoints. Server listens on port `8080` by default. ## Build/Quality Commands ```bash dart analyze # Static analysis (uses analysis_options.yaml) dart format --set . # Format code ``` ## Dependencies - `shelf`, `shelf_router` - HTTP framework - `postgres` - PostgreSQL driver - `bcrypt` - Password hashing - `dart_jsonwebtoken` - JWT tokens - `dotenv` - Environment config - `uuid` - UUID generation ## Notes - SDK: `^3.10.1` - No Docker setup present (`.dockerignore` exists but no `Dockerfile`). - Documentation in `README.md` is in Russian; the API is designed for geolocation sharing between family members. - `test_bcrypt.dart` is a standalone test file, not part of the test suite.