diff --git a/Procfile b/Procfile index 71d87a27e072c18469da468debe7e46a43b60989..f1d10088b53181f25d28ad34ffd7496837f236c3 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: gunicorn app.server:app -b 0.0.0.0:$PORT -w 3 -k gevent --max-requests 250 \ No newline at end of file +web: gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app.server:app \ No newline at end of file diff --git a/app/__pycache__/database_helper.cpython-38.pyc b/app/__pycache__/database_helper.cpython-38.pyc index 88d0ffae2b68e05345e641a44654e743e61549c9..5d4ac866e8ace646b18df5e7be54ad6b02332d68 100644 Binary files a/app/__pycache__/database_helper.cpython-38.pyc and b/app/__pycache__/database_helper.cpython-38.pyc differ diff --git a/app/__pycache__/server.cpython-38.pyc b/app/__pycache__/server.cpython-38.pyc index e823edadb12398c139804afefd56e7eee14b85a3..b3a77e14e5b3d98e2fc2c18b3e8254d796151032 100644 Binary files a/app/__pycache__/server.cpython-38.pyc and b/app/__pycache__/server.cpython-38.pyc differ diff --git a/app/client.html b/app/client.html index 2298c65498c3bef3f0e31d175b936774fe0e5d80..1e6312abe949df2e63bf7f684ffc413677f0e863 100644 --- a/app/client.html +++ b/app/client.html @@ -91,7 +91,7 @@ <div id="postLoad"> <div id="post"> <form onsubmit="postMsg(this, 'home'); return false;"> - <textarea name="message" rows="5"></textarea><br> + <textarea name="message" rows="5" ondrop="drop(event)" ondragover="allowDrop(event)"></textarea><br> <input type="submit" value="Send"> </form> </div> diff --git a/app/database.db b/app/database.db index 0236928455fd8263062afbc0280ca06e69e7ce80..16a987f7ba2a636d9a8adecea3971f76054ef406 100644 Binary files a/app/database.db and b/app/database.db differ diff --git a/app/database_helper.py b/app/database_helper.py index 314dc62c9bfde20e2b895384d6dd66ce19fac75c..50a09ce114375d180f807847bb4212a2962643f8 100644 --- a/app/database_helper.py +++ b/app/database_helper.py @@ -32,6 +32,7 @@ class Message(Base): sender_id = Column(String(60), ForeignKey(User.id), nullable=False) receiver_id = Column(Integer, ForeignKey(User.id), nullable=False) message = Column(Text()) + location = Column(Text()) # Init table Base.metadata.create_all(engine) @@ -150,12 +151,13 @@ def ShowUserIdByToken(token): else: return None -def CreateMessage(sender_id, receiver_id, message): +def CreateMessage(sender_id, receiver_id, message, location): session = fs_db.session new_msg = Message( receiver_id=receiver_id, sender_id=sender_id, message=message, + location=location ) session.add(new_msg) session.commit() @@ -164,11 +166,11 @@ def CreateMessage(sender_id, receiver_id, message): def ShowMessageByToken(token): session = fs_db.session statement = text(""" - select rcd.email as rcd_email, u.email as sender_email, rcd.message as message + select rcd.email as rcd_email, u.email as sender_email, rcd.message as message, rcd.location as location from user as u join ( - select u.id as uid, u.email as email, m.sender_id as sender_id, m.message as message + select u.id as uid, u.email as email, m.sender_id as sender_id, m.message as message, m.location as location from user as u, message as m where u.id = m.receiver_id and u.token = :token @@ -188,11 +190,11 @@ def row2dict(rows): def ShowMessageByEmail(email): session = fs_db.session statement = text(""" - select rcd.email as rcd_email, u.email as sender_email, rcd.message as message + select rcd.email as rcd_email, u.email as sender_email, rcd.message as message, rcd.location as location from user as u join ( - select u.id as uid, u.email as email, m.sender_id as sender_id, m.message as message + select u.id as uid, u.email as email, m.sender_id as sender_id, m.message as message, m.location as location from user as u, message as m where u.id = m.receiver_id and u.email = :email diff --git a/app/schema.sql b/app/schema.sql index edce3658d05793ed466ccc192059c9496d102b11..b467e09d1338a6dfacc506f213e00e4d40e2981c 100644 --- a/app/schema.sql +++ b/app/schema.sql @@ -14,5 +14,6 @@ create table Message ( id integer PRIMARY KEY AUTOINCREMENT, user_id integer references User(id), sender integer NOT NULL, - message text + message text, + location text ); \ No newline at end of file diff --git a/app/server.py b/app/server.py index 36f6913b329695a7a2dccb9d99d5454571bd792d..05d869974b937329638b5c6860c2cc35aa7fbda1 100644 --- a/app/server.py +++ b/app/server.py @@ -11,6 +11,7 @@ from geventwebsocket.handler import WebSocketHandler app = flask.Flask(__name__, template_folder='.', static_folder='static') app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False fs_db = SQLAlchemy(app) logged = {} @@ -173,8 +174,8 @@ def showUserInfoByEmail(): if db.CheckTokenExists(token): user = db.ShowUserInfoByEmail(data['email']) if user is not None: + status = 200 response['success'] = True - response['status'] = '200' response['email'] = user['email'] response['firstname'] = user['first_name'] response['familyname'] = user['last_name'] @@ -182,13 +183,15 @@ def showUserInfoByEmail(): response['city'] = user['city'] response['gender'] = user['gender'] else: + status = 400 response['success'] = False response['message'] = "Email incorrect." else: + status = 400 response['success'] = False response['message'] = "Token invalid." - return jsonify(response) + return jsonify(response), status @app.route('/showMessageByToken', methods=['POST']) def showMessageByToken(): @@ -246,14 +249,16 @@ def createMessage(): receiver_id = db.ShowUserIdByEmail(data['email']) if sender_id is None or receiver_id is None: + status = 400 response['success'] = False response['message'] = "Fail to create message." else: - db.CreateMessage(sender_id, receiver_id, data['message']) + status = 200 + db.CreateMessage(sender_id, receiver_id, data['message'], data['location']) response['success'] = True response['message'] = "Success create message." - return jsonify(response) + return jsonify(response), status @app.route('/check') def check(): diff --git a/app/static/api.js b/app/static/api.js index 9749cbd28a14578628d94a6700c6a2e4303ca661..c949287ea67f794af02d2896a7d22e4fdf384507 100644 --- a/app/static/api.js +++ b/app/static/api.js @@ -227,7 +227,7 @@ const showMessageByToken = function(tab){ response.json().then((data) => { var msgs = data.data; for (var i = 0; msg = msgs[i++]; ) { - wall.innerHTML += `<p>${msg.sender_email}: ${msg.message}</p>`; + wall.innerHTML += `<p draggable="true" ondragstart="drag(event)" id="drag${i}">${msg.sender_email} @ ${msg.location}: ${msg.message}</p>`; } }) } @@ -258,7 +258,7 @@ const showMessageByEmail = function(email){ response.json().then((data) => { var msgs = data.data; for (var i = 0; msg = msgs[i++]; ) { - wall.innerHTML += `<p>${msg.sender_email}: ${msg.message}</p>`; + wall.innerHTML += `<p>${msg.sender_email} @ ${msg.location}: ${msg.message}</p>`; } }) } @@ -268,7 +268,7 @@ const showMessageByEmail = function(email){ }); } -const createMessage = function(email, message, form, tab){ +const createMessage = function(email, message, form, tab, loc){ const token = sessionStorage.getItem('token'); fetch(`${API_URL}/createMessage`, { method: "POST", @@ -279,6 +279,7 @@ const createMessage = function(email, message, form, tab){ body: JSON.stringify({ email: email, message: message, + location: loc, }), }) .then(function(response) { @@ -290,7 +291,7 @@ const createMessage = function(email, message, form, tab){ } else { response.json().then((data) => { form.message.value = ""; - showMessageByEmail(email); + loadWall(tab); }) } }) diff --git a/app/static/client.js b/app/static/client.js index 6749cdd4c36bb9cc4639823fca9ec1222165cbce..15f2271abda9b27a6ea822c66b36339d8aaffe80 100644 --- a/app/static/client.js +++ b/app/static/client.js @@ -1,10 +1,28 @@ +var lat, longt, loc; + window.onload = function(){ - loadView(); + getLocation(); } var loadView = function(){ var token = sessionStorage.getItem("token"); var div = document.getElementById("container"); + fetch(`https://geocode.xyz/${lat},${longt}?geoit=json`, { + method: "GET" + }) + .then(function(response) { + if (response.status !== 200) { + console.log(`Looks like there was a problem. Status code: ${response.status}`); + return; + } else { + response.json().then((data) => { + window.loc = data.city; + }) + } + }) + .catch(function(error) { + console.log("Fetch error: " + error); + }); if(token == null){ var view = document.getElementById("welcome").innerHTML; div.innerHTML = view; @@ -117,7 +135,13 @@ var initHome = function(div){ } var loadWall = function(tab){ - showMessageByToken(tab); + if(tab == 'home'){ + showMessageByToken(tab); + } + else{ + var email = document.getElementById(tab).getElementsByClassName("email")[0].innerHTML.slice(7); + showMessageByEmail(email) + } } const lookupFriend = function(e) { @@ -131,6 +155,34 @@ var postMsg = function(form, tab){ if(form.message.value.length == 0) return; var email = document.getElementById(tab).getElementsByClassName("email")[0].innerHTML.slice(7); - createMessage(email, form.message.value, form, tab); - loadWall(tab); -} \ No newline at end of file + createMessage(email, form.message.value, form, tab, window.loc); +} + +function allowDrop(ev) { + ev.preventDefault(); + } + + function drag(ev) { + ev.dataTransfer.setData("text", ev.target.id); + } + + function drop(ev) { + ev.preventDefault(); + var data = ev.dataTransfer.getData("text"); + var content = document.getElementById(data).innerHTML.split(":"); + ev.target.innerHTML = content[1].slice(1); + } + + function getLocation() { + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(showPosition); + } else { + x.innerHTML = "Geolocation is not supported by this browser."; + } + } + + function showPosition(position) { + window.lat = position.coords.latitude; + window.longt = position.coords.longitude; + loadView(); + } \ No newline at end of file diff --git a/database.db b/database.db index 53576b1434cbcfabf0b2c28ccea94780e6261cb7..615feaa0b7538c7d72bea4797d021d1640459f8e 100644 Binary files a/database.db and b/database.db differ