From e7a5ada5adadbf95dae761775af6b9ce1045ae7f Mon Sep 17 00:00:00 2001
From: "narindra.rajohnso" <narindra-hasimanjaka-david.rajohnson@etu.hesge.ch>
Date: Tue, 13 Jun 2023 15:23:37 +0200
Subject: [PATCH] add all API documentation

---
 Documentation/docs/api/add_question.md       |  95 +++++++
 Documentation/docs/api/add_user.md           | 104 +++++++
 Documentation/docs/api/delete_question.md    |  57 ++++
 Documentation/docs/api/delete_user.md        |  56 ++++
 Documentation/docs/api/get_admin_info.md     |  72 +++++
 Documentation/docs/api/get_questions.md      | 111 ++++++++
 Documentation/docs/api/get_user_info.md      |  69 ++++-
 Documentation/docs/api/get_users.md          | 109 ++++++++
 Documentation/docs/api/update_question.md    |  92 +++++++
 Documentation/docs/api/update_user.md        | 116 ++++++++
 Documentation/docs/api/user_connect.md       |  77 +++++-
 Documentation/docs/api/user_create.md        |  68 ++++-
 Documentation/example_doc/file_management.md | 100 -------
 Documentation/example_doc/index.md           |  90 ------
 Documentation/example_doc/logging.md         | 214 ---------------
 Documentation/example_doc/mesh_process.md    | 273 -------------------
 Documentation/example_doc/migrations.md      |  13 -
 Documentation/example_doc/models.md          |  24 --
 Documentation/example_doc/prod_config.md     | 127 ---------
 Documentation/example_doc/rest_framework.md  |  49 ----
 Documentation/example_doc/serialization.md   |  26 --
 Documentation/example_doc/view_management.md |  51 ----
 Documentation/mkdocs.yml                     |  24 +-
 23 files changed, 1036 insertions(+), 981 deletions(-)
 create mode 100644 Documentation/docs/api/add_question.md
 create mode 100644 Documentation/docs/api/add_user.md
 create mode 100644 Documentation/docs/api/delete_question.md
 create mode 100644 Documentation/docs/api/delete_user.md
 create mode 100644 Documentation/docs/api/get_admin_info.md
 create mode 100644 Documentation/docs/api/get_questions.md
 create mode 100644 Documentation/docs/api/get_users.md
 create mode 100644 Documentation/docs/api/update_question.md
 create mode 100644 Documentation/docs/api/update_user.md
 delete mode 100644 Documentation/example_doc/file_management.md
 delete mode 100644 Documentation/example_doc/index.md
 delete mode 100644 Documentation/example_doc/logging.md
 delete mode 100644 Documentation/example_doc/mesh_process.md
 delete mode 100644 Documentation/example_doc/migrations.md
 delete mode 100644 Documentation/example_doc/models.md
 delete mode 100644 Documentation/example_doc/prod_config.md
 delete mode 100644 Documentation/example_doc/rest_framework.md
 delete mode 100644 Documentation/example_doc/serialization.md
 delete mode 100644 Documentation/example_doc/view_management.md

