From 394055b19b0ae0b7d03ad48375edd94a6612e90f Mon Sep 17 00:00:00 2001 From: thaaoblues Date: Sun, 22 Oct 2023 19:24:59 +0200 Subject: [PATCH] premier commit --- .gitignore | 1 + api.md | 171 ++++++++++++++++++++++++++++++++++++++++++++++ api.php | 74 ++++++++++++++++++++ bdd.php | 56 +++++++++++++++ index.php | 49 +++++++++++++ init_db.php | 70 +++++++++++++++++++ readme.md | 48 +++++++++++++ session_verif.php | 13 ++++ televerser.php | 97 ++++++++++++++++++++++++++ 9 files changed, 579 insertions(+) create mode 100644 .gitignore create mode 100644 api.md create mode 100644 api.php create mode 100644 bdd.php create mode 100644 index.php create mode 100644 init_db.php create mode 100644 readme.md create mode 100644 session_verif.php create mode 100644 televerser.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7f6ca2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +test_creds.php \ No newline at end of file diff --git a/api.md b/api.md new file mode 100644 index 0000000..a943d5c --- /dev/null +++ b/api.md @@ -0,0 +1,171 @@ +# API PHP + +Ce document décrit le comportement de l'api utilisée par le site + +## Endpoints + +### Authentification + +- **Endpoint:** `auth.php?auth` +- **Description:** Authentifie l'utilisateur et initialise une session. +- **Méthode HTTP:** GET +- **Réponse JSON:** + ```json + { + "status": 1, + "msg": "Authentification réussie." + } + ``` + En cas d'erreur : + ```json + { + "status": 0, + "msg": "Erreur pendant le traitement de la requête." + } + +### Déconnexion + +- **Endpoint:** `auth.php?unauth` +- **Description:** Déconnecte l'utilisateur en mettant fin à la session. +- **Méthode HTTP:** GET +- **Réponse JSON:** + ```json + { + "status": 1, + "msg": "Déconnexion réussie." + } + ``` + +### Test d'authentification + +- **Endpoint:** `auth.php?test_auth` +- **Description:** Vérifie si l'utilisateur est authentifié. +- **Méthode HTTP:** GET +- **Réponse JSON:** + - Si l'utilisateur est authentifié : + ```json + { + "status": 1, + "msg": "Utilisateur bien authentifié." + } + ``` + - Si l'utilisateur n'est pas authentifié : + ```json + { + "status": 4, + "msg": "Utilisateur non authentifié." + } + ``` + +## Statuts de réponse + +- **Status 1 :** Requête valide. +- **Status 0 :** Erreur pendant le traitement de la requête. +- **Status 2 :** Requête invalide. +- **Status 3 :** Session expirée. +- **Status 4 :** Utilisateur non authentifié, requête interdite. + +## Gestion des sessions + +Le fichier `session_verif.php` est inclus pour la gestion des sessions. Assurez-vous qu'il est présent et correctement configuré. + +--- + +**Remarque :** Ce document est une documentation basique. Assurez-vous d'ajuster et d'améliorer la sécurité en fonction des besoins spécifiques de votre application. + + +## upload de plusieurs fichiers : + +```javascript +async function uploadMultiple(donneesFormulaires) { + try { + const reponse = await fetch("https://example.com/api", { + method: "POST", + body: donneesFormulaires, + }); + const resultat = await reponse.json(); + console.log("Réussite :", resultat); + } catch (erreur) { + console.error("Erreur :", erreur); + } +} + +const docs = document.querySelector('input[type="file"][multiple]'); +const donneesFormulaires = new FormData(); + +donneesFormulaires.append("title", "documents"); + +for (const [i, doc] of Array.from(docs.files).entries()) { + donneesFormulaires.append(`doc_${i}`, doc); +} + +uploadMultiple(donneesFormulaires); +``` + +## upload de données json +```javascript + +async function postJSON(donnees) { + try { + const reponse = await fetch("https://example.com/profile", { + method: "POST", // ou 'PUT' + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(donnees), + }); + + const resultat = await reponse.json(); + console.log("Réussite :", resultat); + } catch (erreur) { + console.error("Erreur :", erreur); + } +} + +const donnees = { login: "Jean Biche" }; +postJSON(donnees); + +``` + +## récupérer des documents + +``` javascript + +async function fetchImage() { + try { + const response = await fetch("flowers.jpg"); + if (!response.ok) { + throw new Error("La réponse n'est pas OK"); + } + const myBlob = await response.blob(); + monImage.src = URL.createObjectURL(myBlob); + } catch (error) { + console.error("Un problème est survenu lors de la récupération :", error); + } +} + + +``` + +[source](https://developer.mozilla.org/fr/docs/Web/API/Fetch_API/Using_Fetch) + + +## récupérer des données +``` javascript + + +async function test_auth(){ + resp = await fetch("/annales/api.php?test_auth"); + data = await resp.json(); + document.getElementById("user_status").innerText = data["msg"]; +} + + async function unauthenticate_user(){ + resp = await fetch("/annales/api.php?unauth"); + data = await resp.json(); + if(data.status == 1){ + document.getElementById("user_status").innerText = data["msg"]; + } + } + +``` \ No newline at end of file diff --git a/api.php b/api.php new file mode 100644 index 0000000..8657633 --- /dev/null +++ b/api.php @@ -0,0 +1,74 @@ + Requète valide + 0 => Erreur pendant le traitement de la requète + 2 => Requète invalide + 3 => Session expirée + 4 => Utilisateur non authentifié, requète interdite + + */ + + include("session_verif.php"); + include("test_creds.php"); + include("bdd.php"); + + + // Get the requested URL + $request_uri = $_SERVER['REQUEST_URI']; + + // Split the URL into an array using the '/' delimiter + $url_parts = explode('/', $request_uri); + + // Remove empty elements from the array + $url_parts = array_filter($url_parts); + + // The first element is the base path (in this case, "/api") + $base_path = array_shift($url_parts); + + + if($_SERVER['REQUEST_METHOD'] === 'GET'){ + if(isset($_GET["auth"])){ + try{ + $_SESSION["utilisateur_authentifie"] = true; + session_regenerate_id(true); + $_SESSION["heure_debut"] = time(); + echo json_encode(["status"=>"1","msg"=>"Authentification réussie."]); + }catch(Exception $e){ + echo( json_encode(["status"=> "0","msg"=> $e->getMessage() ]) ); + } + + } + + if(isset($_GET["unauth"])){ + $_SESSION["utilisateur_authentifie"] = false; + echo json_encode(["status"=>"1","msg"=>"Déconnection réussie."]); + session_destroy(); + session_abort(); + } + + if(isset($_GET["test_auth"])){ + if($_SESSION["utilisateur_authentifie"] == true){ + echo(json_encode(["status"=> "1","msg"=> "Utilisateur bien authentifié."])); + }else{ + echo(json_encode(["status"=> "4","msg"=> "Utilisateur non authentifié."])); + } + } + + } + + + + if($_SERVER['REQUEST_METHOD'] === 'POST'){ + switch(array_shift($url_parts)){ + case "aj_doc": + ajouter_doc($_POST); + break; + default: + echo(json_encode(["status"=> "2","msg"=> "Opération inconnue."])); + } + + } +?> \ No newline at end of file diff --git a/bdd.php b/bdd.php new file mode 100644 index 0000000..76a0d9b --- /dev/null +++ b/bdd.php @@ -0,0 +1,56 @@ +connect_error) { + die("Connection failed: " . $conn->connect_error); +} + + +function ajouter_doc($request){ + + saveFilesFromPost($request); + + if (isset($request['files']) && is_array($request['files'])) { + foreach ($request['files'] as $file) { + $sql="INSERT INTO "; + } + } + +} + +function saveFilesFromPost($postData) { + // Check if the $_POST variable is set and contains files + if (isset($postData['files']) && is_array($postData['files'])) { + // Directory to save the files + $uploadDir = 'archives/'; + + // Iterate through each file in the $_POST['files'] array + foreach ($postData['files'] as $file) { + // Extract file information + $fileName = $file['name']; + $fileData = $file['data']; + + // Decode base64 encoded file data + $fileData = base64_decode($fileData); + + // Create a unique filename to avoid overwriting existing files + $uniqueFileName = uniqid() . '_' . $fileName; + + // Define the path to save the file + $filePath = $uploadDir . $uniqueFileName; + + // Save the file + if (file_put_contents($filePath, $fileData) !== false) { + echo(json_encode(["status"=>"1","msg" =>"File '$uniqueFileName' has been saved successfully."])); + } else { + echo(json_encode(["status"=>"0","msg"=>"Error saving file '$uniqueFileName'"])); + } + } + } else { + echo(json_encode(["status"=>"2","msg"=>"No files in the POST data."])); + } +} + +?> \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..36c2db6 --- /dev/null +++ b/index.php @@ -0,0 +1,49 @@ + + + + + + + Document + + + + connection + déconnection + +
+ +
+ + + \ No newline at end of file diff --git a/init_db.php b/init_db.php new file mode 100644 index 0000000..985fc4e --- /dev/null +++ b/init_db.php @@ -0,0 +1,70 @@ +connect_error) { + die("Connection failed: " . $conn->connect_error); +} + +// Create tables +$sql = " + CREATE TABLE IF NOT EXISTS themes ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL + ); + + CREATE TABLE IF NOT EXISTS ensemble ( + id INT AUTO_INCREMENT PRIMARY KEY, + commentaire_auteur TEXT + ); + + CREATE TABLE IF NOT EXISTS documents ( + id INT AUTO_INCREMENT PRIMARY KEY, + titre VARCHAR(255) NOT NULL, + type INT, + upload_path TEXT NOT NULL, + commentaire_auteur TEXT, + ensemble_id INT, + theme_id INT, + FOREIGN KEY (theme_id) REFERENCES themes(id), + FOREIGN KEY (ensemble_id) REFERENCES ensemble(id) + ); + + CREATE TABLE IF NOT EXISTS exercices ( + id INT AUTO_INCREMENT PRIMARY KEY, + titre VARCHAR(255) NOT NULL, + commentaire_auteur TEXT, + document_id INT, + FOREIGN KEY (document_id) REFERENCES documents(id) + ); + + + CREATE TABLE IF NOT EXISTS exercices_themes ( + id INT AUTO_INCREMENT PRIMARY KEY, + exercice_id INT, + theme_id INT, + FOREIGN KEY (exercice_id) REFERENCES exercices(id), + FOREIGN KEY (theme_id) REFERENCES themes(id) + ); + + + + +"; + +if ($conn->multi_query($sql) === TRUE) { + echo "Tables created successfully"; +} else { + echo "Error creating tables: " . $conn->error; +} + +// Close the connection +$conn->close(); +?> \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..dbe5f06 --- /dev/null +++ b/readme.md @@ -0,0 +1,48 @@ +# Arch'insa +Ce site a pour but à therme de remplacer le site actuel des annales de L'INSA Toulouse, avec une recherche par themes/classes/temps de résolution, la possibilité de prendre directement des photos de son exercice pour le téléverser et d'envoyer toutes sortes de supports tels que des fiches de cours. Des commentaires seront aussi disponibles pour les auteurs pour donner un contexte ou des indications sur un exercice en particulier, ou un paquet de documents en entier. +D'autres fonctionnalités seront ajoutées petit à petit. (si vous avez des suggestions, n'hésitez pas à contacter le club info ou moi directement) + + +## structure bdd +### Table: themes + +| Column | Type | Constraints | +|--------|-----------------|--------------------------| +| id | INT | AUTO_INCREMENT, PRIMARY KEY | +| name | VARCHAR(255) | NOT NULL | + +### Table: exercices_themes + +| Column | Type | Constraints | +|--------------|--------|-------------------------------------------| +| exercice_id | INT | FOREIGN KEY (exercice_id) REFERENCES exercises(id) | +| theme_id | INT | FOREIGN KEY (theme_id) REFERENCES themes(id) | +| PRIMARY KEY | | (exercice_id, theme_id) | + +### Table: exercices + +| Column | Type | Constraints | +|--------------------|---------------|------------------------------------------| +| id | INT | AUTO_INCREMENT, PRIMARY KEY | +| titre | VARCHAR(255) | NOT NULL | +| commentaire_auteur | TEXT | | +| document_id | INT | FOREIGN KEY (document_id) REFERENCES documents(id) | + +### Table: ensemble + +| Column | Type | Constraints | +|--------------------|---------------|------------------------------------------| +| id | INT | AUTO_INCREMENT | +| commentaire_auteur | TEXT | | + +### Table: documents + +| Column | Type | Constraints | +|--------------------|---------------|------------------------------------------| +| id | INT | AUTO_INCREMENT, PRIMARY KEY | +| titre | VARCHAR(255) | NOT NULL | +| type | INT | | +| upload_path | TEXT | NOT NULL | +| commentaire_auteur | TEXT | | +| ensemble_id | INT | FOREIGN KEY (ensemble_id) REFERENCES ensemble(id) | +| theme_id | INT | FOREIGN KEY (theme_id) REFERENCES themes(id) | diff --git a/session_verif.php b/session_verif.php new file mode 100644 index 0000000..65afe9b --- /dev/null +++ b/session_verif.php @@ -0,0 +1,13 @@ + 3600*4){ + session_destroy(); + session_abort(); + echo(json_encode(array("status"=> "3","msg"=>"Session expirée, veuillez vous reconnecter."))); + } +} + +?> \ No newline at end of file diff --git a/televerser.php b/televerser.php new file mode 100644 index 0000000..4ea28bb --- /dev/null +++ b/televerser.php @@ -0,0 +1,97 @@ + + + + + + File Upload + + + + + + + + + + + + + +