Requirements


Functional Requirements:

Il sistema Smart Parking permette agli utenti di registrarsi creando un account con email e password. Dopo il login, ogni utente può aggiungere una o più auto inserendo la targa. Gli utenti possono vedere i posti disponibili e prenotare un parcheggio scegliendo data e orario.

Il sistema gestisce il pagamento della prenotazione tramite carta di credito o altri metodi digitali. Il costo finale viene calcolato in base al tempo reale di utilizzo del parcheggio.

L’ingresso e l’uscita dal parcheggio sono automatici grazie a sensori che leggono la targa del veicolo. Quando un’auto entra, il sistema controlla la prenotazione e apre la sbarra. Quando esce, calcola il tempo di permanenza e aggiorna il pagamento.

Il sistema supporta anche uscite anticipate e gestisce i casi di no-show annullando automaticamente la prenotazione se l’utente non si presenta.

Il numero di posti disponibili viene aggiornato in tempo reale per evitare overbooking.


Non-Functional Requirements:

Il sistema deve essere veloce e garantire risposte rapide, soprattutto durante ingresso e uscita dei veicoli. Le operazioni di check-in e check-out devono avvenire in pochi secondi.

Deve essere altamente scalabile per supportare molti utenti e parcheggi contemporaneamente. Per questo si possono usare cache e sistemi di code.

Il sistema deve essere affidabile e sempre disponibile (24/7), con backup automatici per evitare perdita di dati.

La sicurezza è fondamentale: i dati degli utenti devono essere protetti, le password devono essere hashate e i pagamenti devono essere sicuri e conformi agli standard.

Il sistema deve evitare overbooking attraverso operazioni atomiche sul database e gestione corretta della concorrenza.

Il sistema deve essere scalabile per gestire picchi di traffico, ad esempio durante ore di punta. Per questo si possono utilizzare cache per ridurre il carico sul database, sistemi di code per gestire eventi di ingresso e uscita in modo asincrono e un’architettura con backend scalabile orizzontalmente tramite load balancer. Questo permette di supportare un grande numero di utenti senza degradare le prestazioni.


API Design

Il sistema espone API REST per la comunicazione tra frontend e backend:

  • POST /auth/register → registrazione utente
  • POST /auth/login → login
  • POST /vehicles → aggiunta auto con targa
  • GET /parking/availability → posti disponibili
  • POST /reservations → creazione prenotazione
  • POST /check-in → ingresso veicolo
  • POST /check-out → uscita veicolo
  • POST /payments → gestione pagamento
  • GET /reservations/{id} → dettagli prenotazione

Le API sono stateless per garantire scalabilità e facilità di gestione.



High-Level Design

Il sistema è composto da diversi componenti principali che lavorano insieme.

Il frontend è l’applicazione web/mobile utilizzata dagli utenti per registrarsi, prenotare parcheggi e gestire i pagamenti. Il backend gestisce tutta la logica del sistema, come prenotazioni, accessi e pagamenti.

Il database memorizza utenti, auto, prenotazioni e sessioni di parcheggio. I sensori nel parcheggio (RFID o riconoscimento targa) gestiscono l’ingresso e l’uscita delle auto.

Il sistema di pagamento gestisce le transazioni economiche, mentre il servizio di notifiche comunica con l’utente per conferme e aggiornamenti.

Il flusso generale è: utente → frontend → backend → database/sensori/pagamenti → risposta all’utente.

Il sistema è composto da frontend, backend, database, sensori di parcheggio e sistema di pagamento. Il frontend comunica con il backend tramite API REST, mentre il backend gestisce tutta la logica del sistema. I sensori nel parcheggio inviano eventi al backend per gestire ingressi e uscite in tempo reale. Il backend aggiorna il database e interagisce con il sistema di pagamento.


Detailed Component Design

I componenti principali sono la gestione delle prenotazioni, il sistema di ingresso/uscita e il sistema di pagamento.

La gestione delle prenotazioni controlla i posti disponibili e crea prenotazioni solo se c’è spazio. Aggiorna in tempo reale la disponibilità e utilizza transazioni per evitare overbooking.

Il sistema di ingresso/uscita utilizza sensori per leggere la targa del veicolo. Se la prenotazione è valida, apre la sbarra e registra l’orario di ingresso. Alla uscita calcola il tempo di permanenza e libera il posto.

Il sistema di pagamento calcola il costo in base al tempo reale di utilizzo del parcheggio e addebita o rimborsa automaticamente l’importo.

Questi componenti devono essere veloci, affidabili e scalabili per gestire molti utenti contemporaneamente.

Per evitare overbooking, il sistema utilizza operazioni atomiche sul database. Quando un utente prenota un posto, il sistema controlla la disponibilità e aggiorna il numero di posti in modo sicuro utilizzando transazioni o locking a livello di riga. In alternativa si possono usare meccanismi di optimistic locking o contatori atomici tramite cache come Redis per evitare condizioni di race tra più richieste simultanee.