From a09e8acbab82b25e80ef365da9da1d5186b68808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Tue, 13 Feb 2024 10:52:48 +0100 Subject: [PATCH] TP3 --- TP3/BDD/MCD.mcd | Bin 0 -> 29598 bytes TP3/BDD/MCD.png | Bin 0 -> 25761 bytes TP3/BDD/MPD.png | Bin 0 -> 33917 bytes TP3/BDD/sql/data.sql | 31 +++++++++++++ TP3/BDD/sql/model.sql | 35 ++++++++++++++ TP3/BDD/sql/test.sql | 7 +++ TP3/index1.html | 104 ++++++++++++++++++++++++++++++++++++++++++ TP3/js/chat.js | 85 ++++++++++++++++++++++++++++++++++ TP3/js/utils.js | 35 ++++++++++++++ TP3/php/chat.php | 47 +++++++++++++++++++ TP3/php/constants.php | 7 +++ TP3/php/database.php | 51 +++++++++++++++++++++ 12 files changed, 402 insertions(+) create mode 100644 TP3/BDD/MCD.mcd create mode 100644 TP3/BDD/MCD.png create mode 100644 TP3/BDD/MPD.png create mode 100644 TP3/BDD/sql/data.sql create mode 100644 TP3/BDD/sql/model.sql create mode 100644 TP3/BDD/sql/test.sql create mode 100644 TP3/index1.html create mode 100644 TP3/js/chat.js create mode 100644 TP3/js/utils.js create mode 100644 TP3/php/chat.php create mode 100644 TP3/php/constants.php create mode 100644 TP3/php/database.php diff --git a/TP3/BDD/MCD.mcd b/TP3/BDD/MCD.mcd new file mode 100644 index 0000000000000000000000000000000000000000..d0f21298bfed6526afff705abb03349fad774727 GIT binary patch literal 29598 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 YHWJ%-M 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 literal 0 HcmV?d00001 diff --git a/TP3/BDD/MPD.png b/TP3/BDD/MPD.png new file mode 100644 index 0000000000000000000000000000000000000000..49826069d56a404878b9c253d6a1603b3461c17f GIT binary patch literal 33917 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 literal 0 HcmV?d00001 diff --git a/TP3/BDD/sql/data.sql b/TP3/BDD/sql/data.sql new file mode 100644 index 0000000..103a5e3 --- /dev/null +++ b/TP3/BDD/sql/data.sql @@ -0,0 +1,31 @@ + +DELETE FROM users; +DELETE FROM channels; +DELETE FROM messages; + +-- ------------------------------------------------------------------------------- +-- --- Populate users database ---------------------------------------------------------------------------------------------------------------------------------- +INSERT INTO users(login, nickname, password) VALUES('etudiant0', 'E0','mp0'); +INSERT INTO users(login, nickname, password) VALUES('etudiant1', 'E1','mp1'); +INSERT INTO users(login, nickname, password) VALUES('etudiant2', 'E2','mp2'); +INSERT INTO users(login, nickname, password) VALUES('etudiant3', 'E3','mp3'); + +-- ------------------------------------------------------------------------------- +-- --- Populate channels database --------------------------------------------------- +-- ------------------------------------------------------------------------------- +ALTER SEQUENCE channels_id_seq RESTART; +INSERT INTO channels(name) VALUES('General'); +INSERT INTO channels(name) VALUES('Musique'); +INSERT INTO channels(name) VALUES('Voyage'); +INSERT INTO channels(name) VALUES('Cinema'); +INSERT INTO channels(name) VALUES('Bricolage'); + +------------------------------------------------------------------------------- +--- Populate messages database ------------------------------------------------ +------------------------------------------------------------------------------- +ALTER SEQUENCE messages_id_seq RESTART; +INSERT INTO messages(userLogin, channelid, message) VALUES('etudiant0', 1, 'a'); +INSERT INTO messages(userLogin, channelid, message) VALUES('etudiant1', 1, 'b'); +INSERT INTO messages(userLogin, channelid, message) VALUES('etudiant0', 1, 'c'); +INSERT INTO messages(userLogin, channelid, message) VALUES('etudiant2', 3, 'd'); +INSERT INTO messages(userLogin, channelid, message) VALUES('etudiant3', 4, 'e'); diff --git a/TP3/BDD/sql/model.sql b/TP3/BDD/sql/model.sql new file mode 100644 index 0000000..75f4509 --- /dev/null +++ b/TP3/BDD/sql/model.sql @@ -0,0 +1,35 @@ + +DROP TABLE IF EXISTS messages; +DROP TABLE IF EXISTS channels; +DROP TABLE IF EXISTS users; + +CREATE TABLE users +( + login VARCHAR(20) PRIMARY KEY, + nickname VARCHAR(20) NOT NULL, + password VARCHAR(40) NOT NULL +); + + +CREATE TABLE channels +( + id SERIAL PRIMARY KEY, + name VARCHAR(20) NOT NULL +); + + +CREATE TABLE messages +( + id SERIAL PRIMARY KEY, + userLogin VARCHAR(20) NOT NULL, + channelid INT NOT NULL, + message VARCHAR(256) NOT NULL, + timestamp TIMESTAMP NOT NULL default CURRENT_TIMESTAMP, + FOREIGN KEY(userLogin) REFERENCES users(login) + ON UPDATE CASCADE ON DELETE CASCADE, + FOREIGN KEY(channelid) REFERENCES channels(id) + ON UPDATE CASCADE ON DELETE CASCADE +); + + + diff --git a/TP3/BDD/sql/test.sql b/TP3/BDD/sql/test.sql new file mode 100644 index 0000000..219a6dd --- /dev/null +++ b/TP3/BDD/sql/test.sql @@ -0,0 +1,7 @@ +SELECT name FROM channels; + +SELECT nickname, message, timestamp FROM users JOIN messages ON users.login = messages.userlogin WHERE messages.channelid = 1; + +INSERT INTO messages (userlogin, channelid, message) VALUES ('etudiant0', 1, 'Vive Star Citizen !'); + +SELECT * FROM messages; \ No newline at end of file diff --git a/TP3/index1.html b/TP3/index1.html new file mode 100644 index 0000000..ec4984f --- /dev/null +++ b/TP3/index1.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Chat + + + + + + + + + + + +
+

