From 0416d6121a1244ceb509ff4aa7ab5846c5126f14 Mon Sep 17 00:00:00 2001 From: igor-lirussi <69794393+igor-lirussi@users.noreply.github.com> Date: Wed, 10 Nov 2021 20:36:46 +0300 Subject: [PATCH] fixed bug generation tag in github Actions --- .github/workflows/LatexBuild.yml | 3 +- References.bib | 12 ++--- Tex/Implementation.tex | 83 ++++++++++++++++++++------------ Tex/TestingAndPerformance.tex | 10 ++-- main.tex | 2 +- 5 files changed, 64 insertions(+), 46 deletions(-) diff --git a/.github/workflows/LatexBuild.yml b/.github/workflows/LatexBuild.yml index 5d868f9..cd2a147 100644 --- a/.github/workflows/LatexBuild.yml +++ b/.github/workflows/LatexBuild.yml @@ -96,7 +96,8 @@ jobs: then #if yes use it echo "::set-output name=RELEASE_NAME::$(echo ${{steps.extract_tag_msg.outputs.TAG_MSG}})" else #if generate one new tag incrementing fixes number like x.y.z+1 - val=$(git describe --tags --abbrev=0) + #val=$(git describe --tags --abbrev=0) + val=$(git tag | sort -V | tail -1) newval=$(echo ${val##*.}) newval=$((newval+1)) newval="${val%.*}.$newval" diff --git a/References.bib b/References.bib index 03232b2..9d7bc62 100644 --- a/References.bib +++ b/References.bib @@ -7,11 +7,7 @@ @article{yolov3 year={2018}, } - - - - - - - - +@article{suaiv, + title={Stop using actions in Vuex}, + url = {https://javascript.plainenglish.io/stop-using-actions-in-vuex-a14e23a7b0e6}, +} diff --git a/Tex/Implementation.tex b/Tex/Implementation.tex index bc41d3e..dbf7a3b 100644 --- a/Tex/Implementation.tex +++ b/Tex/Implementation.tex @@ -58,14 +58,7 @@ \subsection{Forecast e Socket.IO} \subsection{Autenticazione} \subsubsection{JSON Web Token JWT} -Per l'autenticazione è stato deciso di utilizzare il sistema a token JWT, firmati dal backend. Al momento -del login il server rilascia un token al client contenente dei dati -utili all’autenticazione; in questa maniera, durante le successive richieste, -il client invierà anche il token ricevuto, e il server lo controllerà per verificare -se è valido e quindi autorizzare il client. In questa maniera il server -diventa stateless, non avendo bisogno di salvare le informazioni relative -alle sessioni dei vari client collegati. - +Per l'autenticazione è stato deciso di utilizzare il sistema JWT (Json Web Token), firmati dal backend. Al momento del login il server rilascia un token al client contenente dei dati utili all’autenticazione. Il client, inviando al server il token ricevuto assieme alle richieste che necessitano di autenticare il richiedente, potrà essere riconosciuto e verificato dal server. In questa maniera il server rimane stateless, dato che le informazioni dell'autenticazione devono essere necessariamente inviate ad ogni richiesta da parte del client. \begin{lstlisting}[language=Javascript] // generate token when user log in @@ -78,32 +71,37 @@ \subsubsection{JSON Web Token JWT} cb(null, user); }); }; + // find by token userSchema.statics.findByToken = function (token, cb) { var user = this; jwt.verify(token, process.env.SECRET, function (err, decode) { - user.findOne({ _id: decode, token: token }, function (err, user) { - if (err) return cb(err); - cb(null, user); - }); + user.findOne({ _id: decode, token: token }, + function (err, user) { + if (err) return cb(err); + cb(null, user); + } + ); }); }; + //delete token, when the user logout userSchema.methods.deleteToken = function (token, cb) { var user = this; - user.update({ $unset: { token: 1 } }, function (err, user) { - if (err) return cb(err); - cb(null, user); - }); + user.update({ $unset: { token: 1 } }, + function (err, user) { + if (err) return cb(err); + cb(null, user); + } + ); }; \end{lstlisting} -Per facilitare l'utilizzo della validazione del token JWT è stato prodotto un middleware facilmente inseribile nel -usso di Express. Questo middleware recupera il token disponibile dai cookies, inoltre recupera i dati sull'utente -autenticato e li inserisce nella richiesta per renderli disponibili nel handler della +Per facilitare l'utilizzo della validazione del token JWT è stato prodotto un middleware facilmente inseribile nel flusso di Express. Questo middleware recupera il token disponibile dai cookies. Se lo trova associato ad un utente nel database, recupera i dati su di esso e li inserisce nella richiesta per renderli disponibili nell'handler della route desiderata. + \begin{lstlisting}[language=Javascript] let auth = (req, res, next) => { let token = req.cookies.auth; @@ -128,14 +126,16 @@ \subsubsection{JSON Web Token JWT} next(); }); }; - \end{lstlisting} + \subsubsection{Dati sensibili} -Si è avuta la necessità anche di gestire alcuni dati sensibili dell'utente, come le password. E' stata utilizzata bcrypt, una funzione di hashing per salvare le password in maniera sicura + +Si è avuta la necessità anche di gestire alcuni dati sensibili dell'utente, come le password. E' stato utilizzato bcrypt, un modulo contenente le più comuni funzioni di hashing per salvare le password in maniera sicura nel database; viene utilizzato al momento della registrazione di un utente -quando si deve salvare la password nel db (viene salvato il suo hash con il +quando si deve salvare la password (viene salvato il suo hash con il relativo valore di sale), e al login quando bisogna confrontare la password -ricevuta dall’utente con quella salvata. +ricevuta dall’utente con quella salvata. + \begin{lstlisting}[language=Javascript] userSchema.pre("save", function (next) { var user = this; @@ -152,8 +152,9 @@ \subsubsection{Dati sensibili} next(); } }); + userSchema.methods.comparePassword = function (password, cb) { -/*Comparing the user password when user tries to login*/ + // Compare the user password when user tries to login bcrypt.compare(password, this.password, function (err, isMatch) { if (err) return cb(next); cb(null, isMatch); @@ -161,9 +162,6 @@ \subsubsection{Dati sensibili} }; \end{lstlisting} -\subsection{Prossimo sottocapitolo ...} - - \section{Client} \textit{Commento:anche questo da completare come nel server, ci ho messo qualche spunto}\\ Per lo sviluppo del Client è stato usato Vuetify, un framework di componenti di Material Design per Vue. js che consente agli sviluppatori di creare incredibili applicazioni in modo rapido ed efficiente. @@ -172,7 +170,8 @@ \subsection{Socket} TODO \subsection{Store} -Come tutte le applicazioni Vuex c'è uno store che è un po' un singleton, che contiene tutti i dati in un oggetto. +Per gestire lo stato dell'applicazione, abbiamo avuto la necessità di sfruttare il framework Vuex. Esso fornisce un'interfaccia unica per tutta l'applicazione per interrrogare lo stato e modificarlo. Questo permette di avere un'unica fonte di verità dei dati e ne preserva maggiormente l'integrità. + Graficamente potremo delinearne così la struttura: \begin{figure}[H] \caption{Le azioni sono fuori dallo store e diventano servizi} @@ -180,13 +179,35 @@ \subsection{Store} \centering \includegraphics[width=0.7\textwidth]{Images/store.png} \end{figure} -https://javascript.plainenglish.io/stop-using-actions-in-vuex-a14e23a7b0e6 -Finisci di scrivere... +Il nostro stato è rappresentato dal listato sottostante, in particolare abbiamo memorizzato la visibilità della barra di navigazione e lo stato di autenticazione dell'utente. + +\begin{lstlisting}[language=Javascript] +const state = { + drawer: null, + user: null, +}; +\end{lstlisting} + +Lo stato viene quindi letto quando bisogna mostrare o no la barra di navigazione oppure capire quando un utente è autenticato oppure no. \section{Centralina} -Implementazione centralina +L'applicativo per la centralina è stato sviluppato anch'esso con le tecnologie Node.JS ed Express. Essendo un progetto di simulazione di una centralina reale, dispone di solamente due funzioni: una per ottenere info sullo stato del dispositivo e una per ottenere le condizioni meteo correnti (generate staticamente, data la natura del progetto). + +\begin{lstlisting}[language=Javascript] +const express = require("express"); +const weather = require("./storage/weather.storage"); + +const app = express(); +app.get("/current", weather.readAll); + +app.get("/info", (req, res, next) => + res.status(200).json({ + ... + }); +); +\end{lstlisting} \section{Prodotto Finale} \label{prodottofinale} diff --git a/Tex/TestingAndPerformance.tex b/Tex/TestingAndPerformance.tex index e76419f..af76c57 100644 --- a/Tex/TestingAndPerformance.tex +++ b/Tex/TestingAndPerformance.tex @@ -4,21 +4,21 @@ \chapter{Testing e Performance} -Lo sviluppo delle applicazioni web a livello professionale richiede la qualità e la robustezza del codice che è stato prodotto. Per avere delle metriche concrete sulla qualità del prodotto, è necessario coprire il progetto di test, sia automatici che manuali. +Lo sviluppo delle applicazioni web a livello professionale richiede la qualità e la robustezza del codice che è stato prodotto. Per avere delle metriche concrete su tali metriche, è necessario eseguire intensivamente ed estensivamente test sul prodotto, sia automatici che manuali. \section{Unit Test} -Le parti più importanti inerenti la logica di business sono stati testati con gli unit test per migliorarne la robustezza e l'affidabilità. Molte componenti dell'applicativo Server sono state sviluppate con un approccio Test Driven Development e sono state controllate molte volte prima di essere messe in produzione. +Le parti più importanti inerenti la logica di business sono stati testati con gli unit tests per migliorarne la robustezza e l'affidabilità. Molte componenti dell'applicativo Server sono state sviluppate con un approccio Test Driven Development e sono state controllate molte volte prima di essere messe in produzione. \par In generale si è cercato di tenere un approccio sistematico per affrontare i problemi: \begin{itemize} - \item Si cercava di modellare in modo il più reale possibile le entità che si sarebbero manipolate successivamente, cercando di capire il dominio del problema e quali fossero tutti i dati di cui avesse bisogno + \item Si cercava di modellare in modo il più reale possibile le entità che si sarebbero manipolate successivamente, cercando di capire il dominio del problema e quali fossero tutti i dati di cui si avesse bisogno; - \item Successivamente si sviluppava il componente che sarebbe stato delegato a interagire principalmente con la base dati di entità appena modellate creando prima i test automatici per controllare che i dati venissero manipolati correttamente a seconda delle necessità + \item Successivamente si sviluppava il componente che sarebbe stato delegato a interagire principalmente con la base dati delle entità appena modellate. Creati i test automatici per controllare che i dati venissero manipolati correttamente a seconda delle necessità, solamente in un secondo momento, dopo aver appurato il fallimento dei test appena scritti, si sarebbe proceduto a scrivere il codice necessario per farli riuscire; - \item In tal modo si sviluppavano anche i componenti della logica di business che dovevano gestire il susseguirsi delle operazioni sui dati in modo da completare i compiti da svolgere e i componenti che dovevano gestire le richieste dei client e fornire loro i dati richiesti. + \item Allo stesso modo, si sviluppavano anche i componenti della logica di business. \item Infine, al manifestarsi di ulteriori problemi e malfunzionamenti, si è sempre cercato innanzitutto di comprendere se ci fossero stati dei problemi nell'implementazione dei test e che le loro funzionalità fossero quelle che ci si aspettava. In tal caso, allora si procedeva alla stesura di altri test automatici che permettessero di riprodurre il problema e risolverlo. diff --git a/main.tex b/main.tex index 11a4800..edd45bc 100644 --- a/main.tex +++ b/main.tex @@ -99,7 +99,7 @@ %define Javascript language \lstdefinelanguage{JavaScript}{ -keywords={typeof, new, true, false, catch, function, return, null, catch, switch, var, if, in, while, do, else, case, break}, +keywords={typeof, new, true, false, catch, function, return, null, catch, switch, var, if, in, while, do, else, case, break, let, throw}, keywordstyle=\color{blue}\bfseries, ndkeywords={class, export, boolean, throw, implements, import, this}, ndkeywordstyle=\color{darkgray}\bfseries,