\chapter{Requis techniques}

\section{Architecture et communications}

L'application est construite selon une architecture trois tiers qui va séparer la partie interface utilisateur de la partie traitement et des données. La couche de présentation sera appelée par la suite \emph{frontend} et celle de traitement \emph{backend}. Pour échanger des informations entre eux, ces tiers doivent utiliser des protocoles et un formatage précis.

\vspace{3mm}
\begin{figure}[h]
    \centering
    \includegraphics[width=150mm]{application_architecture}
    \caption{Architecture de l'application}
\end{figure}
\vspace{3mm}

La communication entre le frontend et le backend se fait au travers d'un API \gls{restful} basé sur des échanges HTTP. Son implémentation du coté backend est assuré par le framework RubyOnRails\cite{railssite} et du coté frontend par EmberJS\cite{emberjssite}. Pour se comprendre, ces deux librairies respectent le même standard pour sérialiser l'information. Il s'agit de la spécification \emph{json api}\cite{jsonapi} dont l'implémentation coté backend est faite grâce au module ActiveModelSerializer\cite{activemodelserializer} et du coté frontend par la classe DS.JSONApiSerializer\cite{dsjsonapiserializer}. Cette convention décrit un ensemble de règles qui définissent comment les informations doivent être mises en forme dans une API qui utilise le JSON comme format de donnée. Cette structure force donc le développeur à structurer correctement les données et est une mise en application supplémentaire du paradigme "Convention plutôt que configuration".

Les échanges entre le backend et MongoDB sont assurés par le module Mongoid\cite{mongoid}. Cette extension applique le \emph{Data mapper pattern} en gérant la correspondance entre les objets définit en Ruby et les collections d'objets de la base de donnée. Elle va également fournir les méthodes pour interagir avec ces collections, comme par exemple les requêtes de recherche sur les objets.

\section{Technologies et versions}

L'ensemble de la solution utilisent différentes technologies qui doivent toutes être supportées pour assurer son bon fonctionnement. Les programmes principaux sont listés dans le tableau ci-dessous:

\vspace{3mm}
\begin{table}[H]
    \centering
    \caption{Technologies et versions}
    \label{require-tab-techno}
    \begin{tabular}{|l|l|l|}
    \hline
    \textbf{Nom} & \textbf{Version} & \textbf{Description}                      \\ \hline
    Ruby         & 3.4              & Interpréteur Ruby                         \\ \hline
    Bundler      & 1.16.1           & Gestionnaire de dépendances pour Ruby     \\ \hline
    Rails        & 5.1.6            & Framework pour l'application backend      \\ \hline
    NodeJS       & 8.1              & Moteur pour application Javascript        \\ \hline
    NPM          & 6.2.0            & Gestionnaire de dépendance de NodeJS      \\ \hline
    Ember-CLI    & 3.3.0            & Framework pour l'application frontend     \\ \hline
    MongoDB      & 4.0.2            & Système de base de donnée non-relationnel \\ \hline
    Redis        & 4.0.11           & Base de donnée en mémoire                 \\ \hline
    \end{tabular}
\end{table}
\vspace{3mm}

Les dépendances précises se trouvent dans des fichiers différents en fonction du projet:

\begin{itemize}
    \item Paltogem: \lstinline|/paltogem.gemspec|
    \item Fortigem: \lstinline|/fortigem.gemspec|
    \item Backend: \lstinline|/Gemfile|
    \item Frontend: \lstinline|/package.json|
\end{itemize}
\vspace{5mm}

\section{Hébergement}

