- T55: Setup APScheduler with AsyncIOScheduler and @scheduled_job decorator - T56: Implement hourly usage stats sync from OpenRouter API - T57: Implement daily API key validation job - T58: Implement weekly cleanup job for old usage stats - Add usage_stats_retention_days config option - Integrate scheduler with FastAPI lifespan events - Add 26 unit tests for scheduler, sync, and cleanup tasks - Add apscheduler to requirements.txt The background tasks now automatically: - Sync usage stats every hour from OpenRouter - Validate API keys daily at 2 AM UTC - Clean up old data weekly on Sunday at 3 AM UTC
11 KiB
11 KiB
Progress Tracking
Feature: Fase 1 - MVP OpenRouter API Key Monitor
📊 Stato Generale
| Metrica | Valore |
|---|---|
| Stato | 🟢 Gestione Token API Completata |
| Progresso | 52% |
| Task Totali | 74 |
| Task Completati | 38 |
| Task In Progress | 0 |
🎯 Obiettivi Fase 1 (MVP)
Core Features
- ✅ Autenticazione utenti (registrazione/login JWT)
- ✅ CRUD API key (cifrate AES-256)
- ✅ Dashboard statistiche base (aggregazione dati)
- ✅ API pubblica autenticata (sola lettura)
Requisiti Non Funzionali
- Tempo di risposta web < 2 secondi
- API response time < 500ms
- Supporto 100+ utenti concorrenti
- Test coverage >= 90%
- Sicurezza: AES-256, bcrypt, JWT, rate limiting
📋 Task Pianificate
🔧 Setup Progetto (T01-T05) - 5/5 completati
- T01: Creare struttura cartelle progetto (2024-04-07)
- T02: Inizializzare virtual environment e .gitignore (2024-04-07)
- T03: Creare requirements.txt con dipendenze (2024-04-07)
- T04: Setup file configurazione (.env, config.py) (2024-04-07)
- T05: Configurare pytest e struttura test (2024-04-07)
🗄️ Database & Models (T06-T11) - 6/6 completati
- T06: Creare database.py (connection & session) - ✅ Completato (2026-04-07 11:00)
- T07: Creare model User (SQLAlchemy) - ✅ Completato (2026-04-07 11:15)
- T08: Creare model ApiKey (SQLAlchemy) - ✅ Completato (2026-04-07 11:15)
- T09: Creare model UsageStats (SQLAlchemy) - ✅ Completato (2026-04-07 11:15)
- T10: Creare model ApiToken (SQLAlchemy) - ✅ Completato (2026-04-07 11:15)
- T11: Setup Alembic e creare migrazione iniziale - ✅ Completato (2026-04-07 11:20)
🔐 Servizi di Sicurezza (T12-T16) - 5/5 completati
- T12: Implementare EncryptionService (AES-256) - ✅ Completato (2026-04-07 12:00, commit:
2fdd9d1) - T13: Implementare password hashing (bcrypt) - ✅ Completato (2026-04-07 12:15, commit:
54e8116) - T14: Implementare JWT utilities - ✅ Completato (2026-04-07 12:30, commit:
781e564) - T15: Implementare API token generation - ✅ Completato (2026-04-07 12:45, commit:
649ff76) - T16: Scrivere test per servizi di sicurezza - ✅ Completato (test inclusi in T12-T15)
Progresso sezione: 100% (5/5 task) Test totali servizi: 71 test passanti Coverage servizi: 100%
👤 Autenticazione Utenti (T17-T22) - 6/6 completati
- T17: Creare Pydantic schemas auth (register/login) - ✅ Completato (2026-04-07 14:30)
- T18: Implementare endpoint POST /api/auth/register - ✅ Completato (2026-04-07 15:00)
- T19: Implementare endpoint POST /api/auth/login - ✅ Completato (2026-04-07 15:00)
- T20: Implementare endpoint POST /api/auth/logout - ✅ Completato (2026-04-07 15:00)
- T21: Creare dipendenza get_current_user - ✅ Completato (2026-04-07 15:00)
- T22: Scrivere test per auth endpoints - ✅ Completato (2026-04-07 15:15)
Progresso sezione: 100% (6/6 task) Test totali auth: 34 test (19 schemas + 15 router) Coverage auth: 98%+
🔑 Gestione API Keys (T23-T29) - 7/7 completati ✅
- T23: Creare Pydantic schemas per API keys - ✅ Completato (2026-04-07 16:00, commit:
2e4c1bb) - T24: Implementare POST /api/keys (create) - ✅ Completato (2026-04-07 16:30, commit:
abf7e7a) - T25: Implementare GET /api/keys (list) - ✅ Completato (2026-04-07 16:30, commit:
abf7e7a) - T26: Implementare PUT /api/keys/{id} (update) - ✅ Completato (2026-04-07 16:30, commit:
abf7e7a) - T27: Implementare DELETE /api/keys/{id} - ✅ Completato (2026-04-07 16:30, commit:
abf7e7a) - T28: Implementare servizio validazione key - ✅ Completato (2026-04-07 17:10, commit:
3824ce5) - T29: Scrivere test per API keys CRUD - ✅ Completato (2026-04-07 17:15, incluso in T24-T27)
Progresso sezione: 100% (7/7 task) Test totali API keys: 38 test (25 router + 13 schema) Coverage router: 100%
📊 Dashboard & Statistiche (T30-T34) - 4/5 completati
- T30: Creare Pydantic schemas per stats - ✅ Completato (2026-04-07 17:45)
- Creato: UsageStatsCreate, UsageStatsResponse, StatsSummary, StatsByModel, StatsByDate, DashboardResponse
- Test: 16 test passanti, 100% coverage su schemas/stats.py
- T31: Implementare servizio aggregazione stats - ✅ Completato (2026-04-07 18:30)
- Creato: get_summary(), get_by_model(), get_by_date(), get_dashboard_data()
- Query SQLAlchemy con join ApiKey per filtro user_id
- Test: 11 test passanti, 84% coverage su services/stats.py
- T32: Implementare endpoint GET /api/stats/dashboard - ✅ Completato (2026-04-07 19:00)
- Endpoint: GET /api/stats/dashboard
- Query param: days (1-365, default 30)
- Auth required via get_current_user
- Returns DashboardResponse
- T33: Implementare endpoint GET /api/usage - ✅ Completato (2026-04-07 19:00)
- Endpoint: GET /api/usage
- Required params: start_date, end_date
- Optional filters: api_key_id, model
- Pagination: skip, limit (max 1000)
- Returns List[UsageStatsResponse]
- T34: Scrivere test per stats endpoints 🟡 In progress
- Test base creati (16 test)
- Alcuni test richiedono fixture condivisi
🌐 Public API v1 (T35-T43) - 6/9 completati
- T35: Creare Pydantic schemas per API pubblica - ✅ Completato (2026-04-07)
- Creati: PublicStatsResponse, PublicUsageResponse, PublicKeyInfo, ApiToken schemas
- Test: 25 test passanti, 100% coverage
- T36: Implementare GET /api/v1/stats - ✅ Completato (2026-04-07)
- Auth via API token, date range default 30 giorni, aggiorna last_used_at
- Test: 8 test passanti
- T37: Implementare GET /api/v1/usage - ✅ Completato (2026-04-07)
- Paginazione con page/limit (max 1000), filtri date richiesti
- Test: 7 test passanti
- T38: Implementare GET /api/v1/keys - ✅ Completato (2026-04-07)
- Lista keys con stats aggregate, NO key values in risposta (sicurezza)
- Test: 5 test passanti
- T39: Implementare rate limiting per API pubblica - ✅ Completato (2026-04-07)
- 100 req/ora per token, 30 req/min per IP fallback, headers X-RateLimit-*
- Test: 18 test passanti, 98% coverage
- T40: Scrivere test per public API endpoints - ✅ Completato (2026-04-07)
- 27 test endpoint + 18 test rate limit + 25 test schemas = 70 test totali
- Coverage: public_api.py 100%, rate_limit.py 98%
- T41: Implementare POST /api/tokens (generate) - ✅ Completato (2026-04-07, commit:
5e89674)- Endpoint: POST /api/tokens con auth JWT
- Limite: MAX_API_TOKENS_PER_USER (default 5)
- Token plaintext mostrato SOLO in risposta creazione
- Hash SHA-256 salvato nel DB
- Test: 8 test passanti, 100% coverage
- T42: Implementare GET /api/tokens (list) - ✅ Completato (2026-04-07, commit:
5e89674)- Endpoint: GET /api/tokens con auth JWT
- NO token values in risposta (sicurezza)
- Ordinamento: created_at DESC
- Solo token attivi (is_active=True)
- Test: 7 test passanti
- T43: Implementare DELETE /api/tokens/{id} - ✅ Completato (2026-04-07, commit:
5e89674)- Endpoint: DELETE /api/tokens/{id} con auth JWT
- Soft delete: is_active=False
- Verifica ownership (403 se non proprio)
- Token revocato non funziona su API pubblica
- Test: 9 test passanti
🎨 Frontend Web (T44-T54) - 0/11 completati
- T44: Setup Jinja2 templates e static files
- T45: Creare base.html (layout principale)
- T46: Creare login.html
- T47: Creare register.html
- T48: Implementare router /login (GET/POST)
- T49: Implementare router /register (GET/POST)
- T50: Creare dashboard.html
- T51: Implementare router /dashboard
- T52: Creare keys.html
- T53: Implementare router /keys
- T54: Aggiungere HTMX per azioni CRUD
⚙️ Background Tasks (T55-T58) - 4/4 completati ✅
- T55: Configurare APScheduler - ✅ Completato (2026-04-07 20:30)
- Creato: AsyncIOScheduler singleton con timezone UTC
- Creato: Decorator @scheduled_job per registrare task
- Integrato: FastAPI lifespan per startup/shutdown
- Test: 10 test passanti
- T56: Implementare task sync usage stats - ✅ Completato (2026-04-07 20:30)
- Task: sync_usage_stats ogni ora (IntervalTrigger)
- Features: Decripta key, chiama OpenRouter /usage, upsert in UsageStats
- Rate limiting: 0.35s tra richieste (20 req/min)
- Date range: ultimi 7 giorni
- Test: 6 test passanti
- T57: Implementare task validazione key - ✅ Completato (2026-04-07 20:30)
- Task: validate_api_keys giornaliero alle 2:00 AM (CronTrigger)
- Features: Decripta key, chiama OpenRouter /auth/key, disattiva key invalide
- Test: 4 test passanti
- T58: Implementare task cleanup dati vecchi - ✅ Completato (2026-04-07 20:30)
- Task: cleanup_old_usage_stats settimanale domenica 3:00 AM
- Features: Rimuove UsageStats più vecchi di 365 giorni (configurabile)
- Test: 6 test passanti
Progresso sezione: 100% (4/4 task) Test totali tasks: 26 test passanti
🔒 Sicurezza & Hardening (T59-T63) - 0/5 completati
- T59: Implementare security headers middleware
- T60: Implementare rate limiting auth endpoints
- T61: Implementare CORS policy
- T62: Audit: verificare cifratura API keys
- T63: Audit: verificare SQL injection prevention
🧪 Testing & QA (T64-T68) - 0/5 completati
- T64: Scrivere test unitari per models
- T65: Scrivere test integrazione auth flow
- T66: Scrivere test integrazione API keys
- T67: Verificare coverage >= 90%
- T68: Eseguire security scan dipendenze
📝 Documentazione (T69-T71) - 0/3 completati
- T69: Scrivere README.md completo
- T70: Documentare API con OpenAPI
- T71: Creare esempi curl per API
🚀 Deployment (T72-T74) - 0/3 completati
- T72: Creare Dockerfile
- T73: Creare docker-compose.yml
- T74: Scrivere script avvio produzione
📈 Grafico Progresso
Progresso MVP Fase 1
TODO [██████████████████████████ ] 70%
IN PROGRESS [ ] 0%
REVIEW [ ] 0%
DONE [████████ ] 30%
0% 25% 50% 75% 100%
🔥 Blockers
Nessun blocker attivo
| ID | Descrizione | Impatto | Data Apertura | Data Risoluzione |
|---|---|---|---|---|
| - | - | - | - | - |
📝 Decisioni Log
| Data | Decisione | Motivazione | Stato |
|---|---|---|---|
| 2024-01-15 | Stack: FastAPI + SQLite + HTMX | MVP semplice, zero-config | ✅ Approvata |
| 2024-01-15 | Cifratura: AES-256-GCM | Requisito sicurezza PRD | ✅ Approvata |
| 2024-01-15 | Auth: JWT con cookie | Semplice per web + API | ✅ Approvata |
🐛 Issue Tracking
Issue riscontrati durante lo sviluppo
| ID | Descrizione | Severità | Stato | Assegnato | Note |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
📚 Risorse
- PRD:
/home/google/Sources/LucaSacchiNet/openrouter-watcher/prd.md - Architettura:
/home/google/Sources/LucaSacchiNet/openrouter-watcher/export/architecture.md - Kanban:
/home/google/Sources/LucaSacchiNet/openrouter-watcher/export/kanban.md
Ultimo aggiornamento: 2026-04-07
Prossimo aggiornamento: Fase Security Services (T12-T16)