diff --git a/TP3/BDD/MCD.mcd b/TP3/BDD/MCD.mcd new file mode 100644 index 0000000..d0f2129 Binary files /dev/null and b/TP3/BDD/MCD.mcd differ diff --git a/TP3/BDD/MCD.png b/TP3/BDD/MCD.png new file mode 100644 index 0000000..6f9744f Binary files /dev/null and b/TP3/BDD/MCD.png differ diff --git a/TP3/BDD/MPD.png b/TP3/BDD/MPD.png new file mode 100644 index 0000000..4982606 Binary files /dev/null and b/TP3/BDD/MPD.png differ 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