<commit_before>\section{Backend}
\subsection{Descrizione generale}
L'implementazione scelta per il backend dell'applicazione è un server con architettura \glossaryItem{REST}. Ciò implica che:
\begin{itemize}
\item l'applicazione renda disponibili le sue funzioni in veste di risorse web;
\item ogni risorsa resa disponibile è indirizzabile univocamente utilizzando un indirizzo URL;
\item l'interfaccia delle risorse deve essere uniforme e deve garantire un insieme ben definito di operazioni e una gestione priva di stato delle operazioni.
\end{itemize}

Tale architettura permette l'indipendenza completa tra backend e frontend, permettendo così espansioni su altre piattaforme senza dover modificare il backend dell'applicazione.

L'architettura del server segue il design pattern MVC (\textbf{M}odel \textbf{V}iew \textbf{C}ontroller) per quanto concerne i ruoli di Model e Controller. 
Il ruolo di Controller tuttavia, non essendo implementato nativamente dal \glossaryItem{framework} Express, verrà implementato da uno stack di \glossaryItem{middleware} come suggerito dalla documentazione del \glossaryItem{framework} stesso.
La parte View, invece, è rapprestata dal frontend, costituito da componenti definiti con React e che interagiscono secondo l'architettura Flux.

\subsection{Descrizione dei package}
Il seguente diagramma mostra l'architettura generale del backend.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/generale.png}
\caption{Diagramma dei \glossaryItem{package}}
\end{figure}

\subsubsection{Package MaaSApplication}
\paragraph*{Descrizione}
Package che racchiude tutta l'applicazione \glossaryItem{MaaS}.

\paragraph*{Package contenuti}
\begin{itemize}
\item Models
\item Routes
\item Config
\item Lib
\end{itemize}

\paragraph*{Classi contenute}
\begin{itemize}
\item MaaSServer
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/collegamenti.png}
\caption{Diagramma dei \glossaryItem{package} completo dei componenti per ciascun \glossaryItem{package}}
\end{figure}

\subsection{Package Models}
\paragraph*{Descrizione}
Package che racchiude le classi che rappresentano la \textit{business logic} dell'applicazione. Ciascuna di queste classi implementa l'interafaccia Model dichiarata all'interno del \glossaryItem{package}.
Ciascuna classe deve implementare un modello definito da MongooseJS e deve definire i metodi con cui interagire con i dati che la classe stessa rappresenta. \\
Queste classi rappresentano la parte \textbf{M} (Model) del design pattern MVC.

\paragraph*{Classi contenute}
\begin{itemize}
\item UserModel
\item DSLModel
\item CompanyModel
\item DatabaseModel
\end{itemize}

\paragraph*{Interfacce contenute}
\begin{itemize}
\item Model
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/models.png}
\caption{Diagramma delle classi del \glossaryItem{package} Models}
\end{figure}

\paragraph{Model}
\paragraph*{Descrizione}
Interfaccia comune a tutti i modelli usati da \glossaryItem{MaaS}.

\paragraph*{Utilizzo}
Viene utilizzata come base per UserModel, CompanyModel, DSLModel e DatabaseModel.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Mongoose
\item UserModel
\item CompanyModel
\item DSLModel
\item DatabaseModel
\end{itemize}

\subsubsection{UserModel}
\paragraph*{Descrizione}
Classe che racchiude la \textit{business logic} legata agli utenti. Implementa modello e schema definiti da MongooseJS.

\paragraph*{Utilizzo}
Il modello viene utilizzato sia per la rappresentazione di un utente nell'applicazione, sia per l'autenticazione nel sistema.

\paragraph*{Relazioni con altre classi}
\begin{itemize}
\item Mongoose
\item Mongoose-validator
\item Lib::AuthenticationChecker
\item Router::UserRouter
\end{itemize}

\subsubsection{CompanyModel}
\paragraph*{Descrizione}
Racchiude la business logic legata alle \glossaryItem{Company}. Implementa modello e schema definiti da MongooseJS.

\paragraph*{Utilizzo}
Il modello rappresenta una \glossaryItem{Company} nel sistema.

\paragraph*{Relazioni con altri \glossaryItem{moduli}}
\begin{itemize}
\item Mongoose
\item Mongoose-validator
\item Router::CompanyRouter
\end{itemize}

\paragraph{DatabaseModel}
\paragraph*{Descrizione}

Racchiude la business logic legata al collegamento con i database delle \glossaryItem{Company}. Implementa modello e schema definiti da MongooseJS.

\paragraph*{Utilizzo}
Il modello rappresenta la connessione ad un database aziendale di una \glossaryItem{Company}. Contiene i dati per effettuare l'accesso al database e il riferimento alle collections definite su tale database, permettendo così all'utente di poter definire per ciascuna \glossaryItem{Collection} la possibilità di interagirvi da parte di tutti i membri della propria \glossaryItem{Company} o solo degli Admin.

\paragraph*{Relazioni con altri \glossaryItem{moduli}}
\begin{itemize}
\item Mongoose
\item Mongoose-validator
\item Router::DatabaseRouter
\end{itemize}

\paragraph{DSLModel}
\paragraph*{Descrizione}

Racchiude la \textit{business logic} legata alle specifiche \glossaryItem{DSL}. Implementa modello e schema definiti da MongooseJS.

\paragraph*{Utilizzo}
Il modello viene utilizzato per la rappresentazione delle specifiche \glossaryItem{DSL}. Contiene i dati di tali specifiche e le funzioni per poter estrarre i dati richiesti da una specifica \glossaryItem{DSL}.

\paragraph*{Relazioni con altri \glossaryItem{moduli}}
\begin{itemize}
\item Mongoose
\item Mongoose-validator
\item Lib::DSLChecker
\item Router::DSLRouter
\end{itemize}


\subsubsection{Package Routes}
\paragraph*{Descrizione}
Il \glossaryItem{package} Routes contiene le classi che implementano il router definito da ExpressJS, definendo le varie \glossaryItem{API} esposte dal server.
I \glossaryItem{moduli} vengono suddivisi in base al modello che utilizzano. 
Ciascuna classe inoltre ha il compito di definire i \glossaryItem{middleware} da anteporre alla definizione delle \glossaryItem{API}.\\
Le classi ricoprono il ruolo di Controller del design pattern MVC.

\paragraph*{Moduli contenuti}
\begin{itemize}
\item UserRouter
\item CompanyRouter
\item DSLRouter
\item DatabaseRouter
\item RouterFacade
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/routes.png}
\caption{Diagramma delle classi del \glossaryItem{package} Routes}
\end{figure}

\paragraph{UserRouter}
\paragraph*{Descrizione}
Questa classe contiene la definizione degli endpoint riguardanti gli utenti. 

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Lib::AuthenticationChecker
\item Model::UserModel
\end{itemize}

\paragraph{CompanyRouter}
\paragraph*{Descrizione}
Questo \glossaryItem{modulo} contiene la definizione degli endpoint riguardanti le \glossaryItem{Company}.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Lib::AuthenticationChecker
\item Model::CompanyModel
\end{itemize}

