5.1 KiB
Sistema di Prenotazione Mensa - Documentazione Tecnica
Abstract
Il sistema di prenotazione mensa è una piattaforma web-based sviluppata, con FastAPI e PostgreSQL a livello backend e NiceGUI per le interfacce fullstack, che consente agli utenti di prenotare pasti giornalieri. L'architettura è basata su un'API RESTful con autenticazione JWT, garantendo sicurezza e scalabilità. Il sistema gestisce tr entità principali interconnesse: prenotazioni, pasti e pietanze, utilizzando campi JSON per semplificare le relazioni e migliorare le erformance. I dati utente sono forniti dal JWT auth bearer evittando la memorizzazione sul database di dati sensibili non necessari, sfruttando per questa funzionalità lo IAM Azure e l'account aziendale (o anche IAM self hosted Keycloak)
Architettura del Sistema
Stack Tecnologico
- Backend: FastAPI (Python 3.8+)
- Database: PostgreSQL 13+ con supporto JSON/JSONB
- Autenticazione: JWT (JSON Web Tokens)
- ORM: SQLAlchemy
Database Design
Filosofia di Semplificazione
Il database è stato progettato seguendo una filosofia di massima semplificazione, riducendo la complessità relazionale tradizionale attraverso l'uso strategico di campi JSONB di PostgreSQL al posto di tabelle intermedie per le relazioni N a N. Contestalmente alla semplicità dello scheme e alle potenti capacità di manipolazione di dati strutturati JSON di postgresql, questa scelta progettuale offre diversi vantaggi:
- Riduzione delle JOIN: Eliminazione di tabelle di associazione complesse
- Flessibilità: Strutture dati dinamiche per allergeni, turni e selezioni delle pietanze
- Performance: Meno query multiple per operazioni comuni
- Manutenibilità: Schema più leggibile e modificabile
Struttura delle Tabelle
Tabella pietanze
Gestisce le singole pietanze disponibili con:
- Informazioni base (nome, descrizione)
- Gestione allergeni tramite array JSON
- Controllo disponibilità e limiti di prenotazione
Tabella pasti
Rappresenta i menu giornalieri con:
- Portate JSONB: Organizzazione flessibile delle pietanze per tipologia indicando la disponibilità massima di ciascuna
- Turni JSONB: Gestione dinamica degli orari e capacità (
{"12:45": 100, "13:30": 100}) - Vincolo di unicità per data e tipo pasto
Tabella prenotazioni
Collega utenti e pasti con:
- Riferimento user_id estratto da JWT
- Pietanze selezionate JSONB: Array delle scelte dell'utente
- Gestione stati del ciclo di vita della prenotazione
Flussi Operativi
Flusso di Creazione Menu Giornaliero
- Inserimento Pietanze: Caricamento delle pietanze disponibili per il giorno
- Composizione Pasto: Associazione pietanze alle portate tramite JSON
- Configurazione Turni: Definizione orari e capacità massima per turno
- Attivazione: Abilitazione delle prenotazioni per gli utenti
Flusso di Prenotazione Utente
- Autenticazione: Verifica JWT e estrazione user_id
- Visualizzazione Menu: Recupero pasti disponibili per data
- Selezione Pietanze: Scelta pietanze per ogni portata disponibile
- Validazione: Controllo disponibilità e limiti di prenotazione
- Conferma: Creazione record prenotazione con stato 'attiva'
Flusso di Servizio Mensa
- Consultazione Prenotazioni: Visualizzazione prenotazioni per turno
- Erogazione Pasto: Aggiornamento stato da 'attiva' a 'servita'
- Gestione Pagamento: Transizione finale a stato 'pagata'
- Monitoraggio: Tracking utilizzo e disponibilità residua
Flusso di Gestione Disponibilità
- Controllo Automatico: Verifica limiti pietanze e turni
- Aggiornamento Dinamico: Modifica disponibilità in tempo reale
- Notifiche: Gestione comunicazioni per esaurimento posti
- Chiusura Prenotazioni: Disabilitazione automatica al raggiungimento limiti
Scelte Architetturali: Logica di Business
Principio di Separazione delle Responsabilità
In linea con la filosofia di semplificazione adottata per il design del database, la logica di business complessa rimane interamente gestita a livello API (FastAPI) piuttosto che essere delegata al database tramite stored procedures o funzioni PostgreSQL.
Motivazioni della Scelta
Coerenza Architetturale: Il sistema è progettato attorno a FastAPI come orchestratore centrale. Mantenere la logica di business nell'API garantisce un'architettura coerente e predicibile.
Manutenibilità e Testabilità: Le funzioni Python sono intrinsecamente più facili da testare, debuggare e modificare rispetto alle stored procedures. Questo si allinea con l'approccio DevOps moderno e l'integrazione continua.
Flessibilità di Sviluppo: La gestione della disponibilità, dei limiti di prenotazione e delle validazioni può evolvere rapidamente senza modifiche al schema database.
Implementazione delle Verifiche di Disponibilità
Le operazioni critiche come la verifica di disponibilità posti in un turno o di una pietanza vengono gestite tramite:
- Query atomiche per il recupero dati
- Validazioni Python per la logica di business
- Transazioni SQLAlchemy per garantire consistenza
- Pattern async/await per performance ottimali