Chat

+
+
+ + +
+
+ + +
+

Authentification

+
+
+
+ Login : +
+ +
+
+
+ Mot de passe : +
+ +
+
+ + +
+ + +
+
+ + +
+
+
+
+ Canaux : +
+ +
+ Rafraîchissement : +
+ +
+ secondes : +
+
+
+
+
+
+ Message > +
+ +
+ + +
+
+ + + + diff --git a/TP3/js/chat.js b/TP3/js/chat.js new file mode 100644 index 0000000..643199d --- /dev/null +++ b/TP3/js/chat.js @@ -0,0 +1,85 @@ +console.log("chat.js loaded"); + +// Define callbacks +/* +let envoyerB = document.querySelector(".secon"); +envoyerB.addEventListener("submit", login); + +let sedecB = document.querySelector(".sedec"); +sedecB.addEventListener("click", logout); +*/ + + +function getChannels(){ + ajaxRequest("GET", "http://serveur-ajax-s3.felix/TP3/php/chat.php?request=channels", displayChannels); +} + +function displayChannels(channels){ + let channelsList = document.getElementById("channels-list"); + channels.forEach(channel => { + if(channel.id === 1){ + let option = document.createElement("option"); + option.value = channel.id; + option.textContent = channel.name; + channelsList.appendChild(option); + option.selected = true; + }else{ + let option = document.createElement("option"); + option.value = channel.id; + option.textContent = channel.name; + channelsList.appendChild(option); + } + }); + getMessages(); +} + +function getMessages(){ + let channelsList = document.getElementById("channels-list"); + if(channelsList.selectedIndex !== -1) { + let channelId = channelsList.options[channelsList.selectedIndex].value; + ajaxRequest("GET", "http://serveur-ajax-s3.felix/TP3/php/chat.php?request=messages&channel_id=" + channelId, displayMessages); + }else{ + console.log("No channel selected"); + } +} + +function displayMessages(messages){ + let chatRoom = document.getElementById("chat-room"); + chatRoom.innerHTML = ""; + if (messages.length === 0){ + let messageDiv = document.createElement("div"); + messageDiv.classList.add("message"); + chatRoom.appendChild(messageDiv); + }else{ + messages.forEach(message => { + let messageDiv = document.createElement("div"); + messageDiv.classList.add("message"); + messageDiv.textContent = message.nickname + " : " + message.message; + chatRoom.appendChild(messageDiv); + }); + } + chatRoom.scrollTop = chatRoom.scrollHeight; +} + +function sendMessage(){ + event.preventDefault(); + let channelsList = document.getElementById("channels-list"); + let channelId = channelsList.options[channelsList.selectedIndex].value; + const message = document.getElementById("message").value; + document.getElementById("message").value = ""; + ajaxRequest("POST", "http://serveur-ajax-s3.felix/TP3/php/chat.php?request=messages&channel_id=" + channelId + "&userlogin=etudiant0&message=" + message, getMessages, message); +} + +getChannels(); + +document.getElementById("channels-list").addEventListener("change", getMessages); + +document.getElementById("send-message").addEventListener("click", sendMessage); + +document.getElementById("message").addEventListener("keypress", function(event){ + if(event.key === "Enter"){ + sendMessage(); + } +}); + +setInterval(getMessages, 1000); \ No newline at end of file diff --git a/TP3/js/utils.js b/TP3/js/utils.js new file mode 100644 index 0000000..65041dd --- /dev/null +++ b/TP3/js/utils.js @@ -0,0 +1,35 @@ +console.log("utils.js loaded"); + +function ajaxRequest(type, url, callback=null, data=null){ + console.log("ajaxRequest called"); + console.log("type: " + type); + console.log("url: " + url); + let xhr = new XMLHttpRequest(); + xhr.open(type, url, true); + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.onload = () => { + switch (xhr.status){ + case 200: + case 201: + let parsedResponse = JSON.parse(xhr.responseText); + if (callback){ + callback(parsedResponse); + } + break; + default: + errorAlert("Erreur " + xhr.status + ": " + xhr.statusText); + break; + } + }; + xhr.send(data); +} + + +function errorAlert(message){ + let error = document.getElementById("errors"); + error.textContent = message; + error.classList.toggle("d-none"); + setTimeout(() => { + error.classList.toggle("d-none"); + }, 5000); +} diff --git a/TP3/php/chat.php b/TP3/php/chat.php new file mode 100644 index 0000000..425fd67 --- /dev/null +++ b/TP3/php/chat.php @@ -0,0 +1,47 @@ + $id, 'name' => $channel['name']]; + $id++; + } + echo json_encode($formattedChannels); + } + else{ + echo json_encode('No channels found'); + } +} + +if(isset($_GET['request']) && $_GET['request'] == 'messages' && $_GET['channel_id']){ + $channel_id = intval($_GET['channel_id']); + $messages = dbGetMessages($pdo, $channel_id); + if($messages){ + echo json_encode($messages); + } + else{ + echo json_encode([]); + } +} + +if(isset($_POST['request']) && $_POST['request'] == 'messages' && $_POST['channel_id'] && $_POST['userlogin'] && $_POST['message']){ + $channel_id = intval($_POST['channel_id']); + $userlogin = $_POST['userlogin']; + $message = $_POST['message']; + $result = dbAddMessage($pdo, $userlogin, $channel_id, $message); + if($result){ + echo json_encode('Message added'); + } + else{ + echo json_encode('Message not added'); + } +} \ No newline at end of file diff --git a/TP3/php/constants.php b/TP3/php/constants.php new file mode 100644 index 0000000..180f99c --- /dev/null +++ b/TP3/php/constants.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/TP3/php/database.php b/TP3/php/database.php new file mode 100644 index 0000000..5aa218c --- /dev/null +++ b/TP3/php/database.php @@ -0,0 +1,51 @@ +getMessage(); + } +} + +function dbGetChannels($pdo){ + $statement = $pdo->prepare('SELECT name FROM channels'); + $statement->execute(); + $result = $statement->fetchAll(PDO::FETCH_ASSOC); + if(!empty($result)){ + return $result; + } + else{ + return false; + } +} + +function dbGetMessages($pdo, $channel_id){ + $statement = $pdo->prepare('SELECT nickname, message, timestamp FROM users JOIN messages ON users.login = messages.userlogin WHERE messages.channelid = :channel_id;'); + $statement->bindParam(':channel_id', $channel_id); + $statement->execute(); + $result = $statement->fetchAll(PDO::FETCH_ASSOC); + if(empty($result)){ + return false; + } + else{ + return $result; + } +} + +function dbAddMessage($pdo, $userlogin, $channelid, $message){ + $statement = $pdo->prepare('INSERT INTO messages (userlogin, channelid, message) VALUES (:userlogin, :channelid, :message)'); + $statement->bindParam(':userlogin', $userlogin); + $statement->bindParam(':channelid', $channelid); + $statement->bindParam(':message', $message); + $statement->execute(); + $result = $statement->rowCount(); + if($result == 1){ + return true; + } + else{ + return false; + } +} \ No newline at end of file