| app | ||
| .gitignore | ||
| api_keys.csv | ||
| api_scramble.sh | ||
| context_processors.py | ||
| CURL.md | ||
| emails_emaildata.csv | ||
| LOGIC_JWT_FASTAPI.md | ||
| main.py | ||
| Makefile | ||
| poetry.lock | ||
| pyproject.toml | ||
| README.md | ||
| requirements.txt | ||
| sql_app.db | ||
| start.sh | ||
| stop_pyenv.sh | ||
| users.csv | ||
| uv.lock | ||
api_citylog
api_citylog è un'applicazione FastAPI progettata per gestire segnalazioni geolocalizzate di problematiche ambientali, stradali e di rifiuti, con un'interfaccia API RESTful sicura e scalabile. Il progetto consente agli utenti autenticati di creare, visualizzare, aggiornare ed eliminare segnalazioni, con supporto per dati storici privi di associazione utente e integrazione di dati esterni (es. prezzi del Brent).
Finalità del Progetto
L'obiettivo principale di api_citylog è fornire un sistema centralizzato per:
- Segnalazioni geolocalizzate: Raccogliere e gestire segnalazioni di rifiuti, problemi ambientali e stradali, con informazioni su posizione, immagini e stato.
- Accesso controllato: Garantire che solo utenti autenticati possano interagire con le segnalazioni, mantenendo la possibilità di accedere a dati storici non associati a utenti specifici.
- Integrazione dati esterni: Recuperare informazioni da API esterne (es. prezzi del Brent) per analisi correlate.
- Tracciabilità e manutenzione: Offrire un sistema robusto con logging e rate limiting per monitorare le operazioni e prevenire abusi.
Il progetto è pensato per enti locali, cittadini o organizzazioni che necessitano di un sistema per monitorare e gestire segnalazioni ambientali in modo strutturato.
Caratteristiche Principali
- Autenticazione JWT: Accesso sicuro tramite token JWT per autenticare gli utenti, con supporto per creazione utenti e login (
POST /users/,POST /auth/token). - Gestione segnalazioni:
- Creazione (
POST /rifiuti/,/ambiente/,/strade/): Inserimento di segnalazioni con dati geolocalizzati, immagini e stato. - Lettura (
GET /rifiuti/,/ambiente/,/strade/): Recupero delle segnalazioni per l'utente autenticato o di tutti i dati conuser_idvuoto. - Aggiornamento (
PUT /rifiuti/{id},/ambiente/{id},/strade/{id}): Modifica parziale dei dati (es. stato, posizione), con aggiornamento automatico del timestamp (image_time). - Eliminazione (
DELETE /rifiuti/{id},/ambiente/{id},/strade/{id}): Rimozione delle segnalazioni, con autorizzazione basata suuser_id.
- Creazione (
- Database PostgreSQL: Persistenza dei dati nella tabella
emails_emaildata, con modelloEmailDatache supportauser_idopzionale (NULL) per compatibilità con dati storici. - Integrazione API esterne: Endpoint
/brent/per recuperare dati sui prezzi del Brent (es. tramite API esterne come Alpha Vantage). - Rate Limiting: Limite di 100 richieste al minuto per prevenire abusi, implementato tramite middleware personalizzato.
- Logging: Tracciamento delle operazioni (
POST,GET,PUT,DELETE) in un fileapp.loge sulla console, con dettagli su utente, ID record ed esito. - Documentazione interattiva: Interfaccia Swagger disponibile su
/docsper testare gli endpoint.
Tecnologie Utilizzate
- FastAPI: Framework Python per API RESTful ad alte prestazioni.
- SQLAlchemy: ORM per la gestione del database PostgreSQL.
- Pydantic: Validazione dei dati per input e output (schemi
EmailData,EmailDataCreate,EmailDataUpdate). - Passlib (bcrypt): Hashing sicuro delle password per l'autenticazione.
- JWT: Autenticazione basata su token con scadenza (30 minuti).
- Httpx: Client HTTP asincrono per chiamate ad API esterne (es. Brent).
- Python Logging: Registrazione delle operazioni per monitoraggio e debug.
Prerequisiti
- Python: 3.12 o 3.13 (3.12 consigliato per compatibilità con
bcrypt). - PostgreSQL: Database configurato (es.
postgresql://user:password@localhost:5432/db_name). - Dipendenze: Installa con
pip install -r requirements.txt. - Strumenti consigliati:
jqper formattare output JSON nel terminale.- Compilatore C (es.
gcc) per installarebcryptsu macOS/Linux.
Installazione
- Clona il repository:
git clone <repository_url> cd api_citylog - Crea e attiva un ambiente virtuale:
python -m venv .venv source .venv/bin/activate # Su Windows: .venv\Scripts\activate - Installa le dipendenze:
pip install -r requirements.txt - Configura il database in
app/db/database.py(es. URL PostgreSQL). - Avvia il server:
./start.sh - Accedi alla documentazione Swagger:
http://localhost:8000/docs(ohttp://192.168.1.159:3000/docsse deployato).
Utilizzo
Autenticazione
- Crea un utente:
curl -X POST "http://localhost:8000/users/" -H "Content-Type: application/json" -d '{"email": "test@example.com", "password": "securepassword123", "name": "Test User"}' | jq - Login e ottieni token JWT:
curl -X POST "http://localhost:8000/auth/token" -H "Content-Type: application/x-www-form-urlencoded" -d "username=test@example.com&password=securepassword123" | jq
Gestione Segnalazioni
- Crea segnalazione (es. rifiuti):
curl -X POST "http://localhost:8000/rifiuti/" -H "Content-Type: application/json" -H "Authorization: Bearer <token>" -d '{"latitude": "45.5245", "longitude": "10.2188", "city": "Brescia", "address": "Via S. Zeno, 102", "image_id": "img123", "image_url": "/media/img.jpg", "image_file": "img.jpg", "status": "pending", "typo": "rifiuti"}' | jq - Recupera segnalazioni:
curl -X GET "http://localhost:8000/rifiuti/" -H "Authorization: Bearer <token>" | jq - Aggiorna segnalazione (es. ID 230):
curl -X PUT "http://localhost:8000/rifiuti/230" -H "Content-Type: application/json" -H "Authorization: Bearer <token>" -d '{"status": "completato"}' | jq - Elimina segnalazione:
curl -X DELETE "http://localhost:8000/rifiuti/230" -H "Authorization: Bearer <token>"
Dati Esterni
- Recupera dati Brent:
curl -X GET "http://localhost:8000/brent/" -H "Authorization: Bearer <token>" | jq
Struttura del Progetto
api_citylog/
├── app/
│ ├── db/
│ │ └── database.py # Configurazione database PostgreSQL
│ ├── models/
│ │ ├── citylog.py # Modello SQLAlchemy per emails_emaildata
│ │ ├── user.py # Modello SQLAlchemy per users
│ │ └── __init__.py
│ ├── schemas/
│ │ ├── emaildata.py # Schemi Pydantic per segnalazioni
│ │ ├── user.py # Schemi Pydantic per utenti
│ │ └── __init__.py
│ ├── routers/
│ │ ├── auth.py # Endpoint per autenticazione
│ │ ├── users.py # Endpoint per gestione utenti
│ │ ├── rifiuti.py # Endpoint per segnalazioni rifiuti
│ │ ├── ambiente.py # Endpoint per segnalazioni ambientali
│ │ ├── strade.py # Endpoint per segnalazioni stradali
│ │ ├── brent.py # Endpoint per dati Brent
│ │ └── __init__.py
│ ├── auth/
│ │ ├── dependencies.py # Dipendenze per autenticazione JWT
│ │ ├── jwt_handler.py # Gestione token JWT
│ │ └── security.py # Hashing delle password
│ ├── middlewares/
│ │ └── rate_limiter.py # Middleware per rate limiting
│ ├── logging_config.py # Configurazione del logging
│ └── main.py # Entry point dell'applicazione
├── requirements.txt # Dipendenze Python
├── start.sh # Script per avviare il server
└── app.log # File di log delle operazioni
Note
- Rate Limiting: 100 richieste/minuto per utente, configurabile in
app/middlewares/rate_limiter.py. - Logging: Operazioni tracciate in
app.loge sulla console (es. creazione, aggiornamento, eliminazione). - Compatibilità: Usa Python 3.12 per evitare problemi con
bcryptsu Python 3.13. - Dati storici: Gli endpoint
GETrestituiscono record conuser_idvuoto per compatibilità con dati preesistenti.
Contributi
Per contribuire, crea una pull request con modifiche documentate. Esegui test con pytest e verifica la documentazione Swagger.
Licenza
MIT License