## Table des Matières
- [Installation](#installation)
- [security](#security)
- [backend](#backend)
- [silaccess](#silaccess)
- [frontend](#frontend)
- [scripts](#scripts)
- [simulator](#simulator)
## Installation
### Étape 1: Installation de MariaDB
Commencez par mettre à jour la liste des paquets et les paquets eux-mêmes.
Installez MariaDB en exécutant la commande suivante:
```bash
sudo apt update && sudo apt upgrade
sudo apt-get install mariadb-server
```
### Étape 2: Sécurisation de MariaDB
Après l'installation, sécurisez votre installation MariaDB:
```bash
sudo mysql_secure_installation
```
### Étape 3: Création d'un Utilisateur et Attribution des Privilèges
Connectez-vous au shell de MariaDB:
```bash
sudo mysql -u root -p
```
Créez un nouvel utilisateur et attribuez-lui des privilèges. Remplacez `your_new_user` par le nom d'utilisateur souhaité et `password` par le mot de passe choisi.
```sql
CREATE USER 'your_new_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'your_new_user'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
```
### Étape 4: Accès à MariaDB avec VS Code
Assurez-vous d'avoir installé :
- [Extension Database Client](https://marketplace.visualstudio.com/items?itemName=cweijan.vscode-database-client2)
1. Après l'installation de l'extension, ouvrez la palette de commandes (`Ctrl+Shift+P`).
2. Tapez `Database Client: Connect Database` et sélectionnez cette option.
3. Dans le menu de sélection de la base de données, choisissez `MariaDB`.
4. Remplissez les détails de connexion requis tels que :
- Host : Adresse de l'hôte de votre base de données MariaDB (ex. `localhost` pour une instance locale).
- Port : Le port sur lequel votre base de données MariaDB écoute (le port par défaut est `3306`).
- User : Votre nom d'utilisateur pour la base de données.
- Password : Le mot de passe associé à votre nom d'utilisateur.
- Database : (Optionnel) Le nom de la base de données à laquelle vous souhaitez vous connecter directement.
5. Cliquez sur `Connect` pour établir la connexion.
### Étape 5: Accès à MariaDB via phpMyAdmin
Pour consulter et gérer vos bases de données MariaDB via phpMyAdmin sur un serveur Ubuntu, suivez les étapes ci-dessous. Ces instructions sont conçues pour une configuration avec Apache et PHP 8.1.
```
sudo apt install phpmyadmin
```
Après l'installation, il est nécessaire de configurer Apache pour reconnaître phpMyAdmin. Utilisez les commandes suivantes pour créer un lien symbolique entre la configuration de phpMyAdmin et les configurations disponibles d'Apache, puis activez cette configuration.
```
sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
sudo a2enconf phpmyadmin.conf
sudo systemctl restart apache2
```
Assurez-vous que le module PHP approprié est installé et activé pour Apache. La commande suivante installe le module PHP 8.1 pour Apache.
```
sudo apt install libapache2-mod-php8.1
sudo systemctl restart apache2
```
Une fois tout configuré, vous pouvez accéder à l'interface web de phpMyAdmin pour commencer à gérer vos bases de données MariaDB. Ouvrez votre navigateur web et allez à l'adresse suivante :
```
http://localhost/phpmyadmin
```
## Installation de RabbitMQ
### Étape 1: Installation d'Erlang
RabbitMQ nécessite Erlang pour fonctionner. Installez Erlang en exécutant:
```bash
sudo apt-get install -y erlang
```
### Étape 2: Ajout du dépôt RabbitMQ
Ajoutez le dépôt RabbitMQ à votre liste de sources et la clé du dépôt:
```bash
echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
```
### Étape 3: Installation et démarrage de RabbitMQ
Mettez à jour votre liste de paquets puis installez RabbitMQ:
```bash
sudo apt-get update
sudo apt-get install rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
```
Une fois RabbitMQ est démarrée, vous pouvez accéder à l'interface UI via http://localhost:15672 (ou le username et le mot passe: guest).
### Étape 4: Intégration de RabbitMQ dans le Projet Backend
Notre architecture backend utilise RabbitMQ pour gérer de manière efficace et fiable l'envoi de notifications, notamment les SMS et les emails. Le flux de travail est décrit ci-dessous et illustré par un diagramme de séquence.
### Étape 5: Flux de Travail de Notification
1. **Publication de Message :** Le backend (Client) commence par publier un message (SMS ou Email) sur RabbitMQ.
2. **Transfert de Message :** RabbitMQ transfère ensuite ce message au `SubscriberService`.
3. **Traitement du Message :** Selon le type de message (SMS ou Email), le traitement se fait comme suit :
- **SMS Message :**
- `SubscriberService` appelle `TwilioTextMessageSenderService` (`TService`) avec les `TextOptions` pour l'envoi de SMS.
- `TService` envoie la requête SMS à l'API Twilio.
- Twilio renvoie une réponse à `TService`, qui à son tour renvoie le statut d'envoi au `SubscriberService`.
- En fonction du statut, `SubscriberService` envoie un accusé de réception (Ack) ou un non-accusé (Nack) à RabbitMQ.
- **Email Message :**
- `SubscriberService` appelle `EmailService` avec les `EmailOptions` pour l'envoi d'Email.
- `EmailService` envoie la requête Email au service d'Email (Azure).
- Le service d'Email renvoie une réponse à `EmailService`, qui transmet le statut d'envoi au `SubscriberService`.
- `SubscriberService` envoie ensuite un Ack ou Nack à RabbitMQ, selon le statut.

# Security
## Description
Security est une API NestJs qui stocke les informations de connexion des patients dans la base de donnée security. Elle sépare les informations personnelles/l’authentification de la logique backend.
## Prérequis
- Installation de MariaDB
## Mise en place de la base de donnée
### Étape 1 : Connexion au shell de MariaDB
```bash
sudo mysql -u root -p
```
### Etape 2 : Injection de la base de donnée
Dans le dossier sql. Copier l'intégralité du fichier db_security.sql (`Ctrl+Shift+P`) et coller son contenu dans le shell mariaDB.
## Configuration
Avant de lancer l'application, vous devez configurer les variables d'environnement nécessaires. Ces variables permettent de personnaliser l'application selon votre environnement de développement, de test ou de production.
### Création du fichier `.env`
À la racine du projet, créez un fichier nommé `.env`. Ce fichier sera utilisé pour stocker les variables d'environnement.
Le fichier `.env.security` se trouve dans `monespacebiogroup/config/dev/` (pour l'environnement de dev). Copiez le contenu du fichier `.env.security` fourni. Ce fichier contient un modèle des variables d'environnement requises par l'application.
```plaintext
# App config
PORT=3333
# Database settings
DB_TYPE=mariadb
DB_HOST=localhost
DB_NAME=security
DB_PORT=3306
DB_USER=dbuser
DB_PASSWORD=NniNki5nd9KDyf6B
HTTP_BASIC_USER=server
HTTP_BASIC_PASS=24L7D5$jBcRL
```
## Lancement de l'application
```bash
npm install
npm run start:dev
```
Une fois l'application démarrée, vous pouvez accéder à l'API via `http://localhost:3333` (ou le port configuré dans votre fichier `.env`).
## Points de terminaison
Une collection Postman est disponible [ici](https://galactic-capsule-271187.postman.co/workspace/Bi_test~3679979d-8d3e-488e-ad98-b67aca4f6d78/collection/33531996-ea9dd2d1-4e86-4fdd-a337-224822901e08?action=share&creator=33532144&active-environment=33531996-50132d58-8867-4d6c-8cc6-7fa66ced8de4).
### Comptes
Toutes les routes sont protégées par AuthBasicGuard qui assure que les requêtes sont authentifiées.
Pour configurer l'authentification de base, vous devez définir les variables d'environnement suivantes dans votre fichier .env :
```
HTTP_BASIC_USER: Le nom d'utilisateur attendu pour l'authentification.
HTTP_BASIC_PASS: Le mot de passe attendu pour l'authentification.
```
#### Trouver des comptes par ID de patients principaux
- URL : ``/api/v1``
- Méthode : GET
- Paramètres de la requête :
- masterPatientId* : Un tableau d'ID de patients principaux, séparés par des virgules. (Array(string))
- Réponse : Un tableau des comptes correspondants.
#### Connexion
- URL : /api/v1/account/login
- Méthode : POST
- Corps de la requête :
- userId* : L'identifiant de l'utilisateur. (string)
- password* : Le mot de passe de l'utilisateur. (string)
- Réponse : Les détails du compte.
#### Connexion directe
- URL : /api/v1/account/directLogin
- Méthode : POST
- Corps de la requête :
- masterPatientId* : L'ID du patient principal. (number)
- birthDate**: La date de naissance du patient principal au format YYYY-MM-DD. (string)
- Réponse : Les détails du compte.
#### Création de compte
- URL : /api/v1/account/create
- Méthode : POST
- Corps de la requête : Un tableau de
- masterPatientId* : L'ID du patient principal. (number)
- firstName* : Le prénom de l'utilisateur. (string)
- lastName* : Le nom de famille de l'utilisateur. (string)
- dateOfBirth* : Date - La date de naissance de l'utilisateur.
- phoneNumber* : Le numéro de téléphone de l'utilisateur. (string)
- emailAddress* : L'adresse e-mail de l'utilisateur. (string)
- sex* : Le sexe de l'utilisateur. (string)
- Réponse : Confirmation de la création des comptes.
#### Mise à jour de compte
- URL : /api/v1/account/update
- Méthode : PUT
- Corps de la requête : Un tableau de
- id* : L'identifiant unique du compte à mettre à jour. (number)
- masterPatientId : L'ID du patient principal. (number)
- firstName : Le prénom de l'utilisateur. (string)
- lastName : Le nom de famille de l'utilisateur. (string)
- dateOfBirth : Date - La date de naissance de l'utilisateur.
- phoneNumber : Le numéro de téléphone de l'utilisateur. (string)
- emailAddress : L'adresse e-mail de l'utilisateur. (string)
- sex : Le sexe de l'utilisateur. (string)
- Réponse : Confirmation de la mise à jour des comptes.
#### Lister les comptes liés
- URL : /api/v1/account/linkedAccount/:masterPatientId
- Méthode : GET
- Paramètres du chemin :
- masterPatientId* : L'ID du patient principal. (number)
- Réponse : Un tableau des comptes liés.
#### Notifier les comptes liés
- URL : /api/v1/account/notifyLinkedAccounts/:masterPatientId
- Méthode : PUT
- Paramètres du chemin :
- masterPatientId* : L'ID du patient principal.
- Corps de la requête : Un tableau d'ID des comptes liés. (Array(number))
- Réponse : Confirmation de la notification des comptes liés.
### Mot de passe
Toutes les routes sont protégées par AuthBasicGuard qui assure que les requêtes sont authentifiées.
#### Création de mot de passe
- URL : /api/v1/password
- Méthode : POST
- Corps de la requête :
- userId* : L'identifiant unique de l'utilisateur. (string)
- dateOfBirth* : La date de naissance de l'utilisateur au format YYYY-MM-DD. (string)
- password* : Le mot de passe choisi par l'utilisateur. (string)
- passwordConfirmation* : Confirmation du mot de passe choisi, doit être identique au password. (string)
- Réponse : UserDto avec les détails de l'utilisateur.
#### Mise à jour de mot de passe
- URL : /api/v1/password
- Méthode : PUT
- Corps de la requête :
- userId* : L'identifiant unique de l'utilisateur. (string)
- dateOfBirth* : La date de naissance de l'utilisateur. (string)
- currentPassword* : Le mot de passe actuel de l'utilisateur. (string)
- password* : Le nouveau mot de passe choisi par l'utilisateur. (string)
- passwordConfirmation* : Confirmation du nouveau mot de passe, doit être identique au password. (string)
- Réponse : UserDto mis à jour.
#### Réinitialisation de mot de passe
- URL : /api/v1/password/reset
- Méthode : PUT
- Corps de la requête :
- userId* : L'identifiant unique de l'utilisateur. (string)
- dateOfBirth* : La date de naissance de l'utilisateur au format YYYY-MM-DD. (string)
- password* : Le mot de passe choisi par l'utilisateur. (string)
- passwordConfirmation* : Confirmation du mot de passe choisi, doit être identique au password. (string)
- Réponse : UserDto mis à jour.
#### Vérification d'utilisateur pour réinitialisation de mot de passe
- URL : /api/v1/password/resetUserCheck
- Méthode : GET
- Paramètres de la requête :
- email* : L'adresse e-mail de l'utilisateur, doit être une adresse e-mail valide. (string)
- dateOfBirth* : La date de naissance de l'utilisateur. (string)
- Réponse : UserResetPasswordDto avec les détails de l'utilisateur.
#### Vérification d'expiration de mot de passe
- URL : /api/v1/password/hasExpired
- Méthode : GET
- Authentification requise : Non
- Paramètres de la requête :
- userId : ID de l'utilisateur.
- passwordExpiryRule : Règle d'expiration du mot de passe.
- Réponse : Booléen indiquant si le mot de passe a expiré ou non.
# Backend
## Description
Le backend est le cœur de métier du projet. Il est en charge de l’organisation, de la récupération, du filtrage, de la consolidation et de l’exposition des données au Web.
## Prérequis
- Installation de Security
- Lancement de Security
## Mise en place de la base de donnée
### Étape 1 : Connexion au shell de MariaDB
```bash
sudo mysql -u root -p
```
### Etape 2 : Injection de la base de donnée
Dans le dossier sql. Copier l'intégralité du fichier db_master.sql (`Ctrl+Shift+P`) et coller son contenu dans le shell mariaDB.
## Configuration
Avant de lancer l'application, vous devez configurer les variables d'environnement nécessaires. Ces variables permettent de personnaliser l'application selon votre environnement de développement, de test ou de production.
### Création du fichier `.env`
À la racine du projet, créez un fichier nommé `.env`. Ce fichier sera utilisé pour stocker les variables d'environnement.
Le fichier `.env.security` se trouve dans `monespacebiogroup/config/dev/` (pour l'environnement de dev). Copiez le contenu du fichier `.env.backend` fourni. Ce fichier contient un modèle des variables d'environnement requises par l'application.
```plaintext
# Environment application
NODE_ENV=development
# App config
ERP_CONFIG_PATH=/etc/configs/erp
JWT_PRIVATE_KEY=.ssh/id_rsa
JWT_PUBLIC_KEY=.ssh/id_rsa_pem.pub
JWT_MFA_PRIVATE_KEY=.ssh/id_rsa_mfa
JWT_MFA_PUBLIC_KEY=.ssh/id_rsa_mfa_pem.pub
JWT_SIGNUP_PRIVATE_KEY=.ssh/id_rsa_signup
JWT_SIGNUP_PUBLIC_KEY=.ssh/id_rsa_signup_pem.pub
JWT_GUEST_PRIVATE_KEY=.ssh/id_rsa_guest
JWT_GUEST_PUBLIC_KEY=.ssh/id_rsa_guest_pem.pub
JWT_SIGNUP_EXPIRE='1h'
JWT_MFA_EXPIRE='1h'
JWT_GUEST_EXPIRE='30d'
JWT_EXPIRE='600s'
# Database settings
DB_TYPE=mariadb
DB_HOST=database
DB_LOGS_LEVEL=query
DB_MASTERKALI_NAME=masterKali
DB_DATAKALI_NAME=dataKali
DB_PORT=3306
DB_USER=dbuser
DB_PASSWORD=NniNki5nd9KDyf6B
# Security
SECURITY_HOST=security
SECURITY_PORT=3333
SECURITY_USER=server
SECURITY_PASSWORD=24L7D5$jBcRL
# RabbitMQ
RMQ_HOST=rabbitmq
RMQ_EXCHANGE_NAME=biogroup.messaging
RMQ_QUEUE_EMAIL_NAME=email
RMQ_QUEUE_TEXT_NAME=text
RMQ_PORT=5672
RMQ_USER=rmquser
RMQ_PASS=rGzpT2gtAlDG67nm
# Email Service
AZ_EMAIL_SERVICES_PRIMARY_CONNECTION_STRING=endpoint=https://mon-espace-biogroup-fr-com-srv.communication.azure.com/;accesskey=acwweLPKvJJDDrK/yhi+dFSipa2VDTwUYFDPRSp1W1pFsPi62FJES0IreAvx8vSR+R4eV8sVyeGcvc11wEpgJg==
AZ_EMAIL_SERVICES_MAIL_FROM=DoNotReply@biogroup.fr
# Links
NEW_ACCOUNT_LINK=https://monespace-dev.biogroup.fr/sso/signup
GUEST_LINK=https://monespace-dev.biogroup.fr/sso/guest
LOGIN_LINK=https://monespace-dev.biogroup.fr/sso/login
RESET_PASSWORD_LINK=https://monespace-dev.biogroup.fr/sso/update-password
STATIC_EMAIL_ASSET_LINK=https://monespace-dev.biogroup.fr/api/public/img
EMAIL_NEGATIVE_REVIEW_LINK=https://forms.biogroup-lcd.fr/index.php/379629?lang=fr
FACEBOOK_LINK=https://fr-fr.facebook.com/Biogroup.laboratoires/
TWITTER_LINK=https://twitter.com/biogroup_labo
LINKEDIN_LINK=https://www.linkedin.com/company/biogroup-laboratoires/
GDPR_LINK=https://biogroup.fr/politique-protection-donnees-personnelles/
# Text Message Service
TWILIO_ACCOUNT_SID=ACb4b3f69354eb97c93d69b96690395e27
TWILIO_AUTH_TOKEN=c9d53090d89b69061a716d1dfff4f3fe
TWILIO_VERIFY_SERVICE=VAe06f31465dfdcb5c5f7224de774c0bf4
# Payment
SOG_SITE_ID=97781193
SOG_KEY=pEwoxCzeRREkSren
SOG_CTX_MODE=TEST
SOG_URL_SUCCESS=https://monespace-dev.biogroup.fr/erp/:erpName/requests/:requestId/results
SOG_URL_SUCCESS_GUEST=https://monespace-dev.biogroup.fr/guest/result
SOG_URL_ERROR=https://monespace-dev.biogroup.fr
SOG_URL_CANCEL=https://monespace-dev.biogroup.fr
# ReCAPTCHA v2
RECAPTCHA_SECRET_KEY=6LcRWhspAAAAAJTtPK4nEBD743T29aPFQ2NYfmDk
# Meritis
#RECAPTCHA_SECRET_KEY=6Ld2dqsoAAAAAPhLGSYk5cPKXfHTP4LgIkgb1ZfH
```
## Lancement de l'application
```bash
npm install
npm run start:dev
```
Une fois l'application démarrée, vous pouvez accéder à l'API via `http://localhost:3000` (ou le port configuré dans votre fichier `.env`).
## Point de terminaison
### Compte
#### Connexion
- Endpoint: /api/v1/user/login
- Method: POST
- Guard: LocalAuthGuard
- Request Body: Aucun (l'authentification est gérée par le LocalAuthGuard).
- Response: Retourne les informations de l'utilisateur authentifié avec ou sans workflow MFA, selon la configuration.
#### Connexion directe
- Endpoint: /api/v1/user/directLogin
- Method: POST
- Request Body:
- token* : Le jeton unique d'identification. (string)
- birthDate* : La date de naissance de l'utilisateur pour vérification supplémentaire. (string)
- Response: L'utilisateur est authentifié directement avec un workflow MFA si activé.
#### Récupèrer le profil de l'utilisateur
- Endpoint: /api/v1/user/me
- Method: GET
- Guard: JwtAuthGuard
- Request: Aucun corps de requête nécessaire.
- Response: Les informations de profil de l'utilisateur authentifié.
#### Notifier les comptes liés
- Endpoint: /api/v1/user/notifyLinkedAccounts
- Method: PUT
- Guard: JwtAuthGuard
- Request Body:
- linkedAccountsIds : Un tableau des ID des comptes liés. (Array(number))
- Response: L'utilisateur est ré-authentifié.
#### Vérifier la validité du lien d'authentification
- Endpoint: /api/v1/user/authLinkValidity
- Method: POST
- Request Body:
- token : Le jeton d'authentification à vérifier.(string)
- Response: Vérifie la validité du jeton d'authentification.
#### Vérifier la validité du jeton MFA
- Endpoint: /api/v1/user/mfaTokenValidity
- Method: POST
- Request Body:
- token : Le jeton d'authentification à vérifier.(string)
- Response: Retourne les derniers chiffres du numéro de téléphone associé au compte, si le jeton est valide.
#### Mise à jour de mot de passe
- Endpoint: /api/v1/user/updatePassword
- Method: PUT
- Guard: JwtAuthGuard
- Request Body:
- token* : Le jeton unique d'identification. (string)
- dateOfBirth* : La date de naissance de l'utilisateur. (string)
- password* : Le mot de passe choisi par l'utilisateur. (string)
- passwordConfirmation* : Confirmation du mot de passe choisi, doit être identique au password. (string)
- Response: Confirmation de la mise à jour du mot de passe.
#### Réinitialiser un mot de passe
- Endpoint: /api/v1/user/resetPassword
- Method: PUT
- Request Body:
- token* : Le jeton de réinitialisation. (string)
- dateOfBirth* : La date de naissance pour vérification. (string)
- password* : Le nouveau mot de passe choisi par l'utilisateur. (string)
- passwordConfirmation* : Confirmation du nouveau mot de passe, doit être identique au password. (string)
- Response: Confirmation de la réinitialisation du mot de passe.
#### Initialiser un mot de passe
- Endpoint: /api/v1/user/init
- Method: POST
- Request Body:
- token* : Le jeton unique d'identification. (string)
- dateOfBirth* : La date de naissance de l'utilisateur. (string)
- password* : Le mot de passe choisi par l'utilisateur. (string)
- passwordConfirmation* : Confirmation du mot de passe choisi, doit être identique au password. (string)
- Response: Confirmation de l'initialisation du mot de passe.
# Silaccess
Silaccess est une API side-car conçue pour sécuriser les interactions avec la base de données de l'ERP Kalisil. Elle agit comme une couche anti-corruption, contrôlant le trafic et les transactions pour empêcher l'accès direct non sécurisé.
Avant de démarrer l'application, vous devez configurer les variables d'environnement requises. Créez un fichier `.env` à la racine du projet et ajoutez les informations suivantes :
```env
# App config
API_KEY=9Qz5Hgf27vtFpxFl
# Db config
DB_USER=your_user
DB_PASSWORD=your_pass
DB_TYPE=mariadb
DB_HOST=localhost
DB_PORT=3306
DB_NAME=kalilab
DB_TRACE_NAME=kalilabTrace
# Dedalus Config
DEDALUS_HOST=10.213.19.1
DEDALUS_PORT=443
DEDALUS_USERNAME=biogroupweb
DEDALUS_PASSWORD="h5!Z4g9I=+Pt"
PORT=3001
```
Remplacez `your_user` et `your_pass` par vos identifiants de connexion à la base de données.
Pour consommer les routes de l'API silaccess, utilisez l'API_KEY fournie dans le fichier .env comme valeur d'en-tête X-API-KEY pour l'authentification.
```
GET /some-protected-route
X-API-KEY: 9Qz5Hgf27vtFpxFl
```
Démarrage de l'application
```
npm install
npm run start:dev
```
Une fois l'application démarrée, vous pouvez accéder à l'API via `http://localhost:3001` (ou le port configuré dans votre fichier `.env`).
# Simulator
À des fins de développement, il est possible de simuler une base de données Kalisil afin d'éviter le traitement de données personnelles et médicales. Cette fonctionnalité est destinée à être utilisée uniquement dans des environnements locaux et de test.
### Lancement du simulateur
Pour lancer le simulateur, exécutez les commandes suivantes dans le terminal de MariaDB:
1. Création des bases de données de test:
```bash
source simulator/sql/create_db_test.sql;
source simulator/sql/create_db_trace.sql;
```
1. Démarrage du mode développement:
```bash
npm install
npm run start:dev
```
Ces étapes permettent de configurer et de démarrer le simulateur de base de données pour le développement sans manipuler de données réelles.
# Fonctionnement
## Cron JOB
Veuillez trouver ci-dessous le diagramme de séquence illustrant le processus d'aggrégation, de mise à jour de patients, et de mise à jour de requêtes. Ce diagramme offre une vue d'ensemble de l'interaction entre les différents composants du système.
### Aggrégation de patients
- **Méthode :** `startAggregateJob`
- **Fréquence :** Toutes les 60 secondes
Cette fonction réalise des opérations complexes incluant la récupération et l'enrichissement des données des patients, le regroupement par un identifiant unique (hash), la création et l'enregistrement de nouvelles entités patients et de leurs associations dans la base de données. Elle prend également en charge la création de comptes utilisateurs pour les nouveaux patients, assurant l'intégration et la synchronisation des données patients entre divers systèmes ERP et le système central.

### Mise à jour de patients
- **Méthode :** `startCheckForPatientUpdate`
- **Fréquence :** Toutes les 50 secondes
La fonction `updateNewRequests()` est essentielle pour le suivi et la mise à jour des états des demandes dans le système de gestion des données. Elle veille à ce que les relations de tutelle soient gérées correctement suivant les mises à jour, informe les parties concernées des modifications importantes et notifie les patients et leurs gardiens lorsque les résultats sont disponibles pour consultation.

### Mise à jour de requêtes
- **Méthode :** `startUpdateRequestsJob`
- **Fréquence :** Toutes les 40 secondes
La fonction `collectPatientUpdate()` est conçue pour maintenir les informations des patients à jour et cohérentes dans le système de gestion de santé. Elle synchronise régulièrement les données avec celles des systèmes ERP, crée de nouveaux enregistrements de patients si nécessaire, met à jour les informations existantes, et propage ces mises à jour aux données de sécurité utilisateur, assurant ainsi l'intégrité et la sécurité des données patient dans l'ensemble du système.

## Parcours de l'utilisateur
Un diagramme de flux peut montrer le parcours de l'utilisateur depuis la demande d'envoi du code MFA jusqu'à la vérification de ce code

## Intégration des Services Azure et Twilio
Le Backend utilise les services Azure et Twilio pour l'envoi d'emails et de SMS respectivement. Ci-dessous, vous trouverez un diagramme illustrant les points d'intégration de ces services .
