% Looks like the font from google fonts has a different case,
@ -91,6 +91,7 @@
\newcommand{\entityb}[1]{#1}
\newcommand{\person}[2]{#1 #2}
\newcommand{\term}[1]{\textit{#1}}
\newcommand{\reffig}[1]{[Figure~\ref{#1}]}
\title{Rapport de stage ST40 - A2022}
\author{Adrien Burgun}
@ -286,48 +287,65 @@ Durant ce stage, j'ai surtout travaillé sur les applications suivantes:
\subsection{Mint Service}
Mint Service est une application construite avec \term{NestJS}.
Mint Service est une application construite avec \entity{NestJS}.
NestJS est un framework permettant de construire des applications côté serveur en Javascript,
et de s'assurer que ces applications soient à la fois sûres, efficaces et flexibles \cite{nestjs}.
\subsubsection{NestJS et l'organisation du code dans Mint Service}
\subsubsection{NestJS et organisation du code}
% TODO: hiérarchiser l'argumentaire
NestJS emploie à son coeur les principes de \term{modularité} et d'\term{inversion de contrôle} (\term{IoC}).
L'application est séparée en différents modules, permettant de faire une séparation claire entre les morceaux de codes utilisés
pour répondre à différents besoins.
NestJS emploie à son coeur les principes de \term{modularité} et d'\term{inversion de contrôle} (\term{IoC}):
\\
L'application est séparée en différents modules, qui eux-mêmes contiennent des \term{services} et des \term{controleurs}. \reffig{nestjs3}
Chaque module contient des \term{services}, aussi appelés \term{providers}, qui contiennent du code métier
(contacter la base de donnée, traiter de l'information, etc).
Les modules ont également des \term{controlleurs}, qui permettent de définir les différents chemins qui seront exposés
sur le réseau.
Un contrôleur est responsable pour transformer les requêtes, vérifier leur légitimité, puis il appele les méthodes
d'un ou plusieurs services avant de transformer la réponse puis l'envoyer au client.
\begin{description}
\item[Les services] (aussi appelés \term{providers}) contiennent l'implémentation de la logique nécessaire
pour répondre aux besoins de l'application: contacter une base de donnée, traiter l'information, faire des
requêtes réseau, etc.
\item[Les controleurs] sont responsables d'accepter les requêtes des \entity{clients}, de les transformer, de vérifier
leur légitimité et d'appeler les méthodes des \entity{services} avant de transformer la réponse à envoyer au \entity{client}.
\\
NestJS fournit un ensemble d'outils simplifiant l'implémentation des controleurs.
\item[Les modules] s'occupent de gérer la configuration des \entity{services} et des \entity{controleurs}:
chaque \entity{module} indique à NestJS quels \entity{services} et \entity{controleurs} il contient,
ainsi que comment NestJS doit construire ces services dans les cas plus complexes.
\\
Les modules peuvent exporter un sous-ensemble de leurs services, ce qui permet de rapidement
réutiliser des services en important le module leur étant associé. \reffig{nestjs2}
\end{description}
% TODO: trouver une source
La séparation entre \term{contrôleur} et \term{service} permet d'avoir une claire \term{séparation des préoccupations}:
les contrôleurs s'occupent de gérer, valider et répondre aux requêtes faites par un client,
tandis que les services s'occupent de l'implémentation de la logique permettant de satisfaire la requête.
\begin{figure}[H]
\centering
\includegraphics{nestjs3}
\caption{Organisation d'un module NestJS typique}
\label{nestjs3}
\end{figure}
Il devient également plus simple avec ce système de modifier l'implémentation de la logique côté service
sans mettre en danger la fonctionnalité du service avec d'autres applications: la gestion et la vérification
des requêtes restant inchangée.
Pour limiter le couplage entre les services, et pour simplifier la réutilisation des services,
NestJS permet de faire de l'\term{injection de dépendances} dans les services et dans les contrôleurs,
d'une manière similaire framework \entity{Spring} en Java.
La séparation entre controleurs et services permet d'avoir une claire \term{séparation des préoccupations}:
Par exemple, si un service \textit{ParentService} souhaite utiliser des méthodes d'un service \textit{ChildService},
alors au lieu de créer une instance de \textit{ChildService} dans \textit{ParentService}, \textit{ParentService}
indique qu'il aimerait recevoir une instance de \textit{ChildService}, et l'utilisateur de \textit{ParentService}
est responsable pour fournir à celui-ci une instance de \textit{ChildService}.
\begin{itemize}
\item Les controleurs s'occupent de gérer, valider et répondre aux requêtes faites par un client;
\item Les services s'occupent de l'implémentation de la logique permettant de satisfaire la requête;
\item Les modules s'occupent de configurer les services et les controleurs, et permettent la modularisation du code.
\end{itemize}
NestJS simplifie ce processus, en permettant aux modules de faire la liste des services disponibles,
et en détectant automatiquement quels services dépendent de quels services à partir des arguments du constructeur.
NestJS construit ensuite les instances de ces services et les \term{injecte} en paramètre aux services en dépendant.
Pour limiter le couplage entre les services, et pour simplifier la réutilisation des services,
NestJS permet de faire de l'\term{injection de dépendances} par \term{constructeur sans défaut}\cite{yang2008empirical} dans les services et dans les controleurs,
d'une manière similaire au framework \entity{Spring} en \entity{Java}. \reffig{nestjs1}