\paragraph{DSLRouter}
\paragraph*{Descrizione}
Questo \glossaryItem{modulo} contiene la definizione delle \glossaryItem{API} riguardanti le specifiche \glossaryItem{DSL}.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Lib::AuthenticationChecker
\item Lib::LevelChecker
\item Model::DSLModel
\end{itemize}

\paragraph{DatabaseRouter}
\paragraph*{Descrizione}
Questo \glossaryItem{modulo} contiene la definizione delle \glossaryItem{API} riguardanti le connessioni ai database aziendali.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Lib::AuthenticationChecker
\item Lib::LevelChecker
\item Model::DatabaseModel
\end{itemize}

\paragraph{RouterFacade}
\paragraph*{Descrizione}
Oggetto che implementa il Facade \glossaryItem{Design Pattern}. Tale oggetto incorpora tutte le \glossaryItem{API} definite nelle classi Router.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item UserRouter
\item CompanyRouter
\item DSLRouter
\item DatabaseRouter
\end{itemize}

\subsubsection{Package Config}
\paragraph*{Descrizione}
Questo \glossaryItem{package} contiene le classi \glossaryItem{Configuration} che contengono tutte le informazioni per inizializzare correttamente l'applicazione. 
Sarà poi l'applicazione a dover recuperare la corretta configurazione in base alla variabilie d'ambiente NODE\_ENV.

\paragraph*{Moduli contenuti}
\begin{itemize}
\item \glossaryItem{Configuration}
\item DevConfiguration
\item TestConfiguration
\item ProdConfiguration
\end{itemize}

\paragraph*{Interfacce contenute}
\begin{itemize}
\item \glossaryItem{Configuration}
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/config.png}
\caption{Diagramma delle classi del \glossaryItem{package} Config}
\end{figure}

\paragraph{DevConfiguration}
\paragraph*{Descrizione}
Configurazione usata durante lo sviluppo.

\paragraph*{Utilizzo}
Viene utilizzata per configurare l'ambiente di lavoro durante lo sviluppo di \glossaryItem{MaaS}.

\paragraph{TestConfiguration}
\paragraph*{Descrizione}
Configurazione usata durante il test.

\paragraph*{Utilizzo}
Viene utilizzata per configurare l'ambiente di lavoro durante la \glossaryItem{fase} di test di \glossaryItem{MaaS}.

\paragraph{ProdConfiguration}
\paragraph*{Descrizione}
Configurazione usata per il rilascio.

\paragraph*{Utilizzo}
Viene utilizzata per configurare l'ambiente di lavoro per la consegna di \glossaryItem{MaaS}.

\paragraph{Configuration}
\paragraph*{Descrizione}
Interfaccia comune alle configurazioni usate da \glossaryItem{MaaS}.

\paragraph*{Utilizzo}
Viene utilizzata come base per DevConfiguration, TestConfiguration e ProdConfiguration.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item MaaSServer
\end{itemize}

\subsubsection{Package Lib}
\paragraph*{Descrizione}
Questo \glossaryItem{package} contiene tutti i \glossaryItem{moduli} di supporto al sistema e i \glossaryItem{middlewares} generici per ExpressJS.

\paragraph*{Moduli contenuti}
\begin{itemize}
\item LevelChecker
\item AuthenticationChecker
\item DSLChecker
\end{itemize}


\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/lib.png}
\caption{Diagramma delle classi del \glossaryItem{package} Lib}
\end{figure}

\paragraph{LevelChecker}
\paragraph*{Descrizione}
Middleware che si occupa di verificare se l'utente che effettua una richiesta al server ha i livelli minimi di accesso per poterla eseguire.

\paragraph*{Utilizzo}
Viene utilizzato nelle \textit{routes} in cui deve essere garantito un livello utente minimo di accesso per portare a termine la richiesta.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Router
\end{itemize}

\paragraph{AuthenticationChecker}
\paragraph*{Descrizione}
Modulo che definisce due \glossaryItem{middleware}: uno per effettuare il login, l'altro per l'autenticazione di una richiesta.

\paragraph*{Utilizzo}
Questo \glossaryItem{modulo} viene utilizzato per definire l'\textit{endpoint} per effettuare il login all'applicazione e offre il \glossaryItem{middleware} che permette di autenticare le richieste. Tale \glossaryItem{middleware} si occuperà di estrarre il \textit{token} dalle richieste, verificarne la correttezza e aggiungere l'utente verificato nella richiesta per i prossimi \glossaryItem{middleware}.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Router
\end{itemize}

\paragraph{DSLChecker}
\paragraph*{Descrizione}
Modulo che \glossaryItem{verifica} la correttezza sintattica e di contenuto di una specifica \glossaryItem{DSL}.

\paragraph*{Utilizzo}
Questo \glossaryItem{modulo} viene richiamato in DSLModel per verificare che la specifica \glossaryItem{DSL} che viene salvata o modificata sia valida per l'esecuzione.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item DSLModel
\end{itemize}

\subsubsection{MaaSServer}
\paragraph*{Descrizione}
Classe principale dell'applicazione.

\paragraph*{Utilizzo}
Viene utilizzata questa classe per inizializzare l'applicazione. Questa classe ha la responsabilità di caricare gli altri \glossaryItem{moduli} del backend correttamente e di inizializzare il webserver che li utilizza.
\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Config
\item Router::RouterFacade
\item BodyParser
\item ExpressJS
\end{itemize}


\subsubsection{Moduli integrati}
\paragraph{BodyParser}
\paragraph*{Descrizione}
Modulo di terze parti per la corretta lettura delle informazioni contenute nel \textit{body} delle richieste \glossaryItem{HTTP}.

\paragraph*{Utilizzo}
Il \glossaryItem{modulo} in questione viene utilizzato come \glossaryItem{middleware} per ExpressJS e si occupa della corretta lettura delle informazioni contenute nel \textit{body} di una richiesta \glossaryItem{HTTP}. Nel nostro caso verrà impiegato per la lettura dei dati del body in formato \glossaryItem{JSON}.

\paragraph{NodeMailer}
\paragraph*{Descrizione}
Permette di inviare delle email.

\paragraph*{Utilizzo}
È usato per inviare email agli utenti di \glossaryItem{MaaS}.

\subsubsection{Framework integrati}
\paragraph{SweetJS}
\paragraph*{Descrizione}
Tool che permettere la definizione di una serie di macro allo scopo di modellare una grammatica regolare traducibile in \glossaryItem{procedure} \glossaryItem{JavaScript}.

\paragraph*{Utilizzo}
Come usato in \glossaryItem{MaaP}, definisce la sintassi del \glossaryItem{DSL}. In \glossaryItem{MaaS} il set di macro verrà esteso per soddisfare i nuovi requisiti.

\paragraph{ExpressJS}
\paragraph*{Descrizione}
Framework per la creazione e la gestione di webserver per l'esposizione di \glossaryItem{API} RESTful.

\paragraph*{Utilizzo}
Utilizzato come base per la struttura del server.

