Ogni scelta tecnica si appoggia a un dato di fatto. I servizi pubblici stanno online per anni, i requisiti dei cittadini crescono nel tempo, e il prossimo team a leggere il codice potrebbe non essere il nostro. Scegliamo lo stack pensando a quel secondo momento, quando il contratto è finito e c'è qualcun altro ad aprire il progetto.
L'area cittadino e il pannello degli operatori stanno dentro lo stesso progetto Next.js. Il servizio si indicizza sui motori di ricerca, si apre veloce al primo accesso, e chi pubblica i contenuti lavora dallo stesso posto in cui si istruiscono le pratiche. Un solo repository, un solo rilascio, e la distinzione fra "la pagina che vede il cittadino" e "il sistema che istruisce la sua richiesta" smette di costare coordinamento fra dipartimenti.
I dati del cittadino restano separati a livello di database, e non solo dentro il codice dell'applicazione. È il punto su cui si gioca ogni verifica di un servizio pubblico, perché la domanda è sempre la stessa: come si garantisce davvero la separazione fra dipartimenti, enti, o gruppi sensibili. Con un Postgres gestito e una regola che filtra l'accesso riga per riga, la risposta sta in una schermata di codice, e finisce direttamente nella documentazione tecnica del servizio. Lo stesso database gestisce account, allegati, e aggiornamenti in tempo reale, in regione UE per contratto.
Mettiamo SPID, CIE, il nodo eIDAS, e gli schemi regionali dentro un solo livello di sessione. Chi accede trova lo stesso flusso qualunque provider scelga. Il registro delle azioni traccia il provider usato per ciascun evento, e quando la verifica di accessibilità chiede come una persona che usa un lettore di schermo arriva al modulo di richiesta, la risposta è lo stesso flusso che vale per tutti, senza scorciatoie pensate solo per chi vede.
I documenti che richiedono firma elettronica qualificata passano da un provider compatibile con eIDAS. Il PDF firmato resta accanto al record della pratica, con i tempi di conservazione previsti dalla normativa di settore. La ricevuta che riceve il cittadino arriva dallo stesso modello che usa l'operatore interno, e per questo le due versioni non si allontanano nel tempo.
Il costo dell'infrastruttura non sale a sorpresa al crescere del traffico. Per la protezione dagli abusi usiamo una cache distribuita gestita, vicina geograficamente alle persone che fanno richiesta, e senza bisogno di un server dedicato. Gli allegati restano in uno storage di oggetti in regione UE, senza le sorprese che la voce "trasferimento dati in uscita" porta con sé altrove. Tutto il codice viene verificato in compilazione da TypeScript, un beneficio poco scenografico ma decisivo: quando il contratto finisce e un altro team apre il progetto, gli errori vengono fuori prima del rilascio, e la persona che entra si orienta senza visita guidata.