eVit@ – Evoluzione piattaforma

Il progetto eVit@, originariamente sviluppato in PHP, è stato oggetto di una completa revisione architetturale con l’obiettivo di separare le diverse componenti applicative e adottare una struttura più moderna, scalabile e facilmente manutenibile.

La costante evoluzione delle esigenze di business e la necessità di garantire prestazioni elevate, scalabilità e manutenibilità nel lungo periodo hanno portato alla riprogettazione complessiva della piattaforma eVit@.

Originariamente sviluppato con un’architettura monolitica in PHP, il sistema è stato completamente reingegnerizzato per passare a un modello basato su microservizi/API, in grado di separare nettamente la logica di backend dalle interfacce utente (web e mobile).

La scelta dello stack tecnologico risponde a precise esigenze tecniche e strategiche:

  • Node.js (Backend): Sostituisce il PHP garantendo un’architettura asincrona e ad alte prestazioni per le API RESTful. L’uso di TypeScript assicura un codice sicuro e tipizzato, condividendo l’ecosistema JavaScript con il frontend web.
  • Flutter (App Mobile): Permette di gestire sia iOS sia Android da un’unica codebase compilata in nativo. Questo garantisce prestazioni elevate, un’esperienza utente fluida e un netto risparmio di tempi e costi di manutenzione.
  • Next.js (Web Frontend): Unisce la reattività di React al Server-Side Rendering (SSR), garantendo caricamenti rapidi, una SEO ottimizzata e prestazioni superiori rispetto alla precedente versione in PHP.

Organizzazione del progetto

La nuova versione è organizzata in tre progetti principali:

  • /backend-node
    Backend sviluppato in Node.js, responsabile della logica applicativa e delle API di servizio. Il server è configurato per l’ascolto sulla porta 3000.
  • /app-flutter
    Applicazione mobile sviluppata in Flutter, pensata per offrire accesso alla piattaforma da dispositivi Android e iOS.
  • /website-next
    Sito web sviluppato con React e Next.js, configurato per l’ascolto sulla porta 3001.

Autenticazione API

Il backend Node.js rappresenta il punto centrale dell’architettura: tutte le logiche di business sono state concentrate nelle API, utilizzate sia dall’applicazione web realizzata con Next.js sia dall’applicazione mobile sviluppata con Flutter.

L’autenticazione degli utenti avviene tramite l’API:

auth/login

che restituisce due token JWT:

  • access token, utilizzato per autenticare le richieste alle API protette;
  • refresh token, utilizzato per ottenere un nuovo access token quando quello corrente è scaduto.

Le chiamate successive alle API che richiedono autenticazione includono il token di accesso nell’header della richiesta. Nel caso in cui il token non sia più valido, il sistema utilizza il refresh token disponibile per richiedere automaticamente un nuovo access token.

https://www.jwt.io/introduction

Documentazione e test delle API

Le API del backend sono documentate e disponibili per i test tramite Swagger.

L’interfaccia di documentazione è raggiungibile aggiungendo il percorso:

/docs

all’indirizzo del backend.

Dopo aver effettuato il login, il token JWT ottenuto può essere inserito nell’interfaccia Swagger per abilitare l’esecuzione delle chiamate che richiedono autenticazione.

https://github.com/Surnet/swagger-jsdoc

Ottimizzazione tramite Redis

L’introduzione di Redis consente di ridurre i tempi di risposta delle API che restituiscono dati soggetti a poche variazioni nel tempo.

Un esempio è rappresentato dalle API relative a informazioni geografiche come regioni e province, che vengono memorizzate temporaneamente in cache evitando interrogazioni ripetute al database.

https://redis.io/docs

Accesso al database con Prisma

L’accesso al database viene gestito tramite Prisma, un ORM moderno che permette di interagire con le tabelle utilizzando un modello tipizzato in TypeScript.

Questo approccio consente di ridurre gli errori in fase di sviluppo e di mantenere una maggiore coerenza tra struttura del database e codice applicativo.

https://www.prisma.io/docs

Gestione della localizzazione

La localizzazione delle risposte è gestita interamente dal backend tramite l’header:

Accept-Language

che indica la lingua richiesta dal client.

Utilizzando la libreria i18n, il backend si occupa di tradurre direttamente eventuali messaggi di conferma o di errore prima di inviare la risposta. In questo modo, il compito del frontend (web e mobile) viene notevolmente semplificato, in quanto dovrà unicamente mostrare a schermo i messaggi già localizzati ricevuti dalle API.

https://github.com/mashpie/i18n-node

Sicurezza nelle registrazioni e recupero password

Le procedure di registrazione utente e recupero della password utilizzano Cloudflare Turnstile, un sistema progettato per verificare che le richieste siano generate da utenti reali e non da processi automatizzati.

https://developers.cloudflare.com/turnstile/

Template per le email

Le email inviate durante le procedure di registrazione e recupero password vengono generate dinamicamente tramite la libreria Handlebars.

I messaggi utilizzano template localizzati in base alla lingua ricevuta nell’header delle API, garantendo comunicazioni coerenti con le preferenze linguistiche dell’utente.

https://handlebarsjs.com/

Questo video mostra una breve panoramica del nuovo progetto.

Cosa vedremo nei prossimi capitoli

Nel prossimi capitoli analizzeremo alcune fasi del progetto:

  • Api
    Architettura backend Node.js: middleware, sicurezza, logging, caching e validazione.