\paragraph{Mongoose}
\paragraph*{Descrizione}
Framework per interfacciarsi con \glossaryItem{MongoDB}.

\paragraph*{Utilizzo}
Utilizzato per la gestione dei dati su database \glossaryItem{MongoDB}.

\subsection{API REST}
\subsubsection{Comunicazione tra client e server}
Per la creazione del backend di \glossaryItem{MaaS} si è deciso di utilizzare \glossaryItem{Node.js} e, in particolare, il \glossaryItem{framework} ExpressJS, che permette la creazione semplificata di server \glossaryItem{REST}. Il lato backend sarà quindi costituito da un insieme di \glossaryItem{API} protette da strati diversi di sicurezza. \\
Ciascuna \glossaryItem{API} del webserver fornirà una risposta in formato \glossaryItem{JSON} per permettere la fruizione delle informazioni. Fornirà nello stesso formato anche gli eventuali messaggi di errore generati nel corpo dei metodi del server. Tali messaggi di errore saranno così composti: 
\begin{verbatim}
{
    "code":     [Codice definito nel protocollo \glossaryItem{HTTP}, che identifica univocamente
                 la tipologia del problema]
    "message":  [Messaggio che definisce in dettaglio la tipologia dell'errore]
    ["data":   [Opzionale, trasporta i dati in cui si è verificato l'errore]]
}
\end{verbatim}
I codici di errore saranno del tipo 4xx (client error, la richiesta è sintatticamente scorretta o non può essere soddisfatta) o 5xx (server error, il server ha fallito nel soddisfare una richiesta apparentemente valida).
\subsubsection{Sicurezza}
Gli accessi alle \glossaryItem{API} avranno 2 livelli di sicurezza. \\
Il primo livello è rappresentato dall'autenticazione: un utente non autenticato riceverà un errore se richiede una \glossaryItem{API} protetta. Verrà implementato con l'utilizzo di PassportJS, un \glossaryItem{middleware} per ExpressJS che permette l'autenticazione di utenti nel sistema. In particolare verrà utilizzata la strategia passport-local per l'accesso al server, cioè le credenziali dell'utente risiederanno nel database locale. \\
Il secondo livello è definito in base al ruolo di appartenenza di un utente. Si occuperà di controllare i permessi assegnati ad un utente autenticato e di verificare la possibilità che possa o meno interagire con la risorsa richiesta. \\
I ruoli utente ammessi nell'applicazione sono: 
\begin{itemize}
\item \textbf{Guest};
\item \textbf{Member};
\item \textbf{Admin};
\item \textbf{Owner};
\item \textbf{Super Admin}.
\end{itemize}
Per il ruolo di Super Admin è abilititato un set di \glossaryItem{API} per la gestione dell'intera applicazione. Tali \glossaryItem{API} non sono accessibili agli utenti con altri ruoli.
\newpage
\subsubsection{Scenari di accesso negato}
Di seguito verranno rappresentati \glossaryItem{scenari} corrispondenti ad una negazione di accesso per ruolo non conforme alle attese o per errore nel login.
\paragraph{Errore di autenticazione}  \mbox{} \\
\textbf{Descrizione:} L'utente non autenticato cerca di accedere a \glossaryItem{MaaS}, ma la \glossaryItem{procedura} di login rileva un errore nelle credenziali inserite.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/autenticazioneFallita.png}
\caption{Autenticazione fallita}
\end{figure}
\paragraph{Livello minimo: MEMBER} \mbox{} \\
\textbf{Descrizione:} Tentativo di accesso ad una risorsa visibile solo a utenti con ruolo almeno MEMBER da parte di un utente GUEST.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/requireMemberFallita.png}
\caption{Livello minimo MEMBER}
\end{figure}
\paragraph{Livello minimo: ADMIN} \mbox{} \\
\textbf{Descrizione:} Tentativo di accesso ad una risorsa visibile solo a utenti con ruolo almeno ADMIN da parte di un utente GUEST o MEMBER.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/requireAdminFallita.png}
\caption{Livello minimo ADMIN}
\end{figure}
\paragraph{Livello minimo: OWNER}  \mbox{} \\
\textbf{Descrizione:} Tentativo di accesso ad una risorsa visibile solo a utenti con ruolo almeno OWNER da parte di un utente GUEST, MEMBER o ADMIN.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/requireOwnerFallita.png}
\caption{Livello minimo OWNER}
\end{figure}
\paragraph{Livello minimo: SUPERADMIN}  \mbox{} \\
\textbf{Descrizione:} Tentativo di accesso ad una risorsa accedibile solo da un SUPERADMIN da parte di un generico utente di \glossaryItem{MaaS}.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/requireSuperAdminFallita.png}
\caption{Livello minimo SUPERADMIN}
\end{figure}
\newpage
\subsection{Descrizione API}
Di seguito sono descritte le \glossaryItem{API} \glossaryItem{REST} esposte dal server di \glossaryItem{MaaS}. Si suppone che l'utente che richiede l'accesso alla risorsa descritta abbia i permessi necessari (ovvero che sia autenticato e che il suo ruolo sia conforme a quanto indicato). Qualora questo non fosse vero si ricadrebbe in uno degli \glossaryItem{scenari} esposti precedentemente.
\subsubsection{Senza autenticazione}
\paragraph{Login}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/login \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente email e password dell'utente. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)login.png}
\caption{Scenario del login}
\end{figure}

\newpage
\paragraph{Registrazione}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/register/:unique\_code \\
\textbf{Descrizione:} Metodo per la creazione di un utente invitato da una \glossaryItem{Company}. Necessita di una richiesta con \textit{body} contenete le informazioni per la creazione completa di un utente \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)register.png}
\caption{Scenario della registrazione}
\end{figure}

\newpage
\paragraph{Creazione Company}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/companies \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente le informazioni relative alla \glossaryItem{company} e alla creazione del profilo del suo \glossaryItem{Owner}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)company.png}
\caption{Scenario della creazione \glossaryItem{company}}
\end{figure}

\newpage
\subsubsection{User}

\paragraph{Inserimento utente}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/companies/:company\_id/users \\
\textbf{Livello di accesso minimo:} OWNER \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente l'email e il livello di accesso dell'utente.\\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)user.png}
\caption{Scenario dell'inserimento utente in una \glossaryItem{Company}}
\end{figure}

\newpage
\paragraph{Aggiornamento delle credenziali utente}\mbox{}\\
\textbf{Tipologia:} PUT \\
\textbf{API:} /api/companies/:company\_id/users/:user\_id/credentials \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Metodo per la modifica delle credenziali di accesso di un utente. Un utente ha il permesso di cambiare solo le proprie credenziali. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(PUT)credenzialiUtente.png}
\caption{Scenario dell'aggiornamento delle credenziali di un utente}
\end{figure}

\newpage
\paragraph{Cancellazione utente}\mbox{}\\
\textbf{Tipologia:} DELETE \\
\textbf{API:} /api/companies/:company\_id/users/:user\_id \\
\textbf{Livello di accesso minimo:} OWNER \\
\textbf{Descrizione:} Ritorna un messaggio di conferma dell'avvenuta cancellazione. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(DELETE)user.png}
\caption{Scenario della cancellazione utente da una \glossaryItem{company}}
\end{figure}

\newpage
\subsubsection{Company}
\paragraph{Dati di una Company}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/ \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Ritorna le informazioni generali di una \glossaryItem{Company} \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)company.png}
\caption{Scenario di ottenimento dei dati di una \glossaryItem{company}}
\end{figure}