diff --git a/Documentation/docs/api/add_question.md b/Documentation/docs/api/add_question.md
new file mode 100644
index 0000000..a0387a0
--- /dev/null
+++ b/Documentation/docs/api/add_question.md
@@ -0,0 +1,95 @@
+# POST /api/v1/admins/:admin/questions
+
+Permet de créer une nouvelle question. Les détails de la question sont envoyés dans le corps de la requête. Ici l'administrateur doit être authentifié pour pouvoir créer l'utilisateur.
+
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin/questions`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <span class="bg-blue-200">REQUIRED</span>   | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+## JSON body parameters
+
+| Nom                                                              | Type     | Description                                                     |
+| ---------------------------------------------------------------- | -------- | --------------------------------------------------------------- |
+| `question` <br><span class="bg-blue-200">REQUIRED</span>         | string   | L'intitulé de la question                                       |
+| `possibleResponse` <br><span class="bg-blue-200">REQUIRED</span> | string[] | Liste des réponses possibles                                    |
+| `correctResponse` <br><span class="bg-blue-200">REQUIRED</span>  | int      | Indice de la bonne réponse dans la liste des réponses possibles |
+| `category` <br><span class="bg-blue-200">REQUIRED</span>         | string   | La catégorie de la question                                     |
+
+
+## Path parameters
+
+| Nom                                               | Type   | Description                                                                                                                             |
+| ------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
+| `admin` <span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur de l'admin qui est vérifié par le serveur, si elle n'existe pas ou ce n'est pas un administrateur une erreur survient |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+addQuestion(
+    formDataQuestion: FormGroup<any> // (1)!
+  ) {
+    let generateId: number;
+    let possibleResponse=this.correctPossibleResponseArray(formDataQuestion.value.possibleResponse);
+    let questionInfo=new Question(
+      parseInt(Math.random.toString()),
+      formDataQuestion.value.question,
+      possibleResponse,
+      parseInt(formDataQuestion.value.correctResponse),
+      formDataQuestion.value.category
+    );
+    return this.httpClient.post<any>('http://localhost:30992/api/v1/admins/'+this.username+'/questions', questionInfo)
+      .pipe(
+        switchMap((resDonnee) => {
+          generateId = resDonnee.new_question.id;
+          return this.questions;
+        }),
+        take(1),
+        map((questions) => {
+          questionInfo.id = generateId;
+          this._questions.next(questions.concat(questionInfo));
+          return questionInfo;
+        })
+      );
+  }
+```
+
+1. `formDataQuestions` contient ici, toutes les informations concernant la question à créer
+
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "new_question": {
+        "id": 17,
+        "question": "Comment cela marche t-il?",
+        "possibleResponse": [
+            "Par télépathie",
+            "A l'aveugle",
+            "A l'aide de tes connaissances"
+        ],
+        "correctResponse": "A l'aide de tes connaissances",
+        "category": "Comment"
+    }
+}
+```
+
+## Response fields
+
+| Nom                | Type     | Description                                                     |
+| ------------------ | -------- | --------------------------------------------------------------- |
+| `id`               | int      | Identifiant unique de la question                               |
+| `question`         | string   | L'intitulé de la question                                       |
+| `possibleResponse` | string[] | Liste des réponses possibles                                    |
+| `correctResponse`  | int      | Indice de la bonne réponse dans la liste des réponses possibles |
+| `category`         | string   | La catégorie de la question                                     |
+
diff --git a/Documentation/docs/api/add_user.md b/Documentation/docs/api/add_user.md
new file mode 100644
index 0000000..82bb1f2
--- /dev/null
+++ b/Documentation/docs/api/add_user.md
@@ -0,0 +1,104 @@
+# POST /api/v1/admins/:admin/users
+
+Permet de créer un compte utilisateur ou administrateur, avec une vérification dans la base de données de l'existance du nom d'utilisateur. Les détails de l'utilisateur sont envoyés dans le corps de la requête. Ici l'administrateur doit être authentifié pour pouvoir créer l'utilisateur.
+
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin/users`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <br><span class="bg-blue-200">REQUIRED</span>   | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+## JSON body parameters
+
+| Nom                                                     | Type   | Description                                                  |
+| ------------------------------------------------------- | ------ | ------------------------------------------------------------ |
+| `username` <br><span class="bg-blue-200">REQUIRED</span>    | string | Nom d'utilisateur unique pour le compte                      |
+| `password` <br><span class="bg-blue-200">REQUIRED</span>    | string | Mot de passe du compte                                       |
+| `firstname` <br><span class="bg-blue-200">REQUIRED</span>   | string | Prénom de l'utilisateur                                      |
+| `lastname` <br><span class="bg-blue-200">REQUIRED</span>    | string | Nom de famille de l'utilisateur                              |
+| `email` <br><span class="bg-blue-200">REQUIRED</span>       | string | Adresse e-mail de l'utilisateur                              |
+| `accountType` <br><span class="bg-blue-200">REQUIRED</span> | string | Type de compte (utilisateur(**0**) ou administrateur(**1**)) |
+
+
+## Path parameters
+
+| Nom                                               | Type   | Description                                                                                                                             |
+| ------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
+| `admin` <br><span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur de l'admin qui est vérifié par le serveur, si elle n'existe pas ou ce n'est pas un administrateur une erreur survient |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+addUser(
+    formDataUsers: FormGroup<any> // (1)!
+  ) {
+
+    let userInfo=formDataUsers.value;
+    userInfo.password = this.loginService.hashPassword(userInfo.password);
+    if(userInfo.accountType === "User")
+      userInfo.accountType = 0;
+    else
+      userInfo.accountType = 1;
+    userInfo.password=this.loginService.hashPassword(userInfo.password);
+    return this.httpClient.post<any>('http://localhost:30992/api/v1/admins/'+this.username+'/users', userInfo)
+      .pipe(
+        switchMap(() => {
+          return this.users;
+        }),
+        take(1),
+        tap((users) => {
+            this.changeTypeKey(userInfo); // (2)!
+            userInfo.password="CONFIDENTIAL!!!";
+            this._users.next(users.concat(userInfo));
+        })
+      );
+  }
+```
+
+1. `formDataUsers` contient ici, toutes les informations concernant l'utilisateur à créer
+2. Permet de changer la clé `accountType`(0 ou 1) en `type`("user" ou "admin") pour pouvoir le stocker
+```typescript
+changeTypeKey(userInfo:any){
+    for (const k in userInfo) {
+      if (k === "accountType") {
+        userInfo["type"] = userInfo[k];
+        delete userInfo[k];
+      }
+    }
+    userInfo.type=userInfo.type === 0 ? "user":"admin";
+}
+```
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "new_user": {
+        "username": "new78",
+        "lastname": "rajohn",
+        "firstname": "dav",
+        "email": "test@titu.ch"
+    }
+}
+```
+
+!!! info "Note"
+
+    `new_user` si on crée un utilisateur sinon `new_admin` si on crée un administrateur
+
+## Response fields
+
+| Nom         | Type   | Description                             |
+| ----------- | ------ | --------------------------------------- |
+| `username`  | string | Nom d'utilisateur unique pour le compte |
+| `lastname`  | string | Nom de famille de l'utilisateur         |
+| `firstname` | string | Prénom de l'utilisateur                 |
+| `email`     | string | Email de l'utilisateur                  |
+
diff --git a/Documentation/docs/api/delete_question.md b/Documentation/docs/api/delete_question.md
new file mode 100644
index 0000000..dbca9ca
--- /dev/null
+++ b/Documentation/docs/api/delete_question.md
@@ -0,0 +1,57 @@
+# DELETE /api/v1/admins/:admin/questions/:question_id
+
+Permet de supprimer une question. Ici l'administrateur doit être authentifié pour pouvoir modifier l'utilisateur. 
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin/questions/:question_id`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <span class="bg-blue-200">REQUIRED</span>   | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+
+## Path parameters
+
+| Nom                                                         | Type   | Description                                                                                                                             |
+| ----------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
+| `admin` <br><span class="bg-blue-200">REQUIRED</span>       | string | Nom d'utilisateur de l'admin qui est vérifié par le serveur, si elle n'existe pas ou ce n'est pas un administrateur une erreur survient |
+| `question_id` <br><span class="bg-blue-200">REQUIRED</span> | string | Identifiant de la question à supprimer qui est vérifié par le serveur, si elle n'existe pas une erreur survient                         |
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+deleteQuestion(id: number) {
+    return this.httpClient
+      .request('delete',
+        `http://localhost:30992/api/v1/admins/${this.username}/questions/${id}`
+      )
+      .pipe(switchMap(() => {
+          return this.questions;
+        }),
+        take(1),
+        tap((questions) => {
+          this._questions.next(questions.filter((q) => q.id !== id));
+        })
+      );
+
+  }
+```
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "message": "The question 17 is successfully deleted"
+}
+```
+
+## Response fields
+
+| Nom       | Type   | Description                                   |
+| --------- | ------ | --------------------------------------------- |
+| `message` | string | Spécifie que la question a bien été supprimer |
+
diff --git a/Documentation/docs/api/delete_user.md b/Documentation/docs/api/delete_user.md
new file mode 100644
index 0000000..2023fca
--- /dev/null
+++ b/Documentation/docs/api/delete_user.md
@@ -0,0 +1,56 @@
+# DELETE /api/v1/admins/:admin/users/:username
+
+Permet de supprimer un utilisateur, avec une vérification dans la base de données de l'existance du nom d'utilisateur. Ici l'administrateur doit être authentifié pour pouvoir modifier l'utilisateur. 
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin/users/:username`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <span class="bg-blue-200">REQUIRED</span>   | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+
+## Path parameters
+
+| Nom                                                      | Type   | Description                                                                                                                             |
+| -------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
+| `admin` <br><span class="bg-blue-200">REQUIRED</span>    | string | Nom d'utilisateur de l'admin qui est vérifié par le serveur, si elle n'existe pas ou ce n'est pas un administrateur une erreur survient |
+| `username` <br><span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur de l'utilisateur à supprimer qui est vérifié par le serveur, si elle n'existe pas une erreur survient                 |
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+deleteUser(username: string) {
+    return this.httpClient
+      .request('delete',
+        `http://localhost:30992/api/v1/admins/${this.username}/users/${username}`
+      )
+      .pipe(switchMap(() => {
+          return this.users;
+        }),
+        take(1),
+        tap((users) => {
+          this._users.next(users.filter((u) => u.username !== username));
+        })
+      );
+  }
+```
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "message": "The user new78 is successfully deleted"
+}
+```
+
+## Response fields
+
+| Nom       | Type   | Description                                     |
+| --------- | ------ | ----------------------------------------------- |
+| `message` | string | Spécifie que l'utilisateur a bien été supprimer |
+
diff --git a/Documentation/docs/api/get_admin_info.md b/Documentation/docs/api/get_admin_info.md
new file mode 100644
index 0000000..f7a7d6e
--- /dev/null
+++ b/Documentation/docs/api/get_admin_info.md
@@ -0,0 +1,72 @@
+# GET /api/v1/admins/:admin
+
+Permet de récupérer les informations d'un administrateur qui est actuellement authentifié. Si cela n'est pas le cas les informations ne sont pas transmises.
+
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <span class="bg-blue-200">REQUIRED</span>   | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+
+## Path parameters
+
+| Nom                                                  | Type   | Description                                                                                |
+| ---------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------ |
+| `username` <span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur qui est vérifié par le serveur, si elle n'existe pas une erreur survient |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+this.httpClient.get<any>('http://localhost:30992/api/v1/admins/' + this.username).subscribe(
+        response => {
+            console.log(response.info_user);
+            if(response.info_user.type === "user"){
+                alert("Vous n'avez pas les autorisations nécessaires pour accéder à ses ressouces, vous allez être redirigé vers la plateforme du quizz");
+                this.router.navigate(['/'+this.manageService.username+'/play']);
+            }
+        },
+        error => {
+            if(error.error.message === "Invalid token user"){
+                alert("Votre session a expiré, veuillez vous reconnecter");
+                this.router.navigate(['/', 'login']);
+            }
+            if(error.error.message === "Invalid token"){
+                alert("Veuillez vous connecter pour pouvoir accéder à cette page");
+                this.router.navigate(['/', 'login']);
+            }
+        }
+      );
+```
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "info_user": {
+        "username": "admin1",
+        "firstname": "un",
+        "lastname": "admin",
+        "email": "admin1@titu.ch",
+        "type": "admin"
+    }
+}
+```
+
+## Response fields
+
+| Nom         | Type   | Description                                                                               |
+| ----------- | ------ | ----------------------------------------------------------------------------------------- |
+| `username`  | string | Nom d'utilisateur unique pour le compte                                                   |
+| `firstname` | string | Prénom de l'utilisateur                                                                   |
+| `lastname`  | string | Nom de famille de l'utilisateur                                                           |
+| `email`     | string | Email de l'utilisateur                                                                    |
+| `type`      | string | Le type de compte(`admin` ou `user`). Permet de vérifier que c'est bien un administrateur |
+
diff --git a/Documentation/docs/api/get_questions.md b/Documentation/docs/api/get_questions.md
new file mode 100644
index 0000000..789f618
--- /dev/null
+++ b/Documentation/docs/api/get_questions.md
@@ -0,0 +1,111 @@
+# GET /api/v1/admins/:admin/questions
+
+Permet de récupérer tous les questions.
+
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin/questions`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <span class="bg-blue-200">REQUIRED</span>   | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+
+## Path parameters
+
+| Nom                                               | Type   | Description                                                                                                                             |
+| ------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
+| `admin` <span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur de l'admin qui est vérifié par le serveur, si elle n'existe pas ou ce n'est pas un administrateur une erreur survient |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+interface QuestionData {
+  id: number;
+  question: string;
+  possibleResponse: string[];
+  correctResponse: number;
+  category: string;
+  type: string;
+}
+
+private _questions = new BehaviorSubject<Question[]>([]);
+
+fetchQuestions() {
+    return this.httpClient
+      .get<{ questions: QuestionData[] }>(
+        'http://localhost:30992/api/v1/admins/' + this.username + '/questions'
+      )
+      .pipe(
+        map((resDonnee) => {
+          const questionsData=resDonnee.questions;
+          const questions:Question[] = [];
+          questionsData.forEach((question)=>{
+            questions.push(
+              new Question(
+                question.id,
+                question.question,
+                question.possibleResponse,
+                question.correctResponse,
+                question.category
+              )
+            )
+          })
+          return questions;
+        }),
+        tap((questions) => {
+          this._questions.next(questions);
+        })
+      );
+
+  }
+```
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "questions": [
+        {
+            "id": 7,
+            "question": "Quelle est la capitale de la France ?",
+            "possibleResponse": [
+                "Madrid",
+                "Rome",
+                "Berlin",
+                "Paris"
+            ],
+            "correctResponse": 3,
+            "category": "Géographie"
+        },
+        {
+            "id": 8,
+            "question": "En quelle année a eu lieu la Révolution française ?",
+            "possibleResponse": [
+                "1789",
+                "1848",
+                "1917",
+                "1945"
+            ],
+            "correctResponse": 0,
+            "category": "Histoire"
+        }
+    ]
+}
+```
+
+## Response fields
+
+| Nom                | Type     | Description                                                     |
+| ------------------ | -------- | --------------------------------------------------------------- |
+| `id`               | int      | Identifiant unique de la question                               |
+| `question`         | string   | L'intitulé de la question                                       |
+| `possibleResponse` | string[] | Liste des réponses possibles                                    |
+| `correctResponse`  | int      | Indice de la bonne réponse dans la liste des réponses possibles |
+| `category`         | string   | La catégorie de la question                                     |
+
diff --git a/Documentation/docs/api/get_user_info.md b/Documentation/docs/api/get_user_info.md
index 873d278..8447ba1 100644
--- a/Documentation/docs/api/get_user_info.md
+++ b/Documentation/docs/api/get_user_info.md
@@ -1 +1,68 @@
-# GET /api/v1/users/:username
\ No newline at end of file
+# GET /api/v1/users/:username
+
+
+Permet de récupérer les informations d'un utilisateur qui est actuellement authentifié. Si cela n'est pas le cas les informations ne sont pas transmises.
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/users/:username`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <span class="bg-blue-200">REQUIRED</span>   | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+
+## Path parameters
+
+| Nom                                                  | Type   | Description                                                                                |
+| ---------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------ |
+| `username` <span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur qui est vérifié par le serveur, si elle n'existe pas une erreur survient |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+this.httpClient.get<any>('http://localhost:30992/api/v1/users/' + this.username).subscribe(
+         response => {
+          this._userInfo = new Session(
+            response.access_user.username,
+            response.access_user.firstname,
+            response.access_user.lastname
+          );
+        },
+        error => {
+          console.log(error.error.message);
+        }
+      );
+```
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "access_user": {
+        "type": "admin",
+        "username": "admin1",
+        "firstname": "un",
+        "lastname": "admin",
+        "iat": 1686651793
+    }
+}
+```
+
+!!! info "Note"
+
+    `iat` correspond ici à la date et l'heure de création du token. On peut l'utiliser pour vérifier la validité temporelle du token.
+## Response fields
+
+| Nom         | Type   | Description                             |
+| ----------- | ------ | --------------------------------------- |
+| `type`      | string | Le type de compte(`admin` ou `user`)    |
+| `username`  | string | Nom d'utilisateur unique pour le compte |
+| `firstname` | string | Prénom de l'utilisateur                 |
+| `lastname`  | string | Nom de famille de l'utilisateur         |
+| `iat`       | string | Date et heure de création du token      |
+
diff --git a/Documentation/docs/api/get_users.md b/Documentation/docs/api/get_users.md
new file mode 100644
index 0000000..b1c1e3b
--- /dev/null
+++ b/Documentation/docs/api/get_users.md
@@ -0,0 +1,109 @@
+# GET /api/v1/admins/:admin/users
+
+Permet de récupérer tous les utilisateurs.
+
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin/users`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <span class="bg-blue-200">REQUIRED</span>   | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+
+## Path parameters
+
+| Nom                                               | Type   | Description                                                                                                                             |
+| ------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
+| `admin` <span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur de l'admin qui est vérifié par le serveur, si elle n'existe pas ou ce n'est pas un administrateur une erreur survient |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+interface UserData {
+  username: string;
+  firstname: string;
+  lastname: string;
+  email: string;
+  type: string;
+}
+
+private _users = new BehaviorSubject<User[]>([]);
+
+
+fetchUsers() {
+    return this.httpClient
+      .get<{ users: UserData[] }>(
+        'http://localhost:30992/api/v1/admins/' + this.username + '/users'
+      )
+      .pipe(
+        map((resDonnee) => {
+          const usersData=resDonnee.users;
+          const users:User[] = [];
+          usersData.forEach((user)=>{
+            users.push(
+              new User(
+                user.username,
+                user.firstname,
+                user.lastname,
+                user.email,
+                user.type,
+                "CONFIDENTIAL!!!"
+              )
+            )
+          })
+          return users;
+        }),
+        tap((users) => {
+          this._users.next(users);
+        })
+      );
+
+  }
+```
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "users": [
+        {
+            "username": "test1",
+            "firstname": "test",
+            "lastname": "1",
+            "email": "test1@gsd",
+            "type": "user"
+        },
+        {
+            "username": "test3",
+            "firstname": "test",
+            "lastname": "3",
+            "email": "test3@gf",
+            "type": "user"
+        },
+        {
+            "username": "admin1",
+            "firstname": "un",
+            "lastname": "admin",
+            "email": "admin1@titu.ch",
+            "type": "admin"
+        }
+    ]
+}
+```
+
+## Response fields
+
+| Nom         | Type   | Description                                                                               |
+| ----------- | ------ | ----------------------------------------------------------------------------------------- |
+| `username`  | string | Nom d'utilisateur unique pour le compte                                                   |
+| `firstname` | string | Prénom de l'utilisateur                                                                   |
+| `lastname`  | string | Nom de famille de l'utilisateur                                                           |
+| `email`     | string | Email de l'utilisateur                                                                    |
+| `type`      | string | Le type de compte(`admin` ou `user`). Permet de vérifier que c'est bien un administrateur |
+
diff --git a/Documentation/docs/api/update_question.md b/Documentation/docs/api/update_question.md
new file mode 100644
index 0000000..8a987cd
--- /dev/null
+++ b/Documentation/docs/api/update_question.md
@@ -0,0 +1,92 @@
+# PUT /api/v1/admins/:admin/questions/:question_id
+
+Permet de modifier une question. Les données à modifier sont envoyés dans le corps de la requête. Ici l'administrateur doit être authentifié pour pouvoir modifier la question. 
+
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin/questions/:question_id`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint   | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <br><span class="bg-blue-200">REQUIRED</span> | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+## JSON body parameters
+
+| Nom                                                                                       | Type     | Description                                                     |
+| ----------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------- |
+| `question` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span>         | string   | L'intitulé de la question                                       |
+| `possibleResponse` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span> | string[] | Liste des réponses possibles                                    |
+| `correctResponse` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span>  | int      | Indice de la bonne réponse dans la liste des réponses possibles |
+| `category` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span>         | string   | La catégorie de la question                                     |
+
+## Path parameters
+
+| Nom                                                         | Type   | Description                                                                                                                             |
+| ----------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
+| `admin` <br><span class="bg-blue-200">REQUIRED</span>       | string | Nom d'utilisateur de l'admin qui est vérifié par le serveur, si elle n'existe pas ou ce n'est pas un administrateur une erreur survient |
+| `question_id` <br><span class="bg-blue-200">REQUIRED</span> | string | Identifiant de la question à modifier qui est vérifié par le serveur, si elle n'existe pas une erreur survient                          |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+updateQuestion(id: number, question: string, possibleResponse: string[], correctResponse: number, category: string) {
+    let editQuestions: Question[];
+    return this.questions.pipe(
+      take(1),
+      switchMap((questions) => {
+        if (!questions || questions.length <= 0) {
+          return this.fetchQuestions();
+        }
+        else {
+          return of(questions);
+        }
+
+      }),
+      switchMap(questions => { // (1)!
+        const idQuestionSearch = questions.findIndex(
+          (q) => q.id === id
+        );
+        editQuestions = [...questions];
+        editQuestions[idQuestionSearch] = new Question(
+          id,
+          question,
+          this.correctPossibleResponseArray(possibleResponse),
+          correctResponse,
+          category
+        );
+        return this.httpClient.put(
+          `http://localhost:30992/api/v1/admins/${this.username}/questions/${id}`,
+          { ...editQuestions[idQuestionSearch] }
+        );
+
+      }),
+      tap(() => {
+        this._questions.next(editQuestions);
+      })
+    );
+  }
+```
+
+1. `switchMap` permet de gérer de manière efficace les opérations asynchrones lors de la modification d'un utilisateur, en s'assurant que seule la dernière opération est prise en compte et en évitant les conflits ou les résultats indésirables. Ici elle sert surtout à mettre à jour automatiquement la liste des questions affichée à l'écran chaque fois qu'une question est modifié.
+
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "message": "Question 17 updated"
+}
+```
+
+
+## Response fields
+
+| Nom       | Type   | Description                                 |
+| --------- | ------ | ------------------------------------------- |
+| `message` | string | Spécifie que la question a bien été modifié |
+
diff --git a/Documentation/docs/api/update_user.md b/Documentation/docs/api/update_user.md
new file mode 100644
index 0000000..42c6f8c
--- /dev/null
+++ b/Documentation/docs/api/update_user.md
@@ -0,0 +1,116 @@
+# PUT /api/v1/admins/:admin/users/:username
+
+Permet de modifier les informations d'un utilisateur, avec une vérification dans la base de données de l'existance du nom d'utilisateur. Les données à modifier sont envoyés dans le corps de la requête. Ici l'administrateur doit être authentifié pour pouvoir modifier l'utilisateur. 
+
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/admins/:admin/users/:username`
+
+## Authentication
+
+| Méthode d'authentification supporté par ce endpoint   | [OAuth 2.0 Bearer Token](https://oauth.net/2/bearer-tokens/)                                                                                                                                   |
+| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `token` <br><span class="bg-blue-200">REQUIRED</span> | Générer par le serveur lors de l'authentification, protéger par une clé qui est présente du côté du serveur. Ce token est envoyé par le client dans son header (Authorization: Bearer `token`) |
+
+
+## JSON body parameters
+
+| Nom                                                                                  | Type   | Description                                                                                                                                             |
+| ------------------------------------------------------------------------------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `username` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span>    | string | Nom d'utilisateur unique pour le compte                                                                                                                 |
+| `password` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span>    | string | Mot de passe du compte                                                                                                                                  |
+| `firstname` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span>   | string | Prénom de l'utilisateur                                                                                                                                 |
+| `lastname` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span>    | string | Nom de famille de l'utilisateur                                                                                                                         |
+| `email` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span>       | string | Adresse e-mail de l'utilisateur                                                                                                                         |
+| `accountType` <br><span class="border border-blue-500 text-blue-500">OPTIONAL</span> | string | Type de compte (utilisateur(**0**) ou administrateur(**1**)). Ici si on modifie l'administrateur actuel, une erreur survient si ce champ n'est pas vide |
+
+
+## Path parameters
+
+| Nom                                                      | Type   | Description                                                                                                                             |
+| -------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
+| `admin` <br><span class="bg-blue-200">REQUIRED</span>    | string | Nom d'utilisateur de l'admin qui est vérifié par le serveur, si elle n'existe pas ou ce n'est pas un administrateur une erreur survient |
+| `username` <br><span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur de l'utilisateur à modifier qui est vérifié par le serveur, si elle n'existe pas une erreur survient                  |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+updateUser(username: string, new_username: string, firstname: string, lastname: string, email: string, type: string, password?: string) {
+    let editUsers: User[];
+    return this.users.pipe(
+      take(1),
+      switchMap((users) => {
+        if (!users || users.length <= 0) {
+          return this.fetchUsers();
+        }
+        else {
+          return of(users);
+        }
+
+      }),
+      switchMap(users => { // (1)!
+        const usernameSearch = users.findIndex(
+          (u) => u.username === username
+        );
+        editUsers = [...users];
+        const pastUser = editUsers[usernameSearch];
+        console.log("type:", type);
+        editUsers[usernameSearch] = new User(
+          new_username,
+          firstname,
+          lastname,
+          email,
+          type==="User"?"user":"admin",
+          password?this.loginService.hashPassword(password):pastUser.password
+        );
+        console.log(editUsers[usernameSearch]);
+        let userEdited=this.changeAccountTypeKey(editUsers[usernameSearch]); // (2)!
+        console.log(userEdited);
+        return this.httpClient.put(
+          `http://localhost:30992/api/v1/admins/${this.username}/users/'${username}`,
+          { ...userEdited }
+        );
+
+      }),
+      tap(() => {
+        this._users.next(editUsers);
+      })
+    );
+  }
+```
+
+1. `switchMap` permet de gérer de manière efficace les opérations asynchrones lors de la modification d'un utilisateur, en s'assurant que seule la dernière opération est prise en compte et en évitant les conflits ou les résultats indésirables. Ici elle sert surtout à mettre à jour automatiquement la liste des utilisateurs affichée à l'écran chaque fois qu'un utilisateur est modifié.
+2. Permet de changer la clé `type`("user" ou "admin") en `accountType`(0 ou 1) pour pouvoir l'envoyer au serveur
+```typescript
+changeAccountTypeKey(userInfo: any){
+    let userInfoChanged = { ...userInfo }
+    for (const k in userInfoChanged) {
+      if (k === "type") {
+        userInfoChanged["accountType"] = userInfoChanged[k];
+        delete userInfoChanged[k];
+      }
+    }
+    userInfoChanged.accountType=userInfoChanged.accountType === "user" ? 0:1;
+    return userInfoChanged;
+}
+```
+
+
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "message": "User johndoe74 updated"
+}
+```
+
+
+## Response fields
+
+| Nom       | Type   | Description                                   |
+| --------- | ------ | --------------------------------------------- |
+| `message` | string | Spécifie que l'utilisateur a bien été modifié |
+
diff --git a/Documentation/docs/api/user_connect.md b/Documentation/docs/api/user_connect.md
index b0f8f34..3ad3cad 100644
--- a/Documentation/docs/api/user_connect.md
+++ b/Documentation/docs/api/user_connect.md
@@ -1 +1,76 @@
-# POST /api/v1/guests/users/:username
\ No newline at end of file
+# POST /api/v1/guests/users/:username
+
+
+Permet de se connecter à un compte utilisateur ou administrateur, avec une vérification dans la base de données de l'existance du nom d'utilisateur. Le mot de passe dans le corps de la requête.
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/guests/users/:username`
+
+## Path parameters
+
+| Nom                                                  | Type   | Description                                                                                |
+| ---------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------ |
+| `username` <span class="bg-blue-200">REQUIRED</span> | string | Nom d'utilisateur qui est vérifié par le serveur, si elle n'existe pas une erreur survient |
+
+## JSON body parameters
+
+| Nom                                                  | Type   | Description                                                                                                                                 |
+| ---------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
+| `password` <span class="bg-blue-200">REQUIRED</span> | string | Mot de passe du compte qui est vérifié par le serveur, si elle n'est pas similaire au mot de passe du nom d'utilisateur une erreur survient |
+
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+    let passwordPost= {
+      password: this.loginService.hashPassword(this.formData.value.password)
+    }
+    let username:string=this.formData.value.username;
+    this.httpClient.post<any>('http://localhost:30992/api/v1/guests/users/'+username, passwordPost).subscribe(
+      response => { // (1)!
+        this.sessionService.token=response.token;
+        if(response.message === "USER_ALLOWED"){
+            console.log("aller sur les ressources de l'utilisateur");
+        }
+        if(response.message === "ADMIN_ALLOWED"){
+            console.log("aller sur les ressources de l'administrateur");
+        }
+
+      },
+      error => {
+        if(error.error.message === "USER_PASSWORD_FALSE"){
+            console.log("le mot de passe est faux");
+        }
+        if(error.error.message === "USER_NOT_FOUND"){
+            console.log("l'utilisateur n'existe pas");
+        }
+      }
+    );
+```
+
+1. `response` contient le résultat de la requête
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "message": "ADMIN_ALLOWED",
+    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWRtaW4iLCJ1c2VybmFtZSI6ImFkbWluMSIsImZpcnN0bmFtZSI6InVuIiwibGFzdG5hbWUiOiJhZG1pbiIsImlhdCI6MTY4NjU3MzcyOX0.OKw1SIjSnIIoEYbLfe21jF9GOJmo7TbSnDBKugpgaWs",
+    "firstname": "un",
+    "lastname": "admin"
+}
+```
+
+!!! info "Note"
+
+    `message` contiendre `USER_ALLOWED` si c'est un compte utilisateur sinon `ADMIN_ALLOWED` si c'est un compte administrateur
+## Response fields
+
+| Nom         | Type   | Description                                                                                                                                                |
+| ----------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `message`   | string | Spécifie si c'est un compte utilisateur ou administrateur                                                                                                  |
+| `token`     | string | Token à stocker sur le stockage local de l'utilisateur qui va permettre de vérifier et valider l'identité d'un utilisateur lorsqu'il accède aux ressources |
+| `firstname` | string | Prénom de l'utilisateur                                                                                                                                    |
+| `lastname`  | string | Nom de famille de l'utilisateur                                                                                                                            |
+
diff --git a/Documentation/docs/api/user_create.md b/Documentation/docs/api/user_create.md
index fe08d87..efee8fb 100644
--- a/Documentation/docs/api/user_create.md
+++ b/Documentation/docs/api/user_create.md
@@ -1 +1,67 @@
-# POST /api/v1/guests/user
\ No newline at end of file
+# POST /api/v1/guests/users
+
+Permet de créer un compte utilisateur ou administrateur, avec une vérification dans la base de données de l'existance du nom d'utilisateur. Les détails de l'utilisateur sont envoyés dans le corps de la requête.
+
+## Endpoint URL
+
+`http://localhost:30992/api/v1/guest/users/`
+
+## JSON body parameters
+
+| Nom                                                     | Type   | Description                                                  |
+| ------------------------------------------------------- | ------ | ------------------------------------------------------------ |
+| `username` <span class="bg-blue-200">REQUIRED</span>    | string | Nom d'utilisateur unique pour le compte                      |
+| `password` <span class="bg-blue-200">REQUIRED</span>    | string | Mot de passe du compte                                       |
+| `firstname` <span class="bg-blue-200">REQUIRED</span>   | string | Prénom de l'utilisateur                                      |
+| `lastname` <span class="bg-blue-200">REQUIRED</span>    | string | Nom de famille de l'utilisateur                              |
+| `email` <span class="bg-blue-200">REQUIRED</span>       | string | Adresse e-mail de l'utilisateur                              |
+| `accountType` <span class="bg-blue-200">REQUIRED</span> | string | Type de compte (utilisateur(**0**) ou administrateur(**1**)) |
+
+!!! warning "Attention"
+
+    Le mot de passe ici est à hasher avant d'être envoyer au serveur, aucune vérification de hash n'est fait au niveau de l'API
+
+## Exemple d'utilisation
+
+```typescript linenums="1"
+this.httpClient.post<any>('http://localhost:30992/api/v1/guests/users', this.formData.value).subscribe( // (1)!
+      response => {
+        console.log(response); // (2)!
+      },
+      error => {
+        if(error.error.message === "USER_EXIST"){
+          console.log("The username exist");
+        }
+      }
+    );
+```
+
+1. Ici `this.formData.value` va contenir l'ensemble des paramètres à passer dans la requête
+2. `response` contient le résultat de la requête
+
+## Exemple de réponse
+
+```json linenums="1"
+{
+    "new_user": {  
+        "username": "user1",
+        "lastname": "user",
+        "firstname": "un",
+        "email": "user1@titu.ch"
+    }
+
+}
+```
+
+!!! info "Note"
+
+    `new_user` si on crée un utilisateur sinon `new_admin` si on crée un administrateur
+## Response fields
+
+| Nom         | Type   | Description                             |
+| ----------- | ------ | --------------------------------------- |
+| `username`  | string | Nom d'utilisateur unique pour le compte |
+| `lastname`  | string | Nom de famille de l'utilisateur         |
+| `firstname` | string | Prénom de l'utilisateur                 |
+| `email`     | string | Adresse e-mail de l'utilisateur         |
+
diff --git a/Documentation/example_doc/file_management.md b/Documentation/example_doc/file_management.md
deleted file mode 100644
index e381c03..0000000
--- a/Documentation/example_doc/file_management.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# Gestion des fichiers
-
-Cette section explique comment le projet gère les fichiers reçus par des requêtes.
-
-Dans le fichier `actc/settings.py`, la variable 
-[MEDIA_ROOT](https://docs.djangoproject.com/en/4.1/ref/settings/#media-url) permet de définir le chemin où les fichiers 
-sont stockés :
-
-```python
-MEDIA_ROOT = BASE_DIR / 'media/' # (1)!
-```
-
-1.  `BASE_DIR` représente le premier dossier `actc/` qui contient le projet
-
-Dans le cas de notre projet, les fichiers seront ainsi stockés dans `actc/media/`.
-
-
-## Verification du format 
-
-Notre projet doit convertir des fichiers dans divers formats. Avant d'effectuer ces conversions il est nécessaire de 
-vérifier le format des fichiers que le serveur reçoit des utilisateurs.
-
-La vérification du fichier s'effectue à l'aide de la librairie `python-magic`.
-
-```python linenums="1" title="actc/converter.py" hl_lines="9"
-import magic
-from django.core.files.uploadedfile import UploadedFile
-
-def file_mime_type_verification(
-    file: UploadedFile, 
-    expected_mime_type: str = 'text/plain'
-) -> bool:
-
-    mime_type: str = magic.from_buffer(file.read(), mime=True) # (1)!
-    if mime_type != expected_mime_type:
-        return False
-    
-    return True
-```
-
-1. L'utilisation de `file.read()` et de `magic.from_buffer()` nous évite de créer localement le fichier reçu pour la
-vérification de son *mime type*.
-
-La méthode ci-dessus permet de déterminer le type du fichier passé en paramètre  et de stocker le résultat dans la 
-variable "mime_type". Si le *mime type* du fichier correspond bien au type attendu (par défaut `text/plain`) on retourne
-vrai sinon faux.
-
-
-## Sauvegarde et suppression
-
-La sauvegarde de fichier s'effectue à l'aide de la classe `DefaultStorage` de 
-[Django](https://docs.djangoproject.com/en/4.1/topics/files/#storage-objects) avec la méthode `save()`.
-
-Cette méthode prends 2 paramètres : le nom du fichier et un objet `File`. Les fichiers reçus par une requête POST sont 
-de type `UploadedFile`.
-
-Pour éviter d'écraser des fichiers existants, chaque fichier doit être nommé en générant un 
-[UUID](https://docs.python.org/3/library/uuid.html)[^1] aléatoire.
-
-[^1]: Universally unique identifier
-
-```python linenums="1" title="Exemple de sauvegarde de fichier"
-import uuid
-from django.core.files.storage import default_storage
-
-def saveFile(file: UploadedFile) -> None:
-    filename = str(uuid.uuid4())
-    default_storage.save(filename, file)
-```
-
-!!! note
-
-    Dans le cadre de ce projet, la création de certains fichiers s'effectue au travers de librairies externes à Django. 
-    Faites bien attention à définir correctement le chemin où le fichier doit être créé (généralement dans le dossier 
-    `media/`).
-
-Pour supprimer un fichier, il suffit d'utiliser la méthode `delete()` :
-
-```python
-default_storage.delete(filename)
-```
-
-
-## Récupérer un fichier sauvegardé
-
-La classe [FileSystemStorage](https://docs.djangoproject.com/en/4.1/ref/files/storage/#the-filesystemstorage-class)
-permet de récupérer le chemin du dossier qui stocke les fichiers sauvegardés. Ce chemin est stocké dans l'attribut
-`location`.
-
-En combinant cette attribut avec la classe [PurePath](https://docs.python.org/3.8/library/pathlib.html#pathlib.PurePath)
-de la librairie `pathlib` il est possible de reconstruire le chemin complet d'un fichier sauvegardé.
-
-```python linenums="1" hl_lines="5"
-from pathlib import PurePath
-from django.core.files.storage import FileSystemStorage
-
-storage = FileSystemStorage()
-filepath = str(PurePath(storage.location, 'my-file-name'))
-# /path/to/project/actc/media/my-file-name
-```
diff --git a/Documentation/example_doc/index.md b/Documentation/example_doc/index.md
deleted file mode 100644
index 475a636..0000000
--- a/Documentation/example_doc/index.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Backend
-
-Cette page contient la documentation concernant la partie backend du projet.
-
-Le framework [Django](https://www.djangoproject.com/) est utilisé pour le backend du projet.
-
-
-## Installation
-
-La marche à suivre pour l'installation et la mise en place du projet est disponible sur le 
-[gitlab](https://gitedu.hesge.ch/in-code-we-trust/backend/-/blob/main/README.md#installation).
-
-
-## Projet vs application
-
-Dans le cadre du framework Django, il est important de faire la différence entre les termes *projets* et *applications*.
-
-Un projet contient plusieurs applications, une application peut être utilisée dans plusieurs projets.
-
-
-### Ajouter une application au projet
-
-Pour qu'un projet puisse utiliser une application, il faut ajouter sa *classe de configuration* dans la liste 
-`INSTALLED_APPS` se trouvant dans le fichier `actc/settings.py`.
-
-- La *classe de configuration* se trouve dans le fichier `<app_name>/apps.py`
-
-```python title="actc/settings.py"
-INSTALLED_APPS = [
-    'mesh_process.apps.MeshProcessConfig', # notre application
-    # les autres applications...
-]
-```
-
-
-## Structure du projet
-
-Le premier dossier `actc` représente notre projet Django. Tous les chemins indiqués dans cette documentation commencent 
-à la racine de ce dernier.[^1]
-
-Ce dossier contient des sous-dossiers représentant diverses applications :
-
-- [mesh_process/](mesh_process) : Conversion des données paramétriques CAO[^2] en données maillées
-
-[^1]: Lorsqu'un nom de fichier est mentionné sans chemin cela signifie que ce dernier se trouve à la racine du dépôt 
-git, c'est-à-dire dans le dossier parent du (premier) dossier `actc`
-
-[^2]: Conception assistée par ordinateur (en anglais, *computer aided design* ou *CAD*).
-
-
-## Dépendances du projet
-
-Notre projet nécessite diverses dépendances pour fonctionner. Ces dépendances sont définies dans les fichiers 
-[environment.yml](https://gitedu.hesge.ch/in-code-we-trust/backend/-/blob/main/environment.yml), 
-[requirements.txt](https://gitedu.hesge.ch/in-code-we-trust/backend/-/blob/main/requirements.txt) et 
-[additionnal-requirements.txt](https://gitedu.hesge.ch/in-code-we-trust/backend/-/blob/main/additionnal-requirements.txt).
-
-Cette section liste les dépendances principales du projet, c'est-à-dire celles qui sont directement utilisées dans le 
-code.
-
-
-### Environnement conda
-
-Lors de l'installation de notre environnement conda, les dépendances suivantes sont installées :
-
-```yaml title="environment.yml" hl_lines="4"
-# ...
-dependencies:
-  - python=3.9
-  - pythonocc-core=7.7.0
-  - libmagic=5.39 # Cette dépendance n'est pas disponible sur Windows.
-```
-
-La dépendance principale du projet est [pythonocc-core](https://anaconda.org/conda-forge/pythonocc-core). N'étant pas 
-disponible sur [PyPI](https://pypi.org/) elle nous contraint à utiliser conda afin d'être installée.
-
-!!! note
-    `libmagic` est ajoutée lors de la création de l'environnement conda afin d'assurer le fonctionnement de 
-    `python-magic` qui en a besoin mais qui ne l'installera pas automatiquement.
-
-!!! tip "Astuce"
-    Si vous souhaitez connaître l'arbre des dépendances des paquets installées, vous pouvez utiliser 
-    [pipdeptree](https://pypi.org/project/pipdeptree/).
-
-
-## Références
-
-* [Django documentation](https://docs.djangoproject.com/en/4.1/)
-* [Open CASCADE Technology - STEP Translator](https://dev.opencascade.org/doc/overview/html/occt_user_guides__step.html#occt_step_2_3)
-* [pythonocc-core Extend](https://github.com/tpaviot/pythonocc-core/blob/master/src/Extend/DataExchange.py)
diff --git a/Documentation/example_doc/logging.md b/Documentation/example_doc/logging.md
deleted file mode 100644
index 58a8285..0000000
--- a/Documentation/example_doc/logging.md
+++ /dev/null
@@ -1,214 +0,0 @@
-# Logging
-
-Django utilise et étend le module [logging](https://docs.python.org/3/library/logging.html#module-logging) de python.
-
-Ce document n'explique que les points essentiels pour notre projet. Pour les explications détaillées, redirigez-vous
-vers les liens en [références](#references).
-
-
-## Log level
-
-Chaque message d'un log possède un niveau qui définit le degré de gravité du message :
-
-* **DEBUG**: information système de bas niveau à des fins de débogage.
-* **INFO**: information système générale.
-* **WARNING**: information décrivant la présence d’un problème mineur.
-* **ERROR**: information décrivant la présence d’un problème majeur.
-* **CRITICAL**: information décrivant la présence d’un problème critique.
-
-
-## Configuration
-
-La configuration du logger se fait exclusivement dans le fichier 
-[actc/settings.py](https://gitedu.hesge.ch/in-code-we-trust/backend/-/blob/main/actc/actc/settings.py).
-
-
-### loggers
-
-Le projet définit les *loggers* suivant :
-
-```python hl_lines="3 8 13 18"
-# ...
-'loggers': {
-    'django': {
-        'handlers': ['actc'],
-        'level': 'INFO',
-        'propagate': False,
-    },
-    'mesh_process': {
-        'handlers': ['actc', 'mesh_process'],
-        'level': 'INFO',
-        'propagate': False,
-    },
-    'mesh_process.step_translator': {
-        'handlers': ['conversion_file'],
-        'level': 'INFO',
-        'propagate': True,
-    },
-    'mesh_process.quality': {
-        'handlers': ['mesh_quality'],
-        'level': 'DEBUG',
-        'propagate': True,
-    },
-},
-# ...
-```
-
-* `django` : Envoie les messages de niveau `INFO` à l'*handler* `actc`.
-* `mesh_process` : Envoie les messages de niveau `INFO` aux *handlers* `actc` et `mesh_process`.
-* `mesh_process.step_translator` : Envoie les messages de niveau `INFO` à l'*handler* `conversion_file`.
-* `mesh_process.quality` : Envoie les messages de niveau `DEBUG` à l'*handler* `mesh_quality`.
-
-
-Puisque l'attribue `propagate` de `mesh_process.step_translator` et `mesh_process.quality` est `True`, les messages sont
-égalements transmis au logger `mesh_process`.
-
-
-### handlers
-
-Le projet définit les *handlers* suivant :
-
-```python hl_lines="3 11 17 23"
-# ...
-'handlers': {
-    'actc': {
-        'level': 'DEBUG' if DEBUG else 'WARNING',
-        'class': 'logging.handlers.RotatingFileHandler',
-        'filename': BASE_DIR  / 'logs' / 'actc.log',
-        'formatter': 'verbose',
-        'maxBytes': 1048576, # 1 MB
-        'backupCount': 3
-    },
-    'mesh_process': {
-        'level': 'INFO',
-        'class': 'logging.FileHandler',
-        'filename': BASE_DIR  / 'logs' / 'mesh_process.log',
-        'formatter': 'verbose'
-    },  
-    'conversion_file': {
-        'level': 'INFO',
-        'class': 'logging.FileHandler',
-        'filename': BASE_DIR  / 'logs' / 'conversion.log',
-        'formatter': 'simple'
-    },
-    'mesh_quality': {
-        'level': 'DEBUG' if DEBUG else 'WARNING',
-        'class': 'logging.FileHandler',
-        'filename': BASE_DIR / 'logs' / 'quality.log',
-        'formatter': 'simple',
-    },
-},
-# ...
-```
-
-Les 3 handlers du projet créent un fichier de log pour enregistrer les différents messages détectés.
-
-!!! info "actc"
-
-    En production, cet *handler* gère des messages d'un niveau plus élevé qu'en développement (DEBUG).
-
-    Il s'agit de l'*handler* qui crée le fichier de log principal du projet, il sera ainsi le plus volumineux. La classe 
-    `logging.handlers.RotatingFileHandler` est donc utilisée afin de définir une taille de fichier maximal et un nombre de
-    fichier de *backup*.
-
-!!! info "mesh_process"
-
-    Il s'agit de l'*handler* qui crée le fichier de log principal de l'application *mesh process*. Il traite les
-    messages de niveau `INFO` ou supérieur.
-
-!!! info "conversion_file"
-
-    Il s'agit de l'*handler* qui crée le fichier de log enregistrant les événements des conversions de fichiers. Cet
-    *handler* sert principalement à enregistrer les conversions effectuées, ainsi il traite les messages de niveau `INFO` et
-    supérieur en utilisant un format simple.
-
-!!! info "mesh_quality"
-
-    Il s'agit de l'*handler* qui crée le fichier de log enregistrant les événements qui mesurent la qualité d'un *mesh*.
-
-
-### formatters
-
-Le projet définit les *formatters* suivant :
-
-```python hl_lines="3 7"
-# ...
-'formatters': {
-    'verbose': {
-        'format': '[{levelname}] {asctime} {name} {module} {message}',
-        'style': '{',
-    },
-    'simple': {
-        'format': '[{levelname}] {asctime} {message}',
-        'style': '{',
-    },
-},
-# ...
-```
-
-Le *formatter* `verbose` ajoute simplement le nom du fichier et le module qui a produit le message.
-
-
-### filters
-
-Le projet n'utilise pas de *filters* pour le traitement des logs.
-
-
-### Time zone
-
-L'heure des messages indiqué dans les logs va dépendre de la *time zone* définie. 
-
-```python
-TIME_ZONE = 'Europe/Zurich'
-```
-
-## Utilisation
-
-Pour crée un message de log, il faut ajouter les lignes suivantes en haut du fichier :
-
-```python
-import logging
-
-logger = logging.getLogger(__name__)
-```
-
-Il est ensuite possible de faire `logger.<log_level>(<message>)` afin de créer votre message.
-
-Exemple : 
-
-```python
-logger.info(f"STEP to STL conversion has successfully created the file '{output_filename}'." )
-```
-
-produira le message suivant :
-
-```log
-[INFO] 2023-03-21 13:49:42,875 STEP to STL conversion has successfully created the file '0d686ff9-9ea9-44cc-8e59-124c90b97fea.stl'.
-```
-
-## Stockage
-
-Les logs sont stockées dans le dossier [logs](https://gitedu.hesge.ch/in-code-we-trust/backend/-/tree/main/actc/logs) :
-
-* **actc.log** (niveau: `DEBUG` en développement, `WARNING` en production)
-
-Le fichier qui stocke les événements globaux du projet *ACTC*.
-
-* **mesh_process.log** (niveau: `WARNING`)
-
-Le fichier qui stocke les événements globaux de l'application *mesh process*.
-
-* **conversion.log** (niveau: `INFO`)
-
-Le fichier qui stocke les événements des conversions effectuées par l'application *mesh process*.
-
-* **quality.log** (niveau: `DEBUG` en développement, `WARNING` en production)
-
-Le fichier qui stocke les événements des analyses de qualités des meshs effectuées par l'application *mesh process*.
-
-## Références
-
-* [Django logging overview](https://docs.djangoproject.com/en/4.1/topics/logging/)
-* [Django logging reference](https://docs.djangoproject.com/en/4.1/ref/logging/)
-* [Django - How to configure and use logging](https://docs.djangoproject.com/en/4.1/howto/logging/#logging-how-to)
-* [logging - Logging facility for Python](https://docs.python.org/3/library/logging.html#module-logging)
diff --git a/Documentation/example_doc/mesh_process.md b/Documentation/example_doc/mesh_process.md
deleted file mode 100644
index 604bf9e..0000000
--- a/Documentation/example_doc/mesh_process.md
+++ /dev/null
@@ -1,273 +0,0 @@
-# App: mesh_process
-
-L'application **mesh_process** est responsable de la conversion et l'optimisation des fichiers STEP.
-
-## Formats de fichiers
-
-Le but de notre application est de produire, à partir d'un fichier STEP, un format de fichier permettant d'afficher des 
-composants 3D sur un navigateur web.
-
-Pour ce faire, il faut effectuer diverses conversions dans des formats de fichiers différents.
-
-### Fichier STEP
-
-Les fichiers STEP (`.stp`, `.step`, `.stpnc`, `.p21`, `.210`) ou 
-[ISO 10303-21](https://en.wikipedia.org/wiki/ISO_10303-21) sont les fichiers d'entrées de notre conversion.
-
-Il s'agit de fichier ayant une structure ASCII, un exemple de leur contenu est disponible sur 
-[wikipedia](https://en.wikipedia.org/wiki/ISO_10303-21#Example).
-
-
-### Fichier STL
-
-Les fichiers [STL](https://en.wikipedia.org/wiki/STL_(file_format)) (`.stl`) sont des fichiers ayant soit une structure 
-ASCII, soit une structure binaire.
-
-
-### Fichier OBJ
-
-Les fichiers OBJ (`.obj`), aussi appelé [Wavefront .obj file](https://en.wikipedia.org/wiki/Wavefront_.obj_file), sont
-les fichiers de sorties de notre conversion.
-
-
-## Processus de conversion
-
-La conversion des fichiers STEP se déroule ainsi :
-
-1. fichier STEP :material-arrow-right: fichier STL
-2. fichier STL :material-arrow-right: fichier OBJ
-
-!!! info
-    La conversion de STEP à STL s'effectue à l'aide d'open CASCADE
-
-
-## Prérequis
-
-Lorsque le serveur reçoit un fichier STEP à une URL définit, ce dernier va effectuer une conversion dans le format
-définit par l'URL.
-
-Actuellement 2 URLs de conversions sont disponibles :
-
-* `mesh-process/convert/step/to/stl` qui retourne un fichier STL
-* `mesh-process/convert/step/to/obj` qui retourne un fichier OBJ
-
-!!! warning "Attention"
-
-    Les 2 URLs doivent recevoir une requête POST ayant un formulaire contenant un fichier STEP
-
-
-### Classe de formulaire
-
-Nous devons définir une classe (`forms.Form`) dans `mesh_process/forms.py` qui correspond au formulaire attendu par le 
-serveur pour pouvoire effectuer les différentes conversions. Cela permet d'assurer qu'une URL reçoit un formulaire 
-valide pour le traitement à effectuer.
-
-Pour nos conversions, nous devons créer une classe qui doit  posséder un attribut `FileField` qui représente le fichier 
-à convertir.
-
-```python linenums="1" title="mesh_process/forms.py"
-from django import forms
-
-class UploadFileForm(forms.Form):
-    file = forms.FileField()
-```
-*Pour plus d'information sur le fonctionnement, voir la* 
-*[documentation de Django](https://docs.djangoproject.com/en/4.1/topics/http/file-uploads/#basic-file-uploads).*
-
-
-### Mise en place des vues
-
-Les vues sont crées via des méthodes dans le fichier `mesh_process/views.py`.
-
-Cette vue ne doit effectuer la conversion que lorsque le serveur reçoit une requête POST avec un formulaire valide
-(qui contient le fichier à convertir).
-
-```python linenums="1" title="mesh_process/views.py"
-from mesh_process.forms import UploadFileForm
-from mesh_process.step_translator import convert_step_to_stl
-
-def step_to_obj(request):
-    if request.method != 'POST':
-        # Bad request method, return response with HTTP 400 code...
-
-    form = UploadFileForm(request.POST, request.FILES)
-
-    if not form.is_valid():
-        # Form invalid, return response with HTTP 400 code...
-
-    converted_file_path = convert_step_to_obj(request.FILES['file'])
-    if converted_file_pathis None:
-        # Conversion failed, return reponse with HTTP 500 code...
-    
-    return upload_file(converted_file_path)
-```
-
-Il faut ensuite définir les URL des vues dans le fichier `mesh_process/urls.py`
-
-```python title="mesh_process/urls.py"
-urlpatterns = [
-    # ...
-    path('convert/step/to/stl', views.step_to_stl, name='step_to_stl'),
-    path('convert/step/to/obj', views.step_to_obj, name='step_to_obj'),
-    # ...
-]
-```
-
-
-## Conversion STEP à STL
-
-### Lecture du STEP
-
-La lecture du fichier STEP permet de récupérer une "forme" (*shape*) qui peut être convertie en fichier STL.
-
-La méthode suivante effectue la lecture du fichier STEP :
-
-```python title="mesh_process/step_translator.py"
-read_step(input_file: str, verbose: bool = True):
-    """Translate a STEP file to a shape.
-
-    Args:
-        input_file (str): Path to the STEP file.
-        verbose (bool, optional): When True, displays information messages. Defaults to True.
-
-    Raises:
-        FileNotFoundError: The input_file doesn't exist.
-        AssertionError: An error has occurred while reading the file
-
-    Returns:
-        A shape corresponding to the STEP file
-    """
-```
-
-Pour que cette lecture fonctionne, il est primordiale d'effectuer les opérations suivantes :
-
-* Charger le fichier STEP :
-
-```python
-step_reader = STEPControl_Reader()
-status = step_reader.ReadFile(input_file)
-```
-
-!!! warning "Attention"
-
-    Pour éviter un crash du serveur, il ne faut poursuivre le traitement que si `status` correspond à
-    [IFSelect_RetDone](https://dev.opencascade.org/doc/occt-7.6.0/refman/html/_i_f_select___return_status_8hxx.html).
-
-* Effectuer la traduction (*translation*) du fichier STEP :
-
-```python
-step_reader.TransferRoot()
-```
-
-* Récupérer la *shape* du résultat de la traduction :
-
-```python
-shape = step_reader.Shape()
-return shape
-```
-
-### Écriture du fichier STL
-
-Une fois la *shape* du fichier STEP récupéré, il est possible de créer le fichier `.stl` pour finaliser la conversion.
-
-La méthode suivante effectue l'écriture du fichier `.stl` :
-
-```python title="mesh_process/step_translator.py"
-def write_stl_from_step(step_shape, output_file: str, ascii_mode: bool = True, 
-                        linear_deflection=0.9, angular_deflection=0.5, isRelative=False, isInParallel=True):
-    """Create a STL file from a STEP shape.
-
-    Args:
-        step_shape: The shape used to create the STL file.
-        output_file (str): The STL filepath. 
-        ascii_mode (bool, optional): Set the writer mode (True for ASCII, False for binary). Defaults to True.
-        linear_deflection (float, optional): Defaults to 0.9.
-        angular_deflection (float, optional): Defaults to 0.5.
-        isRelative (bool, optional): Defaults to False.
-        isInParallel (bool, optional): Defaults to True.
-
-    Raises:
-        AssertionError: The write failed
-    """
-```
-
-Pour que cette écriture fonctionne, il est primordiale d'effectuer les opérations suivantes :
-
-* La forme doit être explicitement maillée
-
-```python
-mesh = BRepMesh_IncrementalMesh(step_shape, linear_deflection, isRelative, angular_deflection, isInParallel)
-mesh.Perform()
-```
-
-* Définir le mode d'écriture
-
-```python
-stl_writer = StlAPI_Writer()
-stl_writer.SetASCIIMode(ascii_mode)
-```
-
-* Effectuer la conversion
-
-```python
-stl_writer.Write(step_shape, output_file)
-```
-
-La méthode produit un fichier `.stl` au chemin défini par `output_file`.
-
-
-## Conversion STL à OBJ
-
-TODO
-
-
-## Upload des fichiers
-
-
-### Envoi via JSON
-
-À la fin de la conversion du fichier, le serveur doit l'envoyer à l'utilisateur sous la forme d'une `HttpResponse` qui 
-contient une `JsonResponse`.
-
-```python title="mesh_process/views.py" linenums="1" hl_lines="9"
-def upload_file(file_path: str, quality_before=None, quality_after=None):
-    # ...
-    with open(file_path, "r") as file:
-        data = {
-            "obj_content": file.read(),
-            # ...
-        }
-    response = JsonResponse(data)
-    return HttpResponse(response, content_type="application/json")
-```
-
-Le code ci-dessus crée un objet json qui contient le contenu de notre fichier converti. Le format json nous permet de 
-transmettre d'autres données au client tel que l'analyse de qualité du fichier.
-
-
-### Envoi direct du fichier
-
-!!! warning "Obsolète"
-
-    Bien que le code ci-dessous fonctionne, cette manière de faire est obsolète lors des conversions de fichiers depuis 
-    l'ajout des indicateurs de qualité dans la version [2.0.0](https://gitedu.hesge.ch/in-code-we-trust/backend/-/tree/v2.0.0?ref_type=tags) du projet.
-
-    Nous préférons envoyé du json au client qui permet de joindre d'autres informations en plus du fichier.
-
-À la fin de la conversion du fichier, le serveur doit l'envoyer à l'utilisateur sous la forme d'une `HttpResponse`.
-
-```python title="mesh_process/views.py" linenums="1" hl_lines="4"
-def upload_file(file_path):
-    with open(file_path, 'rb') as file: # (1)!
-        response = HttpResponse(file.read(), content_type='text/plain')
-        content = 'attachment; filename=' + os.path.basename(file_path)
-        response['Content-Disposition'] = content
-        return response
-```
-
-1.  Le fichier doit être ouvert en mode binaire (`b`)
-
-    On ajoute ensuite le contenu du fichier dans la réponse avec `file.read()`
-
-Le `content` définit l'en-tête de la réponse et spécifie que le fichier doit être téléchargé (`attachment;`), `basename`
-permet de renvoyer le nom de fichier à partir du répertoire complet.
diff --git a/Documentation/example_doc/migrations.md b/Documentation/example_doc/migrations.md
deleted file mode 100644
index 412ca6a..0000000
--- a/Documentation/example_doc/migrations.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Migration
-
-La commande suivante permet de créer les migrations pour l'application `mesh_process` :
-
-```text
-python manage.py makemigrations mesh_process
-```
-
-Il est ensuite possible de créer les tables dans la base de données :
-
-```text
-python manage.py migrate
-```
diff --git a/Documentation/example_doc/models.md b/Documentation/example_doc/models.md
deleted file mode 100644
index 6eeafdc..0000000
--- a/Documentation/example_doc/models.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Modèles
-
-Les modèles permettent de représenter les objets que l'on stocke dans la base de données.
-Ils sont défininis dans le fichier `mesh_process/models`.
-
-Voici un exemple de création de modèles :
-
-```python linenums="1"
-from django.db import models
-
-
-class Question(models.Model):
-    question_text = models.CharField(max_length=200)
-    pub_date = models.DateTimeField('date published')
-
-
-class Choice(models.Model):
-    question = models.ForeignKey(Question, on_delete=models.CASCADE)
-    choice_text = models.CharField(max_length=200)
-    votes = models.IntegerField(default=0)
-
-```
-
-TODO: expliquer les points essentiels, éventuellement créer une section qui présente les configurations particulières.
diff --git a/Documentation/example_doc/prod_config.md b/Documentation/example_doc/prod_config.md
deleted file mode 100644
index 14ca17c..0000000
--- a/Documentation/example_doc/prod_config.md
+++ /dev/null
@@ -1,127 +0,0 @@
-# Configuration
-
-Le déploiement du serveur se fait à l'aide d'une image Docker. Cette page explique les points clefs permettant la 
-création de cette image.
-
-
-## L'environnement conda
-
-La création de cette environnement s'effectue à partir du fichier 
-[environment.yml](https://gitedu.hesge.ch/in-code-we-trust/backend/-/blob/main/environment.yml) :
-
-```yaml linenums="1" title="environment.yml"
-name: pyoccenv
-channels:
-  - conda-forge
-dependencies:
-  - python=3.9
-  - pythonocc-core=7.7.0
-  - libmagic=5.39 # (1)!
-```
-
-1.  Il est nécessaire que cette librairie soit installée lors de la création de l'environnement conda car elle est 
-    manquante dans l'image `continuumio/miniconda3` et car elle n'est pas installée directement par le package python
-    `python-magic` qui en a besoin.
-
-
-## Dockerfile
-
-La création de l'image est effectuée à l'aide du fichier 
-[Dockerfile](https://gitedu.hesge.ch/in-code-we-trust/backend/-/blob/main/Dockerfile) suivant : 
-
-```Dockerfile linenums="1" title="Dockerfile"
-# syntax=docker/dockerfile:1
-FROM continuumio/miniconda3
-
-# Copy the Django project, install the environement and dependencies (1)
-COPY . /srv/
-RUN conda init bash && \
-    . /root/.bashrc && \
-    conda env create -f /srv/environment.yml && \
-    conda clean -afy && \
-    conda activate pyoccenv && \
-    python -m pip install -r /srv/requirements.txt
-
-# Start the server
-WORKDIR /srv/actc
-CMD conda init bash && \
-    . /root/.bashrc && \
-    conda activate pyoccenv && \
-    python manage.py runserver 0.0.0.0:2000
-
-EXPOSE 2000
-```
-
-1.  Le fichier `environment.yml` est utilisé pour créer l'environnement virtuel conda.
-
-    Le fichier `requirements.txt` est utilisé pour installer les diverses dépendances python du projet.
-
-    La commande `conda clean -afy` permet de réduire considérablement la taille de l'image Docker (~1,3 Go en moins).
-
-!!! note
-    Il est possible de copier sereinement l'intégralité du répertoire (avec `COPY .`) sans risque grâce au fichier 
-    [.dockerignore](https://gitedu.hesge.ch/in-code-we-trust/backend/-/blob/main/.dockerignore) qui exclus les fichiers
-    et répertoires indésirables à notre image.
-
-
-Il est important de préciser que pour pouvoir activer l'environnement virtuel conda, il faut initialiser le terminal
-avec `conda init bash`. Hors pour que ce changement soit effectuée, il faut relancer le terminal.
-
-Lancer plusieurs fois la commande `RUN` de docker ne semble malheureusement pas permettre de relancer le terminal, pire
-cela semble même "annuler" l'initialisation du terminal.
-
-Ainsi, les 2 points ci-dessus font que nous devons :
-
-- Utiliser qu'une seule commande `RUN` lors de la création de l'environnement et le démarrage du serveur.
-- Utiliser `&& \` pour exécuter plusieurs commandes à la suite et sur une ligne différente.
-- Utiliser la commande [dot](https://pubs.opengroup.org/onlinepubs/009695399/utilities/dot.html) pour relancer le 
-terminal avec `. /root.bashrc`
-
-
-## Déploiement
-
-Se rendre sur le serveur [wetty](https://silentpc.ciuj-kune.org/wetty) et cloner le projet
-
-```bash
-git clone ssh://git@ssh.hesge.ch:10572/in-code-we-trust/backend.git
-cd backend
-```
-
-
-### Variables d'environnement
-
-Les variables d'environnements sont créés automatiquement à partir d'un fichier `.env` et de 
-[python-dotenv](https://github.com/theskumar/python-dotenv).
-
-1. Créer une copie du fichier `.env.example` dans un nouveau fichier `.env`.
-
-2. Créer une clef de sécurité secrète. Pour cela il faut ouvrir une console interactive python et exécuter le code 
-suivant :
-
-    ```python
-    import secrets
-    print(secrets.token_urlsafe(40))
-    ```
-
-3. Dans le fichier `.env`, remplacer la valeur de la variable `DJANGO_SECRET_KEY` par la clef générée précédemment.
-
-4. Modifiez ensuite la valeur de la variable `DJANGO_ENABLE_SECURITY` par `'yes'`.
-
-
-### Création de l'image
-
-Depuis la racine du projet `backend`, la commande suivante permet de créer l'image :
-
-```text
-docker build -t icwt-django .
-```
-
-
-### Démarrer le container
-
-Une fois l'image créé, il est possible de démarer un *container* à partir de cette dernière à l'aide de la commande 
-suivante :
-
-```text
-docker run -d -p 2000:2000 icwt-django
-```
diff --git a/Documentation/example_doc/rest_framework.md b/Documentation/example_doc/rest_framework.md
deleted file mode 100644
index 80a2480..0000000
--- a/Documentation/example_doc/rest_framework.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# REST framework
-
-Dans le cadre de notre projet, l'utilisation de base des vues de Django est limitée étant donné que la partie frontend 
-du projet est gérée par une autre technologie (Ionic/Angular).
-
-Ainsi, une API REST est mise en place à l'aide du [Django REST framework](https://www.django-rest-framework.org/)
-
-
-## Configuration
-
-Il faut ajouter `rest_framework` dans la liste `INSTALLED_APPS` se trouvant dans le fichier `actc/settings.py` :
-
-```python title="actc/settings.py"
-INSTALLED_APPS = [
-    # ...
-    'rest_framework',
-]
-```
-
-La mise en place des routes API s'effectue dans le fichier `actc/urls.py` :
-
-```python linenums="1" hl_lines="4-6 9" title="actc/urls.py"
-from rest_framework import routers
-from mesh_process import views
-
-router = routers.DefaultRouter() # (1)
-router.register(r'vector3D', views.Vector3DViewSet) # (2)
-router.register(r'vertex', views.VertexViewSet)
-
-urlpatterns = [
-    path('', include(router.urls)), # (3)
-    # ...
-]
-```
-
-1.  Initialise le routeur
-
-2.  Ajoute un `ModelViewSet` au routeur
-
-    Il s'agit des différentes classes définies dans le fichier `mesh_process/views.py`
-
-3.  Crée un routage automatique de notre API
-
-
-## Endpoints
-
-TODO: tableau récapitulatif des différents *endpoints* de l'application
-
-note: faire le tableau dans un autre fichier serait peut-être plus judicieux
diff --git a/Documentation/example_doc/serialization.md b/Documentation/example_doc/serialization.md
deleted file mode 100644
index 586ed36..0000000
--- a/Documentation/example_doc/serialization.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Sérialisation
-
-La sérialisation nous permet de transformer nos différents modèles en instance JSON afin de pouvoir les transférer et
-utiliser facilement.
-
-Notre sérialisation est configurée dans le fichier `mesh_process/serializers.py` :
-
-```python
-from mesh_process.models import Vector3D, Vertex
-from rest_framework import serializers
-
-
-class Vector3DSerializer(serializers.HyperlinkedModelSerializer):
-    class Meta:
-        model = Vector3D
-        fields = ['x', 'y', 'z']
-
-
-class VertexSerializer(serializers.HyperlinkedModelSerializer):
-    class Meta:
-        model = Vertex
-        fields = ['position3D']
-
-```
-
-TODO: n'expliquer que les points essentiels
diff --git a/Documentation/example_doc/view_management.md b/Documentation/example_doc/view_management.md
deleted file mode 100644
index b59e854..0000000
--- a/Documentation/example_doc/view_management.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Gestion des vues et URLs
-
-Le fichier `views.py`, se trouvant dans chaque dossier d'application, représente les différentes vues d'une application.
-
-Le fichier `actc/urls.py` configure toutes les vues du projet et des applications qui le compose. 
-
-
-## Création des vues
-
-Le code ci-dessous représente la vue la plus simple possible :
-
-```python linenums="1"
-from django.http import HttpResponse
-
-
-def index(request):
-    return HttpResponse("Hello, world. You're at the app index.")
-```
-
-
-## Configuration des URLS
-
-Pour qu'une vue puisse être appelée, il est nécessaire que chaque application ait un fichier nommé `urls.py` qui contient un code similaire à ceci :
-
-```python linenums="1"
-from django.urls import path
-
-from . import views
-
-urlpatterns = [
-    path('', views.index, name='index'),
-]
-```
-
-Le fichier `actc/urls.py` de notre projet doit ensuite inclure les URLS de chaque application.
-
-
-```python linenums="1" title="actc/urls.py" hl_lines="8"
-from django.contrib import admin
-from django.urls import include, path
-
-# ...
-
-urlpatterns = [
-    # ...
-    path('mesh-process/', include('mesh_process.urls')),
-    path('admin/', admin.site.urls),
-    # ...
-]
-```
-
diff --git a/Documentation/mkdocs.yml b/Documentation/mkdocs.yml
index 3d51c73..9a58cdb 100644
--- a/Documentation/mkdocs.yml
+++ b/Documentation/mkdocs.yml
@@ -1,5 +1,5 @@
-site_name: In Code We Trust
-repo_url: https://gitedu.hesge.ch/in-code-we-trust/documentation
+site_name: Documentation Quizz Game
+repo_url: https://gitedu.hesge.ch/architecture-web/architecture-et-application-web-2022-2023-tp-rajohnson
 repo_name: GitLab
 edit_uri: blob/main/docs
 theme:
@@ -57,17 +57,17 @@ nav:
       - Joueurs:
         - GET /api/v1/users/:username: 'api/get_user_info.md'
       - Administrateurs:
+        - GET /api/v1/admins/:admin: 'api/get_admin_info.md'
         - Gestion d'utilisateurs:
-          - GET /api/v1/admins/:admin/:admin: 'api/view_management.md'
-          - GET /api/v1/admins/:admin/users: api/prod_config.md
-          - POST /api/v1/admins/:admin/users: api/file_management.md
-          - PUT /api/v1/admins/:admin/users/:username: api/file_management.md
-          - DELETE /api/v1/admins/:admin/users/:username: api/file_management.md
+          - GET /api/v1/admins/:admin/users: api/get_users.md
+          - POST /api/v1/admins/:admin/users: api/add_user.md
+          - PUT /api/v1/admins/:admin/users/:username: api/update_user.md
+          - DELETE /api/v1/admins/:admin/users/:username: api/delete_user.md
         - Gestion des questions:
-          - GET /api/v1/admins/:admin/questions: api/prod_config.md
-          - POST /api/v1/admins/:admin/questions: api/file_management.md
-          - PUT /api/v1/admins/:admin/questions/:question_id: api/file_management.md
-          - DELETE /api/v1/admins/:admin/questions/:question_id: api/file_management.md
+          - GET /api/v1/admins/:admin/questions: api/get_questions.md
+          - POST /api/v1/admins/:admin/questions: api/add_question.md
+          - PUT /api/v1/admins/:admin/questions/:question_id: api/update_question.md
+          - DELETE /api/v1/admins/:admin/questions/:question_id: api/delete_question.md
     - Explication de l'implémentation:
       - Introduction:
         - frontend/index.md
@@ -149,3 +149,5 @@ extra_javascript:
   - javascripts/mathjax.js
   - https://polyfill.io/v3/polyfill.min.js?features=es6
   - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
+  - https://cdn.tailwindcss.com
+
-- 
GitLab