|
|
@ -26,8 +26,37 @@
|
|
|
|
% Requires xelatex to run (or maybe also lualatex)
|
|
|
|
% Requires xelatex to run (or maybe also lualatex)
|
|
|
|
\usepackage{utbmcovers}
|
|
|
|
\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}
|
|
|
|
\definecolor{bgColor}{rgb}{0.95,0.95,0.92}
|
|
|
|
\lstdefinestyle{JS}{
|
|
|
|
\lstdefinestyle{JavaScript}{
|
|
|
|
backgroundcolor=\color{bgColor},
|
|
|
|
backgroundcolor=\color{bgColor},
|
|
|
|
commentstyle=\color{gray},
|
|
|
|
commentstyle=\color{gray},
|
|
|
|
keywordstyle=\color{magenta},
|
|
|
|
keywordstyle=\color{magenta},
|
|
|
@ -44,7 +73,7 @@
|
|
|
|
showstringspaces=false,
|
|
|
|
showstringspaces=false,
|
|
|
|
showtabs=false,
|
|
|
|
showtabs=false,
|
|
|
|
tabsize=2,
|
|
|
|
tabsize=2,
|
|
|
|
language=Javascript
|
|
|
|
language=JavaScript
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
\newfontfamily{\Tahoma}{Tahoma}
|
|
|
|
\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
|
|
|
|
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.
|
|
|
|
de partenariat et négocie les prix lors de la vente des produits de l'entreprise.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% TODO: reste
|
|
|
|
|
|
|
|
|
|
|
|
\end{description}
|
|
|
|
\end{description}
|
|
|
|
|
|
|
|
|
|
|
|
\newpage
|
|
|
|
\newpage
|
|
|
@ -196,8 +227,162 @@ différents pôles:
|
|
|
|
% Tests unitaires
|
|
|
|
% 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é}
|
|
|
|
\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
|
|
|
|
\newpage
|
|
|
|
|
|
|
|
|
|
|
|
\bibliographystyle{plain}
|
|
|
|
\bibliographystyle{plain}
|
|
|
|