database_interface.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from pymongo import MongoClient
  2. from flask import Flask, request
  3. from pprint import pprint
  4. import time
  5. app = Flask(__name__)
  6. client = MongoClient("sedatabase", 27017)
  7. db = client["react_database"]
  8. user = db["user"]
  9. location = db["location"]
  10. @app.route("/report-location", methods=["PUT"])
  11. def report_location():
  12. gpsData = request.json
  13. location.insert_one(gpsData)
  14. return ('', 204)
  15. @app.route("/users", methods=["GET"])
  16. def get_users():
  17. pipeline = [
  18. { "$sort": { "name": 1, "timestamp": -1 } },
  19. { "$group": {
  20. "_id": "$name",
  21. "timestamp": { "$first": "$timestamp" },
  22. "longitude": { "$first": "$longitude" },
  23. "latitude": { "$first": "$latitude" }
  24. }}
  25. ]
  26. lastLocations = list(location.aggregate(pipeline))
  27. users = list(user.find({}, {'_id': False}))
  28. for u in users:
  29. for userLoc in lastLocations:
  30. if u["name"]==userLoc["_id"]:
  31. u.update(userLoc)
  32. if "longitude" not in u:
  33. u["longitude"] = None
  34. if "latitude" not in u:
  35. u["latitude"] = None
  36. u["online"] = "timestamp" in u and (time.time() - u["timestamp"])<30
  37. return {"users": users}
  38. @app.after_request
  39. def after_request(response):
  40. response.headers.add('Access-Control-Allow-Origin', '*')
  41. response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
  42. response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
  43. return response
  44. if __name__=="__main__":
  45. if user.find().count()<3:
  46. user.insert_many([
  47. {
  48. "shortName": "VEN",
  49. "fullName": "Martin Venzl",
  50. "name": "Martin",
  51. "color": "#ddd",
  52. },
  53. {
  54. "name": "Simon",
  55. "fullName": "Simon Ellinger",
  56. "shortName": "ELL",
  57. "color": "#ffff00"
  58. },
  59. {
  60. "name": "Lukas",
  61. "fullName": "Lukas Wagner",
  62. "shortName": "WAG",
  63. "color": "#00ff00"
  64. },
  65. {
  66. "name": "Bernie",
  67. "fullName": "Bernadette Hammerle",
  68. "shortName": "HAM",
  69. "color": "#888822"
  70. }
  71. ])
  72. app.run(host='0.0.0.0')