GithubHelp home page GithubHelp logo

progetto-pa's Introduction

Progetto Programmazione Avanzata 2022 Ciavarella, Rendina

Obiettivo del progetto

Il sistema back-end consente di gestire un insieme di veicoli che sono tracciati mediante localizzatore GPS. In particolare, il sistema permette di effettuare chiamate per:

  • Creare delle geofence area
  • Creare un veicolo
  • Associare una o più geofence area ad uno o più veicoli
  • Disassociare una geofence area ad un veicolo
  • Elencare le associazioni tra veicoli e geofence area
  • Inviare dati istantanei del veicolo
  • Elencare per ogni veicolo le geofence area in cui si trova e il tempo di permanenza
  • Elencare le posizioni di un veicolo in un determinato intervallo temporale
  • Restituire il credito residuo di un utente
  • Ricaricare il credito di un utente

Le chiamate vengono gestite tramite richieste HTTP (GET o POST) e in alcuni casi viene richiesta l'autenticazione tramite JWT.

Use case diagram

Use case diagram

Rotte

/create-geofence

La richiesta può essere eseguita solo da admin ed è necessaria l'autenticazione tramite JWT, in cui viene specificata l'email dell'admin. Viene gestita tramite richiesta POST. La geofence area viene rappresentata come un poligono in un file GEOJSON e per definirla un vettore di coordinate dei punti del poligono viene passato nella richiesta.

{
"id": "geo4",
"coordinates": [
          [
            [
              15.72763681411743,
              41.69989708362879
            ],
            [
              15.73362350463867,
              41.701707447298666
            ],
            [
              15.730662345886229,
              41.70471926684249
            ],
            [
              15.725598335266113,
              41.704350807131654
            ],
            [
              15.724890232086182,
              41.70212398393942
            ],
            [
              15.72763681411743,
              41.69989708362879
            ]
          ]
        ],
"max_speed": 30
}

Sequence diagram-createGeofence

/create-vehicle

La richiesta può essere eseguita solo da admin ed è necessaria l'autenticazione tramite JWT, in cui viene specificata l'email dell'admin. Viene gestita tramite richiesta POST. Nel body della richiesta vengono inserite le informazioni del veicolo. Tra queste anche l'utente a cui è associato il veicolo.

{
"license_plate": "TR4",
"brand": "Toyota",
"model": "RAV4",
"owner_cf": "MHLCVR97"
}

Sequence diagram-createvehicle

/create-geofences_vehicles

La richiesta può essere eseguita solo da admin ed è necessaria l'autenticazione tramite JWT, in cui viene specificata l'email dell'admin. Viene gestita tramite richiesta POST. Nella richiesta possono essere inseriti più veicoli e geofence contemporaneamente.

{
    "geofences": "geo1,geo3",
    "vehicles": "FF,OA"
}

Sequence diagram-creategeofencevehicles

/delete-geofence_vehicle

La richiesta può essere eseguita solo da admin ed è necessaria l'autenticazione tramite JWT, in cui viene specificata l'email dell'admin. Viene gestita tramite richiesta POST. Per eliminare un'associazione si inserisce l'id della geofence area e la license_plate del veicolo.

{
    "geofence_id":"geo1",
    "license_plate":"FF"
}

Sequence diagram-deleteGeofenceVehicle-1 Sequence diagram-deleteGeofenceVehicle-2

/show-associations

La richiesta può essere eseguita sia da un admin che da un utente ed è necessaria l'autenticazione tramite JWT, in cui viene specificata l'email. Viene gestita tramite richiesta POST. In particolare, l'admin ha la possibilità di ottenre l'elenco completo di tutte le associazioni, mentre l'utente può vedere solo il proprio insieme di veicoli e geofence area associate.

Sequence diagram-shoAssociations Caso utente:

Sequence diagram-showAssociation2-user Caso admin:

Sequence diagram-showAssociation2-admin

/send-position

