diff --git a/references.bib b/references.bib index a6590dc..ae760db 100644 --- a/references.bib +++ b/references.bib @@ -9,7 +9,15 @@ @misc{momentcare, author={Moment}, title={Moment Care - Un écosystème digital pour votre établissement de santé}, - hopublished="\url{https://moment.care/}", + howpublished="\url{https://moment.care/}", year=2023, note="[En ligne; accédé le 30 Janvier 2023]" } + +@misc{nestjs, + author={NestJS}, + title={NestJS - A progressive Node.JS framework}, + howpublished="\url{https://nextjs.com/}", + year=2023, + note="[En ligne; accédé le 31 Janvier 2023]" +} diff --git a/report.tex b/report.tex index fdff9ad..fd20801 100644 --- a/report.tex +++ b/report.tex @@ -26,8 +26,37 @@ % Requires xelatex to run (or maybe also lualatex) \usepackage{utbmcovers} +% From https://tex.stackexchange.com/questions/89574/language-option-supported-in-listings +\lstdefinelanguage{JavaScript}{ + keywords={ + typeof, new, + abstract, class, interface, type, function, return, + try, catch, finally, + switch, case, break, + var, let, const, + if, else, + for, while, in, of, do, + true, false, null, undefined + }, + keywordstyle=\color{blue}\bfseries, + ndkeywords={ + export, implements, import, this, + private, public, readonly, constructor, + @Inject, @Injectable, @Controller, @Module + }, + ndkeywordstyle=\color{darkgray}\bfseries, + identifierstyle=\color{black}, + sensitive=false, + comment=[l]{//}, + morecomment=[s]{/*}{*/}, + commentstyle=\color{purple}\ttfamily, + stringstyle=\color{red}\ttfamily, + morestring=[b]', + morestring=[b]" +} + \definecolor{bgColor}{rgb}{0.95,0.95,0.92} -\lstdefinestyle{JS}{ +\lstdefinestyle{JavaScript}{ backgroundcolor=\color{bgColor}, commentstyle=\color{gray}, keywordstyle=\color{magenta}, @@ -44,7 +73,7 @@ showstringspaces=false, showtabs=false, tabsize=2, - language=Javascript + language=JavaScript } \newfontfamily{\Tahoma}{Tahoma} @@ -150,6 +179,8 @@ différents pôles: futurs. Elle met en place le business plan, amène à l'entreprise de nouvelles opportunités de partenariat et négocie les prix lors de la vente des produits de l'entreprise. + % TODO: reste + \end{description} \newpage @@ -196,8 +227,162 @@ différents pôles: % Tests unitaires % +\subsection{Produits de Moment} + +\subsubsection{Flymingo} + +\entity{Flymingo} est le produit principal de \entityb{Moment}: +% Pitch de Moment, dire sur quoi c'est déployé + +Ce produit est composé d'un serveur, nommé \entity{Flymingo Box}, sur lequel tournent plusieures applications: + +\begin{itemize} + \item Une application web, \entity{Flymingo Digital}, sur laquelle les passagers peuvent se connecter. + \item La \entity{Content API}, qui est une API pour accéder aux informations sur les différents divertissements + disponibles sur le serveur. Cette API permet aux clients d'avoir un certain degré de customabilité. + Cette API sert également les différents contenus (vidéo, musique, magazines). + % Zirock? +\end{itemize} + +\subsubsection{Mint} + +% TODO: add logo floating to the right +\entity{Mint} est le produit que \entityb{Moment} développe et déploie en ce moment dans les cliniques de santé: + +\begin{description} + \item[Mint Admin] est une application web permettant aux clinique de fixer les prix + pour les offres que celles-cis souhaite mettre à disposition, ainsi que de gérer l'assignement des différents + appareils (comme les télévisions et les tablettes) aux chambres, des différents patients à ces chambres, + et des offres aux patients. + \item[Mint Digital] est une application web que les patients des cliniques utilisent + pour se connecter, acheter des offres en ligne, regarder des films, documentaires, magazines et écouter de la musique. + \item[Mint Service] est le back-end avec lequel \entity{Mint Admin} et \entity{Mint Digital} communiquent. + \entity{Mint Service} expose une API permettant à \entity{Mint Admin} de faire des modifications aux offres et aux patients, + et à \entity{Mint Digital} de permettre aux utilisateurs de se connecter et d'acheter des offres en ligne. + \item[Mint Tab] est une application pour tablettes \term{iPad}, qui permet aux patients des cliniques + d'accéder au même contenu que sur \entity{Mint Digital}. + \item[Mint TV] est une application tournant sur les télévisions connectées, qui permet aux patients des + cliniques d'accéder au même contenu que sur \entity{Mint Digital}. +\end{description} + + + \section{Travail réalisé} +Durant ce stage, j'ai surtout travaillé sur les applications suivantes: + +\begin{itemize} + \item Mint Service + \item Mint Admin + \item Mint Digital + \item Mint TV et Mood TV +\end{itemize} + +\subsection{Mint Service} + +Mint Service est une application construite avec \term{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} + +% 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. + +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. + +% 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. + +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. + +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}. + +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. + +\begin{lstlisting}[style=JavaScript] +export abstract class IChildService { + // ... +} + +@Injectable(IChildService) +export class ChildService implements IChildService { + // ... +} + +@Injectable() +export class ParentService { + private childService: IChildService; + + constructor( + childService: IChildService + ) { + this.childService = IChildService; + } + + // ... +} + +@Module({ + providers: [ + ChildService, + ParentService + ], + exports: [ + ParentService + ] +}) +export class ParentModule {} +\end{lstlisting} + +Les modules peuvent enfin exporter un sous-ensemble de ces services, qui peuvent alors être facilement réutilisés +à d'autres endroits de l'application sans avoir à reconfigurer l'ensemble des dépendances de ces services: + +\begin{lstlisting}[style=JavaScript] +@Injectable() +export class MyService { + constructor( + parentService: ParentService + ) { + // ... + } +} + +@Module({ + imports: [ + // Comme ParentModule exporte ParentService, + // ce service est facilement rendu disponible ici pour MyService: + ParentModule + ], + providers: [ + MyService + ] +}) +export class MyModule {} +\end{lstlisting} + \newpage \bibliographystyle{plain}