\newpage
\paragraph{Aggiornamento dei dati di una Company}\mbox{}\\
\textbf{Tipologia:} PUT \\
\textbf{API:} /api/companies/:company\_id/ \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente le modifiche da apportare ai dati della \glossaryItem{Company}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(PUT)company.png}
\caption{Scenario dell'aggiornamento dei dati di una \glossaryItem{Company}}
\end{figure}

\newpage
\paragraph{Cancellazione di una Company}\mbox{}\\
\textbf{Tipologia:} DELETE \\
\textbf{API:} /api/companies/:company\_id/ \\
\textbf{Livello di accesso minimo:} OWNER \\
\textbf{Descrizione:} Ritorna un messaggio di avvenuta cancellazione. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(DELETE)company.png}
\caption{Scenario della cancellazione di una \glossaryItem{Company}}
\end{figure}

\newpage
\subsubsection{DSL}
\paragraph{Elenco delle specifiche DSL}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/DSLs \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Ritorna un array contenente le specifiche \glossaryItem{DSL} alle quali l'utente ha accesso in formato \glossaryItem{JSON}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)dsl.png}
\caption{Scenario dell'elenco delle specifiche \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Lettura del codice di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/DSLs/:dsl\_id \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Ritorna il codice della specifica \glossaryItem{DSL} richiesta in formato \glossaryItem{JSON}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)dslByID.png}
\caption{Scenario della lettura del codice di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Aggiunta di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/companies/:company\_id/DSLs \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente i dati necessari alla creazione della specifica \glossaryItem{DSL}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)dsl.png}
\caption{Scenario della creazione di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Aggiornamento del codice di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} PUT \\
\textbf{API:} /api/companies/:company\_id/DSLs/:dsl\_id \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Necessita di una richiesta con body contenente i dati necessari alla modifica della specifica \glossaryItem{DSL} identificata da dsl\_id. \\
\textbf{Scenario:}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(PUT)dsl.png}
\caption{Scenario dell'aggiornamento del codice di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Cancellazione di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} DELETE \\
\textbf{API:} /api/companies/:company\_id/DSLs/:dsl\_id \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Ritorna un messaggio in formato \glossaryItem{JSON} di avvenuta cancellazione. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(DELETE)dsl.png}
\caption{Scenario della cancellazione di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Ottenimento della Dashboard di un utente}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/users/:user\_id/dashboard \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Ritorna la \glossaryItem{Dashboard} di un utente definita da una \glossaryItem{DSL}. \\
\textbf{Scenario:}  
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)dashboard.png}
\caption{Scenario dell'ottenimento della \glossaryItem{Dashboard} di un utente}
\end{figure}

\newpage
\paragraph{Esecuzione di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/DSLs/:dsl\_id/execute \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Ritorna un \glossaryItem{JSON} contenente i dati richiesti dalla specifica \glossaryItem{DSL} e la struttura su cui inserire i dati. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)dslByIDex.png}
\caption{Scenario dell'esecuzione di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\subsubsection{Database}
\paragraph{Elenco dei database della Company}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/databases \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Ritorna un array contenente i nomi e gli id di ciascun database. \\
\textbf{Scenario:}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)database.png}
\caption{Scenario dell'elenco dei database propri della \glossaryItem{Company}}
\end{figure}

\newpage
\paragraph{Visualizzazione dati di un database}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/databases/:database\_id \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Ritorna tutte le informazioni relative al database richiesto. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)databaseById.png}
\caption{Scenario della visualizzazione dei dati di un database}
\end{figure}

\newpage
\paragraph{Aggiunta di un database}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/companies/:company\_id/databases \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenete i dati relativi alla connessione del nuovo database. \\
\textbf{Scenario:}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)database.png}
\caption{Scenario della creazione di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Aggiornamento di un database}\mbox{}\\
\textbf{Tipologia:} PUT \\
\textbf{API:} /api/companies/:company\_id/databases/:database\_id \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Metodo per aggiornare le informazioni relative alla connessione al database o per aggiornare l'elenco delle collezioni. \\
\textbf{Scenario:}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(PUT)database.png}
\caption{Scenario dell'aggiornamento di un database}
\end{figure}

\newpage
\paragraph{Cancellazione di un database}\mbox{}\\
\textbf{Tipologia:} DELETE \\
\textbf{API:} /api/companies/:company\_id/databases/:database\_id \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Elimina il database selezionato e tutte le specifiche \glossaryItem{DSL} che lo utilizzano. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(DELETE)database.png}
\caption{Scenario della cancellazione di un database}
\end{figure}

\newpage
\paragraph{Visualizzazione Collections di un database} \mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/databases/:database\_id/collections \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Ritorna un array di \glossaryItem{Collection} relative ad un database a cui l'utente ha accesso. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)collection.png}
\caption{Scenario della visualizzazione Collections di un database}
\end{figure}