La richiesta può essere eseguita da un utente ed è necessaria l'autenticazione tramite JWT, in cui viene specificata l'email. Viene gestita tramite richiesta POST. Questa richiesta permette all'utente di inviare la posizione istantenea del proprio veicolo. Nel body vengono inseriti diversi dati, ossia la longitudine, la latitudine, l'altitudine e la velocità. Successivamente viene verificato se i dati di posizione inviati per quel veicolo rientrano all’interno di una geofence area. Nel caso in cui l’utente entra in una geofence area ad esso associata questo evento deve essere memorizzato. Stessa situazione per quanto riguarda l’uscita da una geofence area. Deve essere eventualmente verificato anche se la velocità all’interno della geo-fence area è superiore a quella consentita. Ad ogni utente è associato un credito. Per ogni invio di dati deve essere scalato un credito pari a 0.05 token.

{
    "license_plate":"FP",
    "longitude":15.633673667907717,
    "latitude":41.711703581962624,
    "altitude":12,
    "speed": 47
}

Sequence diagram-sendPosition1 Sequence diagram-sendPositions2

/show-vehicles

La richiesta può essere eseguita da un qualsiasi utente, pertanto non è richiesta l'autenticazione tramite JWT. Viene gestita tramite richiesta GET. Questa richiesta permette di ritornare per ogni veicolo se questo si trova all’interno o all’esterno di una geofence area. Per i veicoli che sono all’interno della geofence area ritornare anche il tempo di permanenza.

Sequence diagram-showVehicles

/show-position

La richiesta può essere eseguita da un qualsiasi utente, pertanto non è richiesta l'autenticazione tramite JWT. Viene gestita tramite richiesta GET. Questa richeista ritorna l’insieme delle posizioni di un veicolo in un dato intervallo temporale, l’utente può specificare la data di inizio ed opzionalmente la data di fine.

Sequence diagram-showPositions

/show-token

La richiesta può essere eseguita da un utente ed è necessaria l'autenticazione tramite JWT, in cui viene specificata l'email. Viene gestita tramite richiesta POST. Questa richiesta restituisce il credito residuo di un utente.

Sequence diagram-showToken(1)

/refill

La richiesta può essere eseguita solo da admin ed è necessaria l'autenticazione tramite JWT, in cui viene specificata l'email dell'admin. Viene gestita tramite richiesta POST. Questa richiesta permette di ricaricare il credito di un utente.

{
    "email":"[email protected]",
    "token":20
}

Sequence diagram-refill

Pattern utilizzati

Singleton

Il “Singleton” è un creational pattern che garantisce che ci sia una sola istanza di una classe e fornisce un punto di accesso globale a tale istanza. In questo progetto è stato necessario il suo utilizzo per poter creare una sola connessione al database.

Factory

Il “Factory method” è un creational pattern che descrive un approccio di programmazione con il quale creare oggetti senza bisogno di dover specificare la loro classe. Ciò permette di cambiare comodamente e in maniera flessibile l’oggetto creato. In questo progetto è stato utilizzato per gestire in maniera efficiente la creazione dei messaggi in caso di errore.

Chain of Responsability

Chain of Responsability è un Catena di responsabilità è behavioral design pattern che consente di trasmettere le richieste lungo una catena di gestori delle stesse. Alla ricezione di una richiesta, ciascun gestore decide di elaborare la richiesta o di passarla al successivo anello della catena. Il vantaggio è che, in caso di errore, il flusso di esecuzione si interrompe. Per il nostro progetto questo pattern, che è stato utilizzando insieme alle funzionalità del middleware, è stato utile per la validazione delle richieste e per la gestione degli errori.

Avvio del progetto

Per avviare la demo dell’applicazione è necessaria l’installazione di Docker. Dopo aver clonato il repository sulla propria macchina e dopo aver avviato Docker bisogna posizionarsi nella cartella che ospita il file docker-compose.yml. A questo punto digitare: docker-compose up

Testing

È possibile effettuare dei test predefiniti del progetto importando all’interno di Postman la collection situata all'interno di questa repository. I token JWT sono stati generati utilizzando jwt.io, tramite la chiave “qwertyuiopasdfghjklzxcvbnm123456”.

Software utilizzati

Librerie e Framework

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.