diff --git a/Lab_3/Twidder/database b/Lab_3/Twidder/database new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Lab_3/Twidder/database.db b/Lab_3/Twidder/database.db index 8fe4ebebb2292c96f53f6a2c93251177c70eb068..b8863ccbb4f1c57137f8f44aa97d3cac6c1560e4 100644 Binary files a/Lab_3/Twidder/database.db and b/Lab_3/Twidder/database.db differ diff --git a/Lab_3/Twidder/server.py b/Lab_3/Twidder/server.py index c167af9baa4955f519dbb10c5baa3f4c427442fb..c345c922635f5f9bec0fcc7c81c6e460372a72a8 100644 --- a/Lab_3/Twidder/server.py +++ b/Lab_3/Twidder/server.py @@ -9,9 +9,12 @@ import database_helper # source "/Users/lorenzo/OneDrive - Linköpings universitet/Skola/DI3B/TDDD97/virtualenv/bin/activate" # python3 server.py -# http://127.0.0.1:5000/myServer' +# http://127.0.0.1:5000/myServer # sqlite3 database.db ".read schema.sql" +#Questions: +#Why does localhost in URL not work? + app = Flask(__name__, static_url_path = '/static')#in case flask does not recognize folder app.debug = True session = {'token':'email'} @@ -92,6 +95,7 @@ def sign_up(): tmp = input_has_error('email') if tmp[0]: + print(tmp[1]) return jsonify({}), tmp[1] email = tmp[2] @@ -156,17 +160,20 @@ def change_password(): # Validate Token tmp = token_has_error(token) if tmp[0]: + print("validate token") return jsonify({}), tmp[1] # Validate Old Password tmp = input_has_error('old_password') if tmp[0]: + print("validate old password") return jsonify({}), tmp[1] old_password = tmp[2] # Validate New Password tmp = input_has_error('new_password') if tmp[0]: + print("validate new password") return jsonify({}), tmp[1] new_password = tmp[2] @@ -177,6 +184,7 @@ def change_password(): if old_password == database_helper.find_user(email)[1]: #checks if old_password is correct status = database_helper.update_user(new_password, email) if status: + print("Password changed") return jsonify({}), 204 # "Password has been changed!" else: return jsonify({}), 500 # "Password has not been changed" diff --git a/Lab_3/Twidder/static/client.css b/Lab_3/Twidder/static/client.css index 2dc5da192dae09f6ac4fde68ed88fc0acc1cf59c..ed4d8f6a197114a38324290aac70379ad5f9ce3c 100644 --- a/Lab_3/Twidder/static/client.css +++ b/Lab_3/Twidder/static/client.css @@ -109,7 +109,7 @@ h1, h3{ #error{ bottom: 20px; - left:30px; + left: 4px; color: rgb(252, 6, 170); position: relative; font-size: 12px; diff --git a/Lab_3/Twidder/static/client.js b/Lab_3/Twidder/static/client.js index 18db399d1c34aa88254c512fd389e074abf29af4..0a5fad9358c24f6f8bf121d174cd388bb427f258 100644 --- a/Lab_3/Twidder/static/client.js +++ b/Lab_3/Twidder/static/client.js @@ -4,22 +4,13 @@ var windowDiv; var welcomeDiv; var profileDiv; var url = 'http://127.0.0.1:5000/myServer/'; +var curr_page = ""; // source "/Users/lorenzo/OneDrive - Linköpings universitet/Skola/DI3B/TDDD97/virtualenv/bin/activate" -// - - - - - Init Request Objects - - - - - // - -//Todo (Lawrence) -/* - Sign up - change password - post message (+ updateWall) - get message by token (+ kommentera fram stycke i reloadWall) -*/ -// Todo - implement -// Sign Up Request Object +// - - - - - Init Request Objects - - - - - // // Sign In Request Object var signInRequest = new XMLHttpRequest(); @@ -32,28 +23,21 @@ signInRequest.onreadystatechange = function() { let token = this.getResponseHeader("Authorization") localStorage.setItem("currentUser", token); - // Changes the view to profile view an loads user info + // Changes the view to profile view and loads user info displayView(); - setUserDetails("home"); - // Todo - kommentera fram när den är klar - // reloadWall("home"); } else if (this.status == 400) { - // Todo - implement - console.log('got this: 400') + errorMessage.innerHTML = "Error 400: Incorrect format"; } else if (this.status == 404) { - // Todo - implement - console.log('got this: 404') + errorMessage.innerHTML = "Error 404: No user with that email exists"; } else if (this.status == 401) { - // Todo - implement - console.log('got this: 401') + errorMessage.innerHTML = "Error 401: Incorrect password"; } else { - // Todo - implement - console.log('unknown error -_-') + errorMessage.innerHTML = "Unknown error"; } } }; @@ -73,56 +57,79 @@ signOutRequest.onreadystatechange = function() { displayView(); } else if (this.status == 401) { - // Todo - implement - console.log('got this: 401') + console.log("Error 401: You are not loged in"); } else { - // Todo - implement - console.log('unknown error -_-') + console.log("Unknown error"); } } }; +// Sign Up Request Object var signUpRequest = new XMLHttpRequest(); -signInRequest.onreadystatechange = function () { +signUpRequest.onreadystatechange = function () { if (this.readyState == 4) { let errorMessage = document.getElementById("error"); if (this.status == 204) { - errorMessage.innerHTML = "You are signed in"; - let token = this.getResponseHeader("Authorization") - localStorage.setItem("currentUser", token); - - // Changes the view to profile view an loads user info - displayView(); - - setUserDetails("home"); - // Todo - kommentera fram när den är klar - // reloadWall("home"); + errorMessage.innerHTML = "You have signed up"; } else if (this.status == 400) { // Todo - implement - console.log('got this: 400') + errorMessage.innerHTML = "Enter the data in the correct format"; } - else if (this.status == 404) { + else if (this.status == 401) { // Todo - implement - console.log('got this: 404') + errorMessage.innerHTML = "Enter the data in the correct format"; + console.log('got this: 401'); } - else if (this.status == 401) { + else if (this.status == 409) { // Todo - implement - console.log('got this: 401') + console.log('got this: 409'); } + else if (this.status == 500) { + // Todo - implement + console.log('got this: 500'); + } else { // Todo - implement - console.log('unknown error -_-') + console.log('unknown error -_-'); } } }; -// Todo - implement // Change Password Request Object +var ChangePassRequest = new XMLHttpRequest(); +ChangePassRequest.onreadystatechange = function () { + if (this.readyState == 4) { + + let errorMessage = document.getElementById("match_error"); + if (this.status == 204) { + console.log("inside 204 statement"); + errorMessage.innerHTML = "Password has been changed!"; + console.log('Password has been changed!'); + } + else if (this.status == 400) { + // Todo - implement + console.log('got this: 400'); + } + else if (this.status == 401) { + // Todo - implement + console.log('got this: 401'); + } + else if (this.status == 500) { + // Todo - implement + console.log('got this: 500'); + } + else { + // Todo - implement + console.log('unknown error -_-'); + } + errorMessage.style.display = "block"; + } +}; -// Get use data by token +// Get user data by token Request Object var dataByTokenRequest = new XMLHttpRequest(); dataByTokenRequest.onreadystatechange = function() { if (this.readyState == 4) { @@ -140,27 +147,24 @@ dataByTokenRequest.onreadystatechange = function() { userTable.rows[5].cells[1].innerHTML = userDataArray["data"].country; localStorage.setItem("homeEmail", userDataArray["data"].email); + reloadWall("home"); } else if (this.status == 401) { - // Todo - implement - console.log('got this: 401') + console.log("Error 401: You are not loged in"); } else if (this.status == 400) { - // Todo - implement - console.log('got this: 400') + console.log("Error 400: Incorrect format"); } else if (this.status == 404) { - // Todo - implement - console.log('got this: 404') + console.log("Error 404: No user with that email exists"); } else { - // Todo - implement - console.log('unknown error -_-') - } + console.log("Unknown error"); + } } }; -// Get use data by email +// Get user data by email Request Object var dataByEmailRequest = new XMLHttpRequest(); dataByEmailRequest.onreadystatechange = function() { if (this.readyState == 4) { @@ -180,42 +184,67 @@ dataByEmailRequest.onreadystatechange = function() { userTable.rows[5].cells[1].innerHTML = userDataArray["data"].country; localStorage.setItem("browseEmail", userDataArray["data"].email); + errorMessage.iinnerHTML = "" + reloadWall("browse"); } - else if (this.status == 401) { - // Todo - implement - console.log('got this: 401') - //errorMessage.innerHTML = "something"; + else { + if (this.status == 401) { + errorMessage.innerHTML = "Error 401: You are not loged in"; + } + else if (this.status == 400) { + errorMessage.innerHTML = "Error 400: Incorrect format"; + } + else if (this.status == 404) { + errorMessage.innerHTML = "Error 404: No user with that email exists"; + } + else { + errorMessage.innerHTML = "Unknown error"; + } localStorage.setItem("browseEmail", ""); } + } +}; + +// Get Messages By Token Request Object +var messagesByTokenRequest = new XMLHttpRequest(); +messagesByTokenRequest.onreadystatechange = function() { + if (this.readyState == 4) { + + if (this.status == 200) { + + let currentWall = JSON.parse(this.responseText); + + // Fromating the text before putting to wall + let complete = ""; + for (let i = 0; i < currentWall.data.length; i++) { + complete += currentWall.data[i].person_who_posted + ': ' + currentWall.data[i].message + "</br>"; + } + document.getElementById('homePostedMessagesDiv').innerHTML = complete; + } + else if (this.status == 204) { + console.log("Success, but no messages to receive"); + } + else if (this.status == 401) { + console.log("Error 401: You are not loged in"); + } else if (this.status == 400) { - // Todo - implement - console.log('got this: 400') - localStorage.setItem("browseEmail", ""); + console.log("Error 400: Incorrect format"); } else if (this.status == 404) { - // Todo - implement - console.log('got this: 404') - localStorage.setItem("browseEmail", ""); + console.log("Error 404: No user with that email exists"); } else { - // Todo - implement - console.log('unknown error -_-') - localStorage.setItem("browseEmail", ""); + console.log("Unknown error"); } } }; -// Todo - implement -// Get Messages By Token Request Object - - - // Get Messages By Email Request Object var messagesByEmailRequest = new XMLHttpRequest(); messagesByEmailRequest.onreadystatechange = function() { if (this.readyState == 4) { - if (this.status == 200 || this.status == 204) { + if (this.status == 200) { let currentWall = JSON.parse(this.responseText); @@ -225,30 +254,56 @@ messagesByEmailRequest.onreadystatechange = function() { complete += currentWall.data[i].person_who_posted + ': ' + currentWall.data[i].message + "</br>"; } document.getElementById('browsePostedMessagesDiv').innerHTML = complete; - // Todo - implement - + + } + else if (this.status == 204) { + console.log("Success, but no messages to receive"); } else if (this.status == 401) { - // Todo - implement - console.log('got this: 401') + console.log("Error 401: You are not loged in"); } else if (this.status == 400) { - // Todo - implement - console.log('got this: 400') + console.log("Error 400: Incorrect format"); } else if (this.status == 404) { - // Todo - implement - console.log('got this: 404') + console.log("Error 404: No user with that email exists"); } else { - // Todo - implement - console.log('unknown error -_-') + console.log("Unknown error"); } } }; -// Todo - implement // Post Message Request Object +var postMessageRequest = new XMLHttpRequest(); +postMessageRequest.onreadystatechange = function () { + if (this.readyState == 4) { + + let errorMessage = document.getElementById('searchMessage'); + if (this.status == 204) { + console.log('Message posted!') + errorMessage.innerHTML = ""; + if (curr_page != null && curr_page != "") + reloadWall(curr_page); + } + else if (this.status == 400) { + errorMessage.innerHTML = "Error 400: Incorrect format"; + } + else if (this.status == 404) { + errorMessage.innerHTML = "Error 404: No user selected to write to"; + } + else if (this.status == 401) { + errorMessage.innerHTML = "Error 401: You are not loged in"; + } + else if (this.status == 500) { + errorMessage.innerHTML = "Error 500: Error at server side"; + } + else { + errorMessage.innerHTML = "Unknown error"; + } + } +}; + // - - - - - Init functions - - - - - // @@ -260,12 +315,15 @@ displayView = function(){ windowDiv.innerHTML = profileDiv.innerHTML; }; + // - - - - - The function when page loads - - - - - // window.onload = function () { - // Todo - Delete when done - används för att hoppa tillbaka till rtt view under utveckling - localStorage.setItem("currentUser", ""); + // Delete when done - används för att hoppa tillbaka till rtt view under utveckling + // localStorage.setItem("currentUser", ""); + // localStorage.setItem("homeEmail", ""); + // localStorage.setItem("browseEmail", ""); // All key/value pairs stored in out localStorage // If first time? check this: @@ -285,7 +343,6 @@ window.onload = function () { displayView(); // Load user details to home page and browse page - // Todo - kan bli problem om dess inte innehåller giltig email setUserDetails("home"); setUserDetails("browse"); }; @@ -317,9 +374,9 @@ function setUserDetails(who) { dataByEmailRequest.send(); } } + return false; } - // - - - - - Sign Up/In/Out - - - - - // function sign_up() { @@ -337,6 +394,7 @@ function sign_up() { repeat_password: form[7].value }; + // Error checks if (user.password.length < minPassLength) errorMess.innerHTML = "Password's length is too short"; @@ -344,28 +402,10 @@ function sign_up() { errorMess.innerHTML = "Passwords does not match"; else { - // // Todo - // // Submission to "server" - // let signUpObj = serverstub.signUp(user); - // // Set message to user - // errorMess.innerHTML = signUpObj["message"]; - - //xhttp.addEventListener("load", reqListener); - xhttp.open("POST", url + "sign_up", true); - signInRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); - xhttp.send(JSON.stringify({ - email: email, - password: password, - firstname: firstname, - familyname: familyname, - gender: gender, - city: city, - country: country - })); - // obj = JSON.parse(xhttp.responseText); - // alert(obj.alert) -//----------------//----------------//----------------//---------------- - + // Sending sign_ou request to "server" + signUpRequest.open("POST", url + "sign_up", true); + signUpRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + signUpRequest.send(JSON.stringify(user)); } return false; } @@ -397,6 +437,8 @@ function sign_out(){ signOutRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); signOutRequest.setRequestHeader("Authorization", token) signOutRequest.send(); + + return false; } @@ -425,6 +467,8 @@ function showPage(ourEvent, name) { // Select only the one we want let selected_tab = document.getElementById(name); selected_tab.style.display = "block"; + + return false; } @@ -447,15 +491,12 @@ function change_password(ourEvent){ error_text.innerHTML = "New password and confirm password does not match"; } else { - - // Todo - // Success - let message = serverstub.changePassword(token, old_pass, new_pass); - - // Set error text - error_text.innerHTML = message["message"]; + ChangePassRequest.open("PUT", url + "change_password", true); + ChangePassRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + ChangePassRequest.setRequestHeader("Authorization", token) + ChangePassRequest.send(JSON.stringify({old_password:old_pass, new_password:new_pass})); } - error_text.style.display = "block"; + return false; } // - - - - - Changing the wall - - - - - // @@ -464,15 +505,27 @@ function change_password(ourEvent){ function updateWall(who){ // "who" could be either home or browse, this way know which wall to write on let messageToWall = document.getElementById(who + 'Textarea').value; + let errorMessage = document.getElementById('searchMessage'); let token = localStorage.getItem("currentUser"); let email = localStorage.getItem(who + "Email"); + curr_page = who; - // Todo - // Send user's message to the server - serverstub.postMessage(token, messageToWall, email); + if (email != null && email != "" && token != null && token != "") { + // Send user's message to the server + postMessageRequest.open("POST", url + "post", true); + postMessageRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + postMessageRequest.setRequestHeader("Authorization", token) + postMessageRequest.send(JSON.stringify({ email: email, message: messageToWall })); + + errorMessage.innerHTML = ""; + } + else{ + errorMessage.innerHTML = "No user selected to write to"; + } + + // Clear the text area the user just wrote in document.getElementById(who + 'Textarea').value = ""; - return false; } @@ -482,18 +535,16 @@ function reloadWall(who) { let token = localStorage.getItem("currentUser"); let email = localStorage.getItem(who + "Email"); - // Get messages from my own wall + // If wanting messages from my own wall if (who == 'home') { // Send request to server about receiving the info - - // Comment - // messagesByTokenRequest.open("GET", url + "getUserMessageByToken/" + email, true); - // messagesByTokenRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); - // messagesByTokenRequest.setRequestHeader("Authorization", token) - // messagesByTokenRequest.send(); + messagesByTokenRequest.open("GET", url + "getUserMessageByToken", true); + messagesByTokenRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + messagesByTokenRequest.setRequestHeader("Authorization", token) + messagesByTokenRequest.send(); } - // Get messages from another's wall + // If wanting messages from another's wall else if (who == 'browse' && email != null && email != "") { // Send request to server about receiving the info messagesByEmailRequest.open("GET", url + "getMessagesByEmail/" + email, true); @@ -509,8 +560,8 @@ function reloadWall(who) { function searchAnotherUser(event){ let token = localStorage.getItem("currentUser"); - // Todo - download the wall of the user we searched for ? - // let user_obj = serverstub.getUserMessagesByEmail(token, email); + // Reseting the error messages + document.getElementById('searchMessage').innerHTML = ""; if(token != "") { diff --git a/Lab_3/Twidder/static/serverstub.js b/Lab_3/Twidder/static/serverstub.js index ad5c722f67d50028e8dfd0bfe507851069e406f3..949405c3b0f3567e1294e4b322b6909e2a322704 100644 --- a/Lab_3/Twidder/static/serverstub.js +++ b/Lab_3/Twidder/static/serverstub.js @@ -6,6 +6,8 @@ * If you're a student, you shouldn't need to look through this file, * the description of how it works is in the lab instructions. **/ + + var serverstub = (function() { 'use strict';