\newpage
\subsubsection{Super admin}
\paragraph{Ottenimento informazioni delle Company}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/admin/companies \\
\textbf{Descrizione:} Restituisce un array di \glossaryItem{JSON} contenenti le informazioni relative alle \glossaryItem{Company} presenti nell'applicazione. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)companySA.png}
\caption{Scenario dell'ottenimento informazioni delle \glossaryItem{Company}}
\end{figure}

\newpage
\paragraph{Aggiunta di un SuperAdmin}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/admin/superadmins \\
\textbf{Descrizione:} Necessita di una richiesta con body contenente le informazioni relative al superadmin da creare. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)superadmin.png}
\caption{Scenario dell'aggiunta di un super admin}
\end{figure}

\newpage
\paragraph{Aggiunta di un utente}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/admin/companies/:company\_id/users \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente le informazioni relative all'utente da creare per la \glossaryItem{Company} individuata da \glossaryItem{company}\_id. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)userSA.png}
\caption{Scenario dell'aggiunta di un utente}
\end{figure}
<commit_msg>Change classe "Interfaccia" con "Astratta" del model See issue #423<commit_after>\section{Backend}
\subsection{Descrizione generale}
L'implementazione scelta per il backend dell'applicazione è un server con architettura \glossaryItem{REST}. Ciò implica che:
\begin{itemize}
\item l'applicazione renda disponibili le sue funzioni in veste di risorse web;
\item ogni risorsa resa disponibile è indirizzabile univocamente utilizzando un indirizzo URL;
\item l'interfaccia delle risorse deve essere uniforme e deve garantire un insieme ben definito di operazioni e una gestione priva di stato delle operazioni.
\end{itemize}

Tale architettura permette l'indipendenza completa tra backend e frontend, permettendo così espansioni su altre piattaforme senza dover modificare il backend dell'applicazione.

L'architettura del server segue il design pattern MVC (\textbf{M}odel \textbf{V}iew \textbf{C}ontroller) per quanto concerne i ruoli di Model e Controller. 
Il ruolo di Controller tuttavia, non essendo implementato nativamente dal \glossaryItem{framework} Express, verrà implementato da uno stack di \glossaryItem{middleware} come suggerito dalla documentazione del \glossaryItem{framework} stesso.
La parte View, invece, è rapprestata dal frontend, costituito da componenti definiti con React e che interagiscono secondo l'architettura Flux.

\subsection{Descrizione dei package}
Il seguente diagramma mostra l'architettura generale del backend.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/generale.png}
\caption{Diagramma dei \glossaryItem{package}}
\end{figure}

\subsubsection{Package MaaSApplication}
\paragraph*{Descrizione}
Package che racchiude tutta l'applicazione \glossaryItem{MaaS}.

\paragraph*{Package contenuti}
\begin{itemize}
\item Models
\item Routes
\item Config
\item Lib
\end{itemize}

\paragraph*{Classi contenute}
\begin{itemize}
\item MaaSServer
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/collegamenti.png}
\caption{Diagramma dei \glossaryItem{package} completo dei componenti per ciascun \glossaryItem{package}}
\end{figure}

\subsection{Package Models}
\paragraph*{Descrizione}
Package che racchiude le classi che rappresentano la \textit{business logic} dell'applicazione. Ciascuna di queste classi implementa la classe astratta Model dichiarata all'interno del \glossaryItem{package}.
Ciascuna classe deve implementare un modello definito da MongooseJS e deve definire i metodi con cui interagire con i dati che la classe stessa rappresenta. \\
Queste classi rappresentano la parte \textbf{M} (Model) del design pattern MVC.

\paragraph*{Classi contenute}
\begin{itemize}
\item UserModel
\item DSLModel
\item CompanyModel
\item DatabaseModel
\end{itemize}

\paragraph*{Interfacce contenute}
\begin{itemize}
\item Model
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/models.png}
\caption{Diagramma delle classi del \glossaryItem{package} Models}
\end{figure}

\paragraph{Model}
\paragraph*{Descrizione}
Interfaccia comune a tutti i modelli usati da \glossaryItem{MaaS}.

\paragraph*{Utilizzo}
Viene utilizzata come base per UserModel, CompanyModel, DSLModel e DatabaseModel.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Mongoose
\item UserModel
\item CompanyModel
\item DSLModel
\item DatabaseModel
\end{itemize}

\subsubsection{UserModel}
\paragraph*{Descrizione}
Classe che racchiude la \textit{business logic} legata agli utenti. Implementa modello e schema definiti da MongooseJS.

\paragraph*{Utilizzo}
Il modello viene utilizzato sia per la rappresentazione di un utente nell'applicazione, sia per l'autenticazione nel sistema.

\paragraph*{Relazioni con altre classi}
\begin{itemize}
\item Mongoose
\item Mongoose-validator
\item Lib::AuthenticationChecker
\item Router::UserRouter
\end{itemize}

\subsubsection{CompanyModel}
\paragraph*{Descrizione}
Racchiude la business logic legata alle \glossaryItem{Company}. Implementa modello e schema definiti da MongooseJS.

\paragraph*{Utilizzo}
Il modello rappresenta una \glossaryItem{Company} nel sistema.

\paragraph*{Relazioni con altri \glossaryItem{moduli}}
\begin{itemize}
\item Mongoose
\item Mongoose-validator
\item Router::CompanyRouter
\end{itemize}

\paragraph{DatabaseModel}
\paragraph*{Descrizione}

Racchiude la business logic legata al collegamento con i database delle \glossaryItem{Company}. Implementa modello e schema definiti da MongooseJS.

\paragraph*{Utilizzo}
Il modello rappresenta la connessione ad un database aziendale di una \glossaryItem{Company}. Contiene i dati per effettuare l'accesso al database e il riferimento alle collections definite su tale database, permettendo così all'utente di poter definire per ciascuna \glossaryItem{Collection} la possibilità di interagirvi da parte di tutti i membri della propria \glossaryItem{Company} o solo degli Admin.

\paragraph*{Relazioni con altri \glossaryItem{moduli}}
\begin{itemize}
\item Mongoose
\item Mongoose-validator
\item Router::DatabaseRouter
\end{itemize}

\paragraph{DSLModel}
\paragraph*{Descrizione}

Racchiude la \textit{business logic} legata alle specifiche \glossaryItem{DSL}. Implementa modello e schema definiti da MongooseJS.

\paragraph*{Utilizzo}
Il modello viene utilizzato per la rappresentazione delle specifiche \glossaryItem{DSL}. Contiene i dati di tali specifiche e le funzioni per poter estrarre i dati richiesti da una specifica \glossaryItem{DSL}.

\paragraph*{Relazioni con altri \glossaryItem{moduli}}
\begin{itemize}
\item Mongoose
\item Mongoose-validator
\item Lib::DSLChecker
\item Router::DSLRouter
\end{itemize}


\subsubsection{Package Routes}
\paragraph*{Descrizione}
Il \glossaryItem{package} Routes contiene le classi che implementano il router definito da ExpressJS, definendo le varie \glossaryItem{API} esposte dal server.
I \glossaryItem{moduli} vengono suddivisi in base al modello che utilizzano. 
Ciascuna classe inoltre ha il compito di definire i \glossaryItem{middleware} da anteporre alla definizione delle \glossaryItem{API}.\\
Le classi ricoprono il ruolo di Controller del design pattern MVC.

\paragraph*{Moduli contenuti}
\begin{itemize}
\item UserRouter
\item CompanyRouter
\item DSLRouter
\item DatabaseRouter
\item RouterFacade
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/routes.png}
\caption{Diagramma delle classi del \glossaryItem{package} Routes}
\end{figure}

\paragraph{UserRouter}
\paragraph*{Descrizione}
Questa classe contiene la definizione degli endpoint riguardanti gli utenti. 

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Lib::AuthenticationChecker
\item Model::UserModel
\end{itemize}

\paragraph{CompanyRouter}
\paragraph*{Descrizione}
Questo \glossaryItem{modulo} contiene la definizione degli endpoint riguardanti le \glossaryItem{Company}.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Lib::AuthenticationChecker
\item Model::CompanyModel
\end{itemize}

\paragraph{DSLRouter}
\paragraph*{Descrizione}
Questo \glossaryItem{modulo} contiene la definizione delle \glossaryItem{API} riguardanti le specifiche \glossaryItem{DSL}.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Lib::AuthenticationChecker
\item Lib::LevelChecker
\item Model::DSLModel
\end{itemize}

\paragraph{DatabaseRouter}
\paragraph*{Descrizione}
Questo \glossaryItem{modulo} contiene la definizione delle \glossaryItem{API} riguardanti le connessioni ai database aziendali.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Lib::AuthenticationChecker
\item Lib::LevelChecker
\item Model::DatabaseModel
\end{itemize}

\paragraph{RouterFacade}
\paragraph*{Descrizione}
Oggetto che implementa il Facade \glossaryItem{Design Pattern}. Tale oggetto incorpora tutte le \glossaryItem{API} definite nelle classi Router.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item UserRouter
\item CompanyRouter
\item DSLRouter
\item DatabaseRouter
\end{itemize}

\subsubsection{Package Config}
\paragraph*{Descrizione}
Questo \glossaryItem{package} contiene le classi \glossaryItem{Configuration} che contengono tutte le informazioni per inizializzare correttamente l'applicazione. 
Sarà poi l'applicazione a dover recuperare la corretta configurazione in base alla variabilie d'ambiente NODE\_ENV.

\paragraph*{Moduli contenuti}
\begin{itemize}
\item \glossaryItem{Configuration}
\item DevConfiguration
\item TestConfiguration
\item ProdConfiguration
\end{itemize}

\paragraph*{Interfacce contenute}
\begin{itemize}
\item \glossaryItem{Configuration}
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/config.png}
\caption{Diagramma delle classi del \glossaryItem{package} Config}
\end{figure}

\paragraph{DevConfiguration}
\paragraph*{Descrizione}
Configurazione usata durante lo sviluppo.

\paragraph*{Utilizzo}
Viene utilizzata per configurare l'ambiente di lavoro durante lo sviluppo di \glossaryItem{MaaS}.

\paragraph{TestConfiguration}
\paragraph*{Descrizione}
Configurazione usata durante il test.

\paragraph*{Utilizzo}
Viene utilizzata per configurare l'ambiente di lavoro durante la \glossaryItem{fase} di test di \glossaryItem{MaaS}.

\paragraph{ProdConfiguration}
\paragraph*{Descrizione}
Configurazione usata per il rilascio.

\paragraph*{Utilizzo}
Viene utilizzata per configurare l'ambiente di lavoro per la consegna di \glossaryItem{MaaS}.

\paragraph{Configuration}
\paragraph*{Descrizione}
Interfaccia comune alle configurazioni usate da \glossaryItem{MaaS}.

\paragraph*{Utilizzo}
Viene utilizzata come base per DevConfiguration, TestConfiguration e ProdConfiguration.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item MaaSServer
\end{itemize}

\subsubsection{Package Lib}
\paragraph*{Descrizione}
Questo \glossaryItem{package} contiene tutti i \glossaryItem{moduli} di supporto al sistema e i \glossaryItem{middlewares} generici per ExpressJS.

\paragraph*{Moduli contenuti}
\begin{itemize}
\item LevelChecker
\item AuthenticationChecker
\item DSLChecker
\end{itemize}


\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/lib.png}
\caption{Diagramma delle classi del \glossaryItem{package} Lib}
\end{figure}

\paragraph{LevelChecker}
\paragraph*{Descrizione}
Middleware che si occupa di verificare se l'utente che effettua una richiesta al server ha i livelli minimi di accesso per poterla eseguire.

\paragraph*{Utilizzo}
Viene utilizzato nelle \textit{routes} in cui deve essere garantito un livello utente minimo di accesso per portare a termine la richiesta.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Router
\end{itemize}

\paragraph{AuthenticationChecker}
\paragraph*{Descrizione}
Modulo che definisce due \glossaryItem{middleware}: uno per effettuare il login, l'altro per l'autenticazione di una richiesta.

\paragraph*{Utilizzo}
Questo \glossaryItem{modulo} viene utilizzato per definire l'\textit{endpoint} per effettuare il login all'applicazione e offre il \glossaryItem{middleware} che permette di autenticare le richieste. Tale \glossaryItem{middleware} si occuperà di estrarre il \textit{token} dalle richieste, verificarne la correttezza e aggiungere l'utente verificato nella richiesta per i prossimi \glossaryItem{middleware}.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Router
\end{itemize}

\paragraph{DSLChecker}
\paragraph*{Descrizione}
Modulo che \glossaryItem{verifica} la correttezza sintattica e di contenuto di una specifica \glossaryItem{DSL}.

\paragraph*{Utilizzo}
Questo \glossaryItem{modulo} viene richiamato in DSLModel per verificare che la specifica \glossaryItem{DSL} che viene salvata o modificata sia valida per l'esecuzione.

\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item DSLModel
\end{itemize}

\subsubsection{MaaSServer}
\paragraph*{Descrizione}
Classe principale dell'applicazione.

\paragraph*{Utilizzo}
Viene utilizzata questa classe per inizializzare l'applicazione. Questa classe ha la responsabilità di caricare gli altri \glossaryItem{moduli} del backend correttamente e di inizializzare il webserver che li utilizza.
\paragraph*{Relazione con altri \glossaryItem{moduli}}
\begin{itemize}
\item Config
\item Router::RouterFacade
\item BodyParser
\item ExpressJS
\end{itemize}


\subsubsection{Moduli integrati}
\paragraph{BodyParser}
\paragraph*{Descrizione}
Modulo di terze parti per la corretta lettura delle informazioni contenute nel \textit{body} delle richieste \glossaryItem{HTTP}.

\paragraph*{Utilizzo}
Il \glossaryItem{modulo} in questione viene utilizzato come \glossaryItem{middleware} per ExpressJS e si occupa della corretta lettura delle informazioni contenute nel \textit{body} di una richiesta \glossaryItem{HTTP}. Nel nostro caso verrà impiegato per la lettura dei dati del body in formato \glossaryItem{JSON}.

\paragraph{NodeMailer}
\paragraph*{Descrizione}
Permette di inviare delle email.

\paragraph*{Utilizzo}
È usato per inviare email agli utenti di \glossaryItem{MaaS}.

\subsubsection{Framework integrati}
\paragraph{SweetJS}
\paragraph*{Descrizione}
Tool che permettere la definizione di una serie di macro allo scopo di modellare una grammatica regolare traducibile in \glossaryItem{procedure} \glossaryItem{JavaScript}.

\paragraph*{Utilizzo}
Come usato in \glossaryItem{MaaP}, definisce la sintassi del \glossaryItem{DSL}. In \glossaryItem{MaaS} il set di macro verrà esteso per soddisfare i nuovi requisiti.

\paragraph{ExpressJS}
\paragraph*{Descrizione}
Framework per la creazione e la gestione di webserver per l'esposizione di \glossaryItem{API} RESTful.

\paragraph*{Utilizzo}
Utilizzato come base per la struttura del server.

\paragraph{Mongoose}
\paragraph*{Descrizione}
Framework per interfacciarsi con \glossaryItem{MongoDB}.

\paragraph*{Utilizzo}
Utilizzato per la gestione dei dati su database \glossaryItem{MongoDB}.

