You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.0 KiB
5.0 KiB
Sistema di Prenotazione Mensa - Documentazione Tecnica
Abstract
Il sistema di prenotazione mensa è una piattaforma web-based sviluppata con FastAPI e PostgreSQL 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 quattro entità principali interconnesse: prenotazioni, pasti, pietanze e ingredienti, utilizzando campi JSON per semplificare le relazioni e migliorare le performance.
Architettura del Sistema
Stack Tecnologico
- Backend: FastAPI (Python 3.8+)
- Database: PostgreSQL 13+ con supporto JSON/JSONB
- Autenticazione: JWT (JSON Web Tokens)
- ORM: SQLAlchemy
Componenti Principali
- API Layer: Gestione endpoint REST con FastAPI
- Authentication Layer: Middleware JWT per sicurezza
- Business Logic Layer: Logica di prenotazione e validazione
- Data Access Layer: SQLAlchemy ORM per accesso ai dati
- Database Layer: PostgreSQL con schema relazionale
Schema Database
Struttura delle Tabelle
1. Tabella pietanze
CREATE TABLE pietanze (
id SERIAL PRIMARY KEY,
nome VARCHAR(150) NOT NULL,
descrizione TEXT,
categoria VARCHAR(50), -- primo, secondo, contorno, dolce
prezzo DECIMAL(5,2),
disponibile BOOLEAN DEFAULT true,
ingredienti TEXT, -- Testo libero
allergeni JSONB, -- Array di allergeni: ["glutine", "lattosio", ...]
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. Tabella pasti
CREATE TABLE pasti (
id SERIAL PRIMARY KEY,
data_pasto DATE NOT NULL,
tipo_pasto VARCHAR(20) NOT NULL, -- colazione, pranzo, cena
disponibile BOOLEAN DEFAULT true,
turno VARCHAR(20) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(data_pasto, tipo_pasto)
);
3. Tabella prenotazioni
CREATE TABLE prenotazioni (
id SERIAL PRIMARY KEY,
user_id VARCHAR(100) NOT NULL, -- Estratto dal JWT
pasto_id INTEGER REFERENCES pasti(id) ON DELETE CASCADE,
pietanze_selezionate JSONB, -- Lista di pietanze
note TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_id, pasto_id)
);
Endpoint API - Prenotazione Pasti
1. Creazione di una prenotazione
POST /api/prenotazioni
- Descrizione: Crea una nuova prenotazione per un pasto specifico.
- Corpo della richiesta:
{ "pasto_id": 1, "pietanze_selezionate": [ 2,86,89 ], "note": "Senza glutine" } - Risposta:
- 201 Created:
{ "id": 42, "user_id": "utente123", "pasto_id": 1, "stato": "attiva", "pietanze_selezionate": [ { "id": 1, "quantita": 1 }, { "id": 3, "quantita": 2 } ], "note": "Senza glutine", "created_at": "2023-10-01T12:00:00Z", "updated_at": "2023-10-01T12:00:00Z" } - 400 Bad Request: Errore di validazione o dati mancanti.
- 201 Created:
2. Recupero delle prenotazioni di un utente
GET /api/prenotazioni
- Descrizione: Recupera tutte le prenotazioni dell'utente autenticato.
- Risposta:
- 200 OK:
[ { "id": 42, "pasto_id": 1, "stato": "attiva", "pietanze_selezionate": [ { "id": 1, "quantita": 1 }, { "id": 3, "quantita": 2 } ], "note": "Senza glutine", "created_at": "2023-10-01T12:00:00Z", "updated_at": "2023-10-01T12:00:00Z" } ]
- 200 OK:
3. Annullamento di una prenotazione
PUT /api/prenotazioni/{id}/annulla
- Descrizione: Annulla una prenotazione esistente.
- Risposta:
- 200 OK:
{ "id": 42, "stato": "cancellata", "updated_at": "2023-10-01T12:30:00Z" } - 404 Not Found: Prenotazione non trovata.
- 200 OK:
4. Recupero dei pasti disponibili
GET /api/pasti
- Descrizione: Recupera i pasti disponibili per la prenotazione.
- Parametri query:
data(opzionale): Filtra per data specifica (formato YYYY-MM-DD)tipo_pasto(opzionale): Filtra per tipo di pasto (colazione, pranzo, cena)
- Esempi:
GET /api/pasti- Tutti i pasti disponibiliGET /api/pasti?data=2023-10-02- Pasti per il 2 ottobre 2023GET /api/pasti?data=2023-10-02&tipo_pasto=pranzo- Solo pranzi del 2 ottobre
- Risposta:
- 200 OK:
[ { "id": 1, "data_pasto": "2023-10-02", "tipo_pasto": "pranzo", "turno": "12:00-14:00", "disponibile": true, "posti_totali": 100, "posti_prenotati": 20, "pietanze_disponibili": [ { "id": 1, "nome": "Lasagna", "prezzo": 8.50 }, { "id": 2, "nome": "Insalata", "prezzo": 5.00 } ] } ]
- 200 OK: