From 353395f1b7ba91383fd180c88e1629ca714286ff Mon Sep 17 00:00:00 2001 From: Ayesha Gamage <144423992+ayega233@users.noreply.github.com> Date: Mon, 22 Jan 2024 11:36:52 +0100 Subject: [PATCH] initial --- client.css | 30 ++++++++ client.html | 32 +++++++++ client.js | 0 serverstub.js | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++ wimage.png | Bin 0 -> 14312 bytes 5 files changed, 249 insertions(+) create mode 100644 client.css create mode 100644 client.html create mode 100644 client.js create mode 100644 serverstub.js create mode 100644 wimage.png diff --git a/client.css b/client.css new file mode 100644 index 0000000..fbeded8 --- /dev/null +++ b/client.css @@ -0,0 +1,30 @@ +body{ + width: 500px; + #height: 500px; + background-color: deepskyblue; +} + +#main-left{ +width: 340px; +height: 400px; +background-image: url("wimage.png"); +border: solid; +} + +#right-top { + width: 250px; + height: 100px; + margin-left: 350px; + margin-top: -404px; + background-color: white; + border: solid; +} + +#right-dow { + margin-left: 350px; + margin-top: 10px; + background-color: white; + width: 250px; + height: 284px; + border: solid; +} \ No newline at end of file diff --git a/client.html b/client.html new file mode 100644 index 0000000..a1b09b7 --- /dev/null +++ b/client.html @@ -0,0 +1,32 @@ +<html> + <head> + <link href="client.css" type="text/css" rel="stylesheet"> + <script src="client.js" type="text/javascript"></script> + <script src="serverstub.js" type="text/javascript"></script> + </head> + <body> + <div id="main-left"> + </div> + <div id="right-top"> + <form action="" id="save-form" onsubmit="saveContent(this); return false"> + <div><label for="name">Name</label><input type="text" id="name" name="name"></div> + <div><label for="number">Number</label><input type="text" id="number" name="phonenumber"></div> + <input type="submit"> + </form> + </div> + <div id="right-dow"> + <form action="" id="save-form" onsubmit="saveContent(this); return false"> + <div><label for="name">FirstName</label><input type="text" id="name" name="name"></div> + <div><label for="number">FamilyName</label><input type="text" id="number" name="phonenumber"></div> + <div><label for="name">FirstName</label><input type="text" id="name" name="name"></div> + <div><label for="number">FamilyName</label><input type="text" id="number" name="phonenumber"></div> + <div><label for="name">FirstName</label><input type="text" id="name" name="name"></div> + <div><label for="number">FamilyName</label><input type="text" id="number" name="phonenumber"></div> + <input type="submit"> + </form> + + </div> + + + </body> +</html> \ No newline at end of file diff --git a/client.js b/client.js new file mode 100644 index 0000000..e69de29 diff --git a/serverstub.js b/serverstub.js new file mode 100644 index 0000000..06590bf --- /dev/null +++ b/serverstub.js @@ -0,0 +1,187 @@ +/** + * Serverstub.js + * + * Simple dummy server for TDDD97 + * + * 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'; + + var users; + var loggedInUsers; + + var syncStorage = function(){ + if (localStorage.getItem("users") === null) { + users = {}; + } else { + users = JSON.parse(localStorage.getItem("users")); + } + + if (localStorage.getItem("loggedinusers") === null) { + loggedInUsers = {}; + } else { + loggedInUsers = JSON.parse(localStorage.getItem("loggedinusers")); + } + + } + + var persistUsers = function(){ + localStorage.setItem("users", JSON.stringify(users)); + }; + var persistLoggedInUsers = function(){ + localStorage.setItem("loggedinusers", JSON.stringify(loggedInUsers)); + }; + var tokenToEmail = function(token){ + return loggedInUsers[token]; + }; + var copyUser = function(user){ + return JSON.parse(JSON.stringify(user)); + }; + + var serverstub = { + signIn: function(email, password){ + syncStorage(); + if(users[email] != null && users[email].password == password){ + var letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + var token = ""; + for (var i = 0 ; i < 36 ; ++i) { + token += letters[Math.floor(Math.random() * letters.length)]; + } + loggedInUsers[token] = email; + persistLoggedInUsers(); + return {"success": true, "message": "Successfully signed in.", "data": token}; + } else { + return {"success": false, "message": "Wrong username or password."}; + } + }, + + postMessage: function(token, content, toEmail){ + syncStorage(); + var fromEmail = tokenToEmail(token); + if (fromEmail != null) { + if (toEmail == null) { + toEmail = fromEmail; + } + if(users[toEmail] != null){ + var recipient = users[toEmail]; + var message = {"writer": fromEmail, "content": content}; + recipient.messages.unshift(message); + persistUsers(); + return {"success": true, "message": "Message posted"}; + } else { + return {"success": false, "message": "No such user."}; + } + } else { + return {"success": false, "message": "You are not signed in."}; + } + }, + + getUserDataByToken: function(token){ + syncStorage(); + var email = tokenToEmail(token); + return serverstub.getUserDataByEmail(token, email); + }, + + getUserDataByEmail: function(token, email){ + syncStorage(); + if (loggedInUsers[token] != null){ + if (users[email] != null) { + var match = copyUser(users[email]); + delete match.messages; + delete match.password; + return {"success": true, "message": "User data retrieved.", "data": match}; + } else { + return {"success": false, "message": "No such user."}; + } + } else { + return {"success": false, "message": "You are not signed in."}; + } + }, + + getUserMessagesByToken: function(token){ + syncStorage(); + var email = tokenToEmail(token); + return serverstub.getUserMessagesByEmail(token,email); + }, + + getUserMessagesByEmail: function(token, email){ + syncStorage(); + if (loggedInUsers[token] != null){ + if (users[email] != null) { + var match = copyUser(users[email]).messages; + return {"success": true, "message": "User messages retrieved.", "data": match}; + } else { + return {"success": false, "message": "No such user."}; + } + } else { + return {"success": false, "message": "You are not signed in."}; + } + }, + + signOut: function(token){ + syncStorage(); + if (loggedInUsers[token] != null){ + delete loggedInUsers[token]; + persistLoggedInUsers(); + return {"success": true, "message": "Successfully signed out."}; + } else { + return {"success": false, "message": "You are not signed in."}; + } + }, + + signUp: function(inputObject){ // {email, password, firstname, familyname, gender, city, country} + syncStorage(); + if (users[inputObject.email] === undefined){ + if( + (typeof(inputObject.email) === 'string') && + (typeof(inputObject.password) === 'string') && + (typeof(inputObject.firstname) === 'string') && + (typeof(inputObject.familyname) === 'string') && + (typeof(inputObject.gender) === 'string') && + (typeof(inputObject.city) === 'string') && + (typeof(inputObject.country) === 'string') + ) { + var user = { + 'email': inputObject.email, + 'password': inputObject.password, + 'firstname': inputObject.firstname, + 'familyname': inputObject.familyname, + 'gender': inputObject.gender, + 'city': inputObject.city, + 'country': inputObject.country, + 'messages': [] + }; + users[inputObject.email] = user; + persistUsers(); + return {"success": true, "message": "Successfully created a new user."}; + } else { + return {"success": false, "message": "Form data missing or incorrect type."}; + } + + } else { + return {"success": false, "message": "User already exists."}; + } + }, + + changePassword: function(token, oldPassword, newPassword){ + syncStorage(); + if (loggedInUsers[token] != null){ + var email = tokenToEmail(token); + if (users[email].password == oldPassword){ + users[email].password = newPassword; + persistUsers(); + return {"success": true, "message": "Password changed."}; + } else { + return {"success": false, "message": "Wrong password."}; + } + } else { + return {"success": false, "message": "You are not logged in."}; + } + } + }; + + return serverstub; + })(); + \ No newline at end of file diff --git a/wimage.png b/wimage.png new file mode 100644 index 0000000000000000000000000000000000000000..048bdd2fcf666069f57f0aab8521dc49f9914725 GIT binary patch literal 14312 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 literal 0 HcmV?d00001 -- GitLab