\subsection{API REST}
\subsubsection{Comunicazione tra client e server}
Per la creazione del backend di \glossaryItem{MaaS} si è deciso di utilizzare \glossaryItem{Node.js} e, in particolare, il \glossaryItem{framework} ExpressJS, che permette la creazione semplificata di server \glossaryItem{REST}. Il lato backend sarà quindi costituito da un insieme di \glossaryItem{API} protette da strati diversi di sicurezza. \\
Ciascuna \glossaryItem{API} del webserver fornirà una risposta in formato \glossaryItem{JSON} per permettere la fruizione delle informazioni. Fornirà nello stesso formato anche gli eventuali messaggi di errore generati nel corpo dei metodi del server. Tali messaggi di errore saranno così composti: 
\begin{verbatim}
{
    "code":     [Codice definito nel protocollo \glossaryItem{HTTP}, che identifica univocamente
                 la tipologia del problema]
    "message":  [Messaggio che definisce in dettaglio la tipologia dell'errore]
    ["data":   [Opzionale, trasporta i dati in cui si è verificato l'errore]]
}
\end{verbatim}
I codici di errore saranno del tipo 4xx (client error, la richiesta è sintatticamente scorretta o non può essere soddisfatta) o 5xx (server error, il server ha fallito nel soddisfare una richiesta apparentemente valida).
\subsubsection{Sicurezza}
Gli accessi alle \glossaryItem{API} avranno 2 livelli di sicurezza. \\
Il primo livello è rappresentato dall'autenticazione: un utente non autenticato riceverà un errore se richiede una \glossaryItem{API} protetta. Verrà implementato con l'utilizzo di PassportJS, un \glossaryItem{middleware} per ExpressJS che permette l'autenticazione di utenti nel sistema. In particolare verrà utilizzata la strategia passport-local per l'accesso al server, cioè le credenziali dell'utente risiederanno nel database locale. \\
Il secondo livello è definito in base al ruolo di appartenenza di un utente. Si occuperà di controllare i permessi assegnati ad un utente autenticato e di verificare la possibilità che possa o meno interagire con la risorsa richiesta. \\
I ruoli utente ammessi nell'applicazione sono: 
\begin{itemize}
\item \textbf{Guest};
\item \textbf{Member};
\item \textbf{Admin};
\item \textbf{Owner};
\item \textbf{Super Admin}.
\end{itemize}
Per il ruolo di Super Admin è abilititato un set di \glossaryItem{API} per la gestione dell'intera applicazione. Tali \glossaryItem{API} non sono accessibili agli utenti con altri ruoli.
\newpage
\subsubsection{Scenari di accesso negato}
Di seguito verranno rappresentati \glossaryItem{scenari} corrispondenti ad una negazione di accesso per ruolo non conforme alle attese o per errore nel login.
\paragraph{Errore di autenticazione}  \mbox{} \\
\textbf{Descrizione:} L'utente non autenticato cerca di accedere a \glossaryItem{MaaS}, ma la \glossaryItem{procedura} di login rileva un errore nelle credenziali inserite.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/autenticazioneFallita.png}
\caption{Autenticazione fallita}
\end{figure}
\paragraph{Livello minimo: MEMBER} \mbox{} \\
\textbf{Descrizione:} Tentativo di accesso ad una risorsa visibile solo a utenti con ruolo almeno MEMBER da parte di un utente GUEST.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/requireMemberFallita.png}
\caption{Livello minimo MEMBER}
\end{figure}
\paragraph{Livello minimo: ADMIN} \mbox{} \\
\textbf{Descrizione:} Tentativo di accesso ad una risorsa visibile solo a utenti con ruolo almeno ADMIN da parte di un utente GUEST o MEMBER.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/requireAdminFallita.png}
\caption{Livello minimo ADMIN}
\end{figure}
\paragraph{Livello minimo: OWNER}  \mbox{} \\
\textbf{Descrizione:} Tentativo di accesso ad una risorsa visibile solo a utenti con ruolo almeno OWNER da parte di un utente GUEST, MEMBER o ADMIN.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/requireOwnerFallita.png}
\caption{Livello minimo OWNER}
\end{figure}
\paragraph{Livello minimo: SUPERADMIN}  \mbox{} \\
\textbf{Descrizione:} Tentativo di accesso ad una risorsa accedibile solo da un SUPERADMIN da parte di un generico utente di \glossaryItem{MaaS}.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/requireSuperAdminFallita.png}
\caption{Livello minimo SUPERADMIN}
\end{figure}
\newpage
\subsection{Descrizione API}
Di seguito sono descritte le \glossaryItem{API} \glossaryItem{REST} esposte dal server di \glossaryItem{MaaS}. Si suppone che l'utente che richiede l'accesso alla risorsa descritta abbia i permessi necessari (ovvero che sia autenticato e che il suo ruolo sia conforme a quanto indicato). Qualora questo non fosse vero si ricadrebbe in uno degli \glossaryItem{scenari} esposti precedentemente.
\subsubsection{Senza autenticazione}
\paragraph{Login}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/login \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente email e password dell'utente. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)login.png}
\caption{Scenario del login}
\end{figure}

\newpage
\paragraph{Registrazione}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/register/:unique\_code \\
\textbf{Descrizione:} Metodo per la creazione di un utente invitato da una \glossaryItem{Company}. Necessita di una richiesta con \textit{body} contenete le informazioni per la creazione completa di un utente \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)register.png}
\caption{Scenario della registrazione}
\end{figure}

\newpage
\paragraph{Creazione Company}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/companies \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente le informazioni relative alla \glossaryItem{company} e alla creazione del profilo del suo \glossaryItem{Owner}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)company.png}
\caption{Scenario della creazione \glossaryItem{company}}
\end{figure}

\newpage
\subsubsection{User}

\paragraph{Inserimento utente}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/companies/:company\_id/users \\
\textbf{Livello di accesso minimo:} OWNER \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente l'email e il livello di accesso dell'utente.\\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)user.png}
\caption{Scenario dell'inserimento utente in una \glossaryItem{Company}}
\end{figure}

\newpage
\paragraph{Aggiornamento delle credenziali utente}\mbox{}\\
\textbf{Tipologia:} PUT \\
\textbf{API:} /api/companies/:company\_id/users/:user\_id/credentials \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Metodo per la modifica delle credenziali di accesso di un utente. Un utente ha il permesso di cambiare solo le proprie credenziali. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(PUT)credenzialiUtente.png}
\caption{Scenario dell'aggiornamento delle credenziali di un utente}
\end{figure}

\newpage
\paragraph{Cancellazione utente}\mbox{}\\
\textbf{Tipologia:} DELETE \\
\textbf{API:} /api/companies/:company\_id/users/:user\_id \\
\textbf{Livello di accesso minimo:} OWNER \\
\textbf{Descrizione:} Ritorna un messaggio di conferma dell'avvenuta cancellazione. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(DELETE)user.png}
\caption{Scenario della cancellazione utente da una \glossaryItem{company}}
\end{figure}

\newpage
\subsubsection{Company}
\paragraph{Dati di una Company}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/ \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Ritorna le informazioni generali di una \glossaryItem{Company} \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)company.png}
\caption{Scenario di ottenimento dei dati di una \glossaryItem{company}}
\end{figure}

