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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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