mirror of
https://github.com/supleed2/ELEC60013-ES-CW1.git
synced 2024-12-22 21:45:48 +00:00
Merge pull request #5 from LEG-Industries/data-endpoints
Data endpoints
This commit is contained in:
commit
6aae8389dc
|
@ -74,3 +74,20 @@ def verify():
|
||||||
lib.utils.sendVerificationMail(user.display_name, user.email, code)
|
lib.utils.sendVerificationMail(user.display_name, user.email, code)
|
||||||
resp = {'error': 'Server could not find code, creating new one and sending email'}
|
resp = {'error': 'Server could not find code, creating new one and sending email'}
|
||||||
return Response(json.dumps(resp), status=500, mimetype='application/json')
|
return Response(json.dumps(resp), status=500, mimetype='application/json')
|
||||||
|
|
||||||
|
@authentication.route('/authentication/get-user-devices', methods=['GET'])
|
||||||
|
def uploadReadings():
|
||||||
|
uid = request.headers.get('UID')
|
||||||
|
if uid is None:
|
||||||
|
resp = {'error': 'UID not specified'}
|
||||||
|
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
||||||
|
|
||||||
|
# Save all the measurements
|
||||||
|
doc = firestore.client().collection(u'devices').document(uid).get()
|
||||||
|
if doc.exists:
|
||||||
|
list = doc.to_dict()['devices']
|
||||||
|
data = list
|
||||||
|
else:
|
||||||
|
data = []
|
||||||
|
res = {'devices': data}
|
||||||
|
return Response(json.dumps(res), status=200, mimetype='application/json')
|
||||||
|
|
116
api/data.py
116
api/data.py
|
@ -1,5 +1,6 @@
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
|
from datetime import datetime, time, timedelta
|
||||||
from flask import Response, Blueprint, request
|
from flask import Response, Blueprint, request
|
||||||
from firebase_admin import firestore
|
from firebase_admin import firestore
|
||||||
|
|
||||||
|
@ -7,17 +8,19 @@ data = Blueprint('data', __name__)
|
||||||
|
|
||||||
@data.route('/readings/save', methods=['POST'])
|
@data.route('/readings/save', methods=['POST'])
|
||||||
def uploadReadings():
|
def uploadReadings():
|
||||||
deviceId = request.headers.get('deviceid')
|
deviceId = request.headers.get('Device-ID')
|
||||||
if deviceId is None:
|
if deviceId is None:
|
||||||
resp = {'error': 'Device not specified'}
|
resp = {'error': 'Device not specified'}
|
||||||
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
||||||
|
|
||||||
|
# Check that measurements are provided
|
||||||
body = request.json
|
body = request.json
|
||||||
if body is None:
|
if body is None:
|
||||||
resp = {'error': 'Invalid request - please provide a body'}
|
resp = {'error': 'Invalid request - please provide a body'}
|
||||||
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
||||||
body['timestamp'] = time.time()
|
body['timestamp'] = datetime.now().timestamp()
|
||||||
|
|
||||||
|
# Save all the measurements
|
||||||
doc = firestore.client().collection(u'readings').document(deviceId).get()
|
doc = firestore.client().collection(u'readings').document(deviceId).get()
|
||||||
if doc.exists:
|
if doc.exists:
|
||||||
list = doc.to_dict()['data']
|
list = doc.to_dict()['data']
|
||||||
|
@ -25,15 +28,15 @@ def uploadReadings():
|
||||||
data = list
|
data = list
|
||||||
else:
|
else:
|
||||||
data = [body]
|
data = [body]
|
||||||
|
|
||||||
upload = {'data': data}
|
upload = {'data': data}
|
||||||
firestore.client().collection(u'readings').document(deviceId).set(upload)
|
firestore.client().collection(u'readings').document(deviceId).set(upload)
|
||||||
|
|
||||||
resp = {'success': 'Data saved'}
|
resp = {'success': 'Data saved'}
|
||||||
return Response(json.dumps(resp), status=200, mimetype='application/json')
|
return Response(json.dumps(resp), status=200, mimetype='application/json')
|
||||||
|
|
||||||
@data.route('/readings/getall', methods=['GET'])
|
@data.route('/readings/getall', methods=['GET'])
|
||||||
def getAllReadings():
|
def getAllReadings():
|
||||||
deviceId = request.headers.get('deviceid')
|
deviceId = request.headers.get('Device-ID')
|
||||||
if deviceId is None:
|
if deviceId is None:
|
||||||
resp = {'error': 'Device not specified'}
|
resp = {'error': 'Device not specified'}
|
||||||
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
||||||
|
@ -46,3 +49,108 @@ def getAllReadings():
|
||||||
|
|
||||||
results = {'data': data}
|
results = {'data': data}
|
||||||
return Response(json.dumps(results), status=200, mimetype='application/json')
|
return Response(json.dumps(results), status=200, mimetype='application/json')
|
||||||
|
|
||||||
|
@data.route('/readings/location/last', methods=['GET'])
|
||||||
|
def getLastLocation():
|
||||||
|
deviceId = request.headers.get('Device-ID')
|
||||||
|
if deviceId is None:
|
||||||
|
resp = {'error': 'Device not specified'}
|
||||||
|
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
||||||
|
|
||||||
|
doc = firestore.client().collection(u'readings').document(deviceId).get()
|
||||||
|
if doc.exists:
|
||||||
|
data = doc.to_dict()['data']
|
||||||
|
lastEntry = data[-1]
|
||||||
|
lat = lastEntry['latitude']
|
||||||
|
lon = lastEntry['longitude']
|
||||||
|
else:
|
||||||
|
lat = -1.0
|
||||||
|
lon = -1.0
|
||||||
|
|
||||||
|
results = {'latitude': lat, 'longitude': lon}
|
||||||
|
return Response(json.dumps(results), status=200, mimetype='application/json')
|
||||||
|
|
||||||
|
@data.route('/readings/steps/today', methods=['GET'])
|
||||||
|
def getStepsToday():
|
||||||
|
deviceId = request.headers.get('Device-ID')
|
||||||
|
if deviceId is None:
|
||||||
|
resp = {'error': 'Device not specified'}
|
||||||
|
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
||||||
|
|
||||||
|
doc = firestore.client().collection(u'readings').document(deviceId).get()
|
||||||
|
if doc.exists:
|
||||||
|
data = doc.to_dict()['data']
|
||||||
|
lastEntry = data[-1]
|
||||||
|
steps = lastEntry['cumulative_steps_today']
|
||||||
|
else:
|
||||||
|
steps = 0
|
||||||
|
|
||||||
|
results = {'cumulative_steps_today': steps}
|
||||||
|
return Response(json.dumps(results), status=200, mimetype='application/json')
|
||||||
|
|
||||||
|
@data.route('/readings/steps/last-five-days', methods=['GET'])
|
||||||
|
def getStepsLastFiveDays():
|
||||||
|
deviceId = request.headers.get('Device-ID')
|
||||||
|
if deviceId is None:
|
||||||
|
resp = {'error': 'Device not specified'}
|
||||||
|
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
||||||
|
|
||||||
|
upcomingMidnight = datetime.combine(datetime.today(), time.min) + timedelta(days=1)
|
||||||
|
doc = firestore.client().collection(u'readings').document(deviceId).get()
|
||||||
|
|
||||||
|
if doc.exists:
|
||||||
|
data = doc.to_dict()['data']
|
||||||
|
listOfDailySteps = []
|
||||||
|
|
||||||
|
for i in range(0, 5):
|
||||||
|
found = False
|
||||||
|
previousMidnight = upcomingMidnight - timedelta(days=1)
|
||||||
|
print(previousMidnight.timestamp())
|
||||||
|
steps = 0
|
||||||
|
for reading in reversed(data):
|
||||||
|
if reading['timestamp'] <= upcomingMidnight.timestamp() and reading['timestamp'] >= previousMidnight.timestamp() and not found:
|
||||||
|
steps = reading['cumulative_steps_today']
|
||||||
|
found = True
|
||||||
|
listOfDailySteps.append(steps)
|
||||||
|
upcomingMidnight = previousMidnight
|
||||||
|
else:
|
||||||
|
listOfDailySteps = [0] * 5
|
||||||
|
|
||||||
|
results = {'daily_steps': listOfDailySteps}
|
||||||
|
return Response(json.dumps(results), status=200, mimetype='application/json')
|
||||||
|
|
||||||
|
@data.route('/readings/metrics-summary', methods=['GET'])
|
||||||
|
def getMetricsSummary():
|
||||||
|
deviceId = request.headers.get('Device-ID')
|
||||||
|
if deviceId is None:
|
||||||
|
resp = {'error': 'Device not specified'}
|
||||||
|
return Response(json.dumps(resp), status=400, mimetype='application/json')
|
||||||
|
|
||||||
|
upcomingMidnight = datetime.combine(datetime.today(), time.min) + timedelta(days=1)
|
||||||
|
lastMidnight = datetime.combine(datetime.today(), time.min)
|
||||||
|
doc = firestore.client().collection(u'readings').document(deviceId).get()
|
||||||
|
|
||||||
|
if doc.exists:
|
||||||
|
allData = doc.to_dict()['data']
|
||||||
|
currentDayData = [x for x in allData if x['timestamp'] <= upcomingMidnight.timestamp() and x['timestamp'] >= lastMidnight.timestamp()]
|
||||||
|
if len(currentDayData) >= 1:
|
||||||
|
maxAirTemp = max(currentDayData, key=lambda x: x['air_temp'])['air_temp']
|
||||||
|
maxSkinTemp = max(currentDayData, key=lambda x: x['skin_temp'])['skin_temp']
|
||||||
|
maxHumidity = max(currentDayData, key=lambda x: x['humidity'])['humidity']
|
||||||
|
minAirTemp = min(currentDayData, key=lambda x: x['air_temp'])['air_temp']
|
||||||
|
minSkinTemp = min(currentDayData, key=lambda x: x['skin_temp'])['skin_temp']
|
||||||
|
minHumidity = min(currentDayData, key=lambda x: x['humidity'])['humidity']
|
||||||
|
results = {
|
||||||
|
'last_air_temp': currentDayData[-1]['air_temp'], 'min_air_temp': minAirTemp, 'max_air_temp': maxAirTemp,
|
||||||
|
'last_skin_temp': currentDayData[-1]['skin_temp'], 'min_skin_temp': minSkinTemp, 'max_skin_temp': maxSkinTemp,
|
||||||
|
'last_humidity': currentDayData[-1]['humidity'], 'min_humidity': minHumidity, 'max_humidity': maxHumidity
|
||||||
|
}
|
||||||
|
return Response(json.dumps(results), status=200, mimetype='application/json')
|
||||||
|
else:
|
||||||
|
return Response(json.dumps({'error': 'Could not get data from database'}), status=500, mimetype='application/json')
|
||||||
|
else:
|
||||||
|
return Response(json.dumps({'error': 'Could not get data from database'}), status=500, mimetype='application/json')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from random import randint
|
from random import randint
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
from flask_mail import Mail, Message
|
from flask_mail import Mail, Message
|
||||||
from firebase_admin import auth, firestore
|
from firebase_admin import firestore
|
||||||
|
|
||||||
def sendMail(subject, sender, recipients, body):
|
def sendMail(subject, sender, recipients, body):
|
||||||
mail = Mail(current_app)
|
mail = Mail(current_app)
|
||||||
|
@ -24,10 +24,3 @@ def sendVerificationMail(name, email, code):
|
||||||
body = '''Hey {}! Thank you for signing up for BarkFinder.
|
body = '''Hey {}! Thank you for signing up for BarkFinder.
|
||||||
In order to use our sevices, could you please verify your email address by logging in and entering this code {}'''.format(name, code)
|
In order to use our sevices, could you please verify your email address by logging in and entering this code {}'''.format(name, code)
|
||||||
sendMail(subject, sender, recipients, body)
|
sendMail(subject, sender, recipients, body)
|
||||||
|
|
||||||
def userLoggedInAndVerfied(token):
|
|
||||||
# Need frontend to test this
|
|
||||||
# decoded_token = auth.verify_id_token(token)
|
|
||||||
# uid = decoded_token['uid']
|
|
||||||
# isVerified = auth.get_user(uid).email_verified
|
|
||||||
return True #placeholder
|
|
1
main.py
1
main.py
|
@ -9,7 +9,6 @@ app = Flask(__name__)
|
||||||
app.register_blueprint(authentication)
|
app.register_blueprint(authentication)
|
||||||
app.register_blueprint(data)
|
app.register_blueprint(data)
|
||||||
|
|
||||||
|
|
||||||
# Initialize Mail instance
|
# Initialize Mail instance
|
||||||
app.config['MAIL_SERVER'] = MAIL_SERVER
|
app.config['MAIL_SERVER'] = MAIL_SERVER
|
||||||
app.config['MAIL_PORT'] = MAIL_PORT
|
app.config['MAIL_PORT'] = MAIL_PORT
|
||||||
|
|
Loading…
Reference in a new issue