\newpage
\paragraph{Aggiornamento dei dati di una Company}\mbox{}\\
\textbf{Tipologia:} PUT \\
\textbf{API:} /api/companies/:company\_id/ \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente le modifiche da apportare ai dati della \glossaryItem{Company}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(PUT)company.png}
\caption{Scenario dell'aggiornamento dei dati di una \glossaryItem{Company}}
\end{figure}

\newpage
\paragraph{Cancellazione di una Company}\mbox{}\\
\textbf{Tipologia:} DELETE \\
\textbf{API:} /api/companies/:company\_id/ \\
\textbf{Livello di accesso minimo:} OWNER \\
\textbf{Descrizione:} Ritorna un messaggio di avvenuta cancellazione. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(DELETE)company.png}
\caption{Scenario della cancellazione di una \glossaryItem{Company}}
\end{figure}

\newpage
\subsubsection{DSL}
\paragraph{Elenco delle specifiche DSL}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/DSLs \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Ritorna un array contenente le specifiche \glossaryItem{DSL} alle quali l'utente ha accesso in formato \glossaryItem{JSON}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)dsl.png}
\caption{Scenario dell'elenco delle specifiche \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Lettura del codice di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/DSLs/:dsl\_id \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Ritorna il codice della specifica \glossaryItem{DSL} richiesta in formato \glossaryItem{JSON}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)dslByID.png}
\caption{Scenario della lettura del codice di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Aggiunta di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/companies/:company\_id/DSLs \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente i dati necessari alla creazione della specifica \glossaryItem{DSL}. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)dsl.png}
\caption{Scenario della creazione di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Aggiornamento del codice di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} PUT \\
\textbf{API:} /api/companies/:company\_id/DSLs/:dsl\_id \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Necessita di una richiesta con body contenente i dati necessari alla modifica della specifica \glossaryItem{DSL} identificata da dsl\_id. \\
\textbf{Scenario:}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(PUT)dsl.png}
\caption{Scenario dell'aggiornamento del codice di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Cancellazione di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} DELETE \\
\textbf{API:} /api/companies/:company\_id/DSLs/:dsl\_id \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Ritorna un messaggio in formato \glossaryItem{JSON} di avvenuta cancellazione. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(DELETE)dsl.png}
\caption{Scenario della cancellazione di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Ottenimento della Dashboard di un utente}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/users/:user\_id/dashboard \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Ritorna la \glossaryItem{Dashboard} di un utente definita da una \glossaryItem{DSL}. \\
\textbf{Scenario:}  
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)dashboard.png}
\caption{Scenario dell'ottenimento della \glossaryItem{Dashboard} di un utente}
\end{figure}

\newpage
\paragraph{Esecuzione di una specifica DSL}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/DSLs/:dsl\_id/execute \\
\textbf{Livello di accesso minimo:} GUEST \\
\textbf{Descrizione:} Ritorna un \glossaryItem{JSON} contenente i dati richiesti dalla specifica \glossaryItem{DSL} e la struttura su cui inserire i dati. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)dslByIDex.png}
\caption{Scenario dell'esecuzione di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\subsubsection{Database}
\paragraph{Elenco dei database della Company}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/databases \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Ritorna un array contenente i nomi e gli id di ciascun database. \\
\textbf{Scenario:}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)database.png}
\caption{Scenario dell'elenco dei database propri della \glossaryItem{Company}}
\end{figure}

\newpage
\paragraph{Visualizzazione dati di un database}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/databases/:database\_id \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Ritorna tutte le informazioni relative al database richiesto. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)databaseById.png}
\caption{Scenario della visualizzazione dei dati di un database}
\end{figure}

\newpage
\paragraph{Aggiunta di un database}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/companies/:company\_id/databases \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenete i dati relativi alla connessione del nuovo database. \\
\textbf{Scenario:}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)database.png}
\caption{Scenario della creazione di una specifica \glossaryItem{DSL}}
\end{figure}

\newpage
\paragraph{Aggiornamento di un database}\mbox{}\\
\textbf{Tipologia:} PUT \\
\textbf{API:} /api/companies/:company\_id/databases/:database\_id \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Metodo per aggiornare le informazioni relative alla connessione al database o per aggiornare l'elenco delle collezioni. \\
\textbf{Scenario:}
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(PUT)database.png}
\caption{Scenario dell'aggiornamento di un database}
\end{figure}

\newpage
\paragraph{Cancellazione di un database}\mbox{}\\
\textbf{Tipologia:} DELETE \\
\textbf{API:} /api/companies/:company\_id/databases/:database\_id \\
\textbf{Livello di accesso minimo:} ADMIN \\
\textbf{Descrizione:} Elimina il database selezionato e tutte le specifiche \glossaryItem{DSL} che lo utilizzano. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(DELETE)database.png}
\caption{Scenario della cancellazione di un database}
\end{figure}

\newpage
\paragraph{Visualizzazione Collections di un database} \mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/companies/:company\_id/databases/:database\_id/collections \\
\textbf{Livello di accesso minimo:} MEMBER \\
\textbf{Descrizione:} Ritorna un array di \glossaryItem{Collection} relative ad un database a cui l'utente ha accesso. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)collection.png}
\caption{Scenario della visualizzazione Collections di un database}
\end{figure}

\newpage
\subsubsection{Super admin}
\paragraph{Ottenimento informazioni delle Company}\mbox{}\\
\textbf{Tipologia:} GET \\
\textbf{API:} /api/admin/companies \\
\textbf{Descrizione:} Restituisce un array di \glossaryItem{JSON} contenenti le informazioni relative alle \glossaryItem{Company} presenti nell'applicazione. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(GET)companySA.png}
\caption{Scenario dell'ottenimento informazioni delle \glossaryItem{Company}}
\end{figure}

\newpage
\paragraph{Aggiunta di un SuperAdmin}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/admin/superadmins \\
\textbf{Descrizione:} Necessita di una richiesta con body contenente le informazioni relative al superadmin da creare. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)superadmin.png}
\caption{Scenario dell'aggiunta di un super admin}
\end{figure}

\newpage
\paragraph{Aggiunta di un utente}\mbox{}\\
\textbf{Tipologia:} POST \\
\textbf{API:} /api/admin/companies/:company\_id/users \\
\textbf{Descrizione:} Necessita di una richiesta con \textit{body} contenente le informazioni relative all'utente da creare per la \glossaryItem{Company} individuata da \glossaryItem{company}\_id. \\
\textbf{Scenario:} 
\begin{figure}[H]
\centering
\includegraphics[width=0.8\textwidth]{res/sections/backend/sequence/(POST)userSA.png}
\caption{Scenario dell'aggiunta di un utente}
\end{figure}

{'fraction_non_alphanumeric': 0.10926476049015968, 'fraction_numerical': 0.0023672484218343853, 'mean_word_length': 5.784904471971447, 'pattern_counts': {'":': 6, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4663604', 'n_tokens_mistral': 21076, 'n_tokens_neox': 22007, 'n_words': 5821}