From 814bb3b0f968bf2f55afead81bbd15fbe49bf09b Mon Sep 17 00:00:00 2001 From: Yazan Armoush Date: Mon, 27 Nov 2023 13:40:17 -0500 Subject: [PATCH] Updated Routes --- backend/routes/energy.py | 52 ++++++++++++++++++++------- backend/routes/food.py | 60 ++++++++++++++++++++------------ backend/routes/transportation.py | 11 +++--- 3 files changed, 82 insertions(+), 41 deletions(-) diff --git a/backend/routes/energy.py b/backend/routes/energy.py index 98b4030..168d728 100644 --- a/backend/routes/energy.py +++ b/backend/routes/energy.py @@ -1,12 +1,14 @@ # Python Imports from datetime import datetime +import flask from bson import ObjectId from flask import Blueprint, Response, jsonify, request - from models.energy import EnergyEntry +from models.user import User from mongodb_api.carbon_track_db import CarbonTrackDB from routes import carbon_auth, users -from utils.metric_resets import weekly_metric_reset, get_1_day_range +from utils.FirebaseAPI import FirebaseAPI +from utils.metric_resets import weekly_metric_reset energy_service = Blueprint('/energy', __name__) @@ -20,15 +22,36 @@ def get_energy(oid: str) -> Response: return jsonify({'energy': item}) -@energy_service.route("/get_energy_metric_for_today/", methods=['GET']) +@energy_service.route("/get_energy_entries_for_user_using_data_range", methods=['POST']) +@carbon_auth.auth.login_required +def get_energy_entries_for_user_using_date_range() -> Response: + user = FirebaseAPI.get_user(flask.request.headers.get('Authorization').split()[1]) + data = request.get_json() + start = datetime.fromisoformat(data.get('start')) + end = datetime.fromisoformat(data.get('end')) + # Validate that both start and end dates are provided + if not start or not end: + return jsonify({'error': 'Both start and end dates are required'}) + + query = {"user_id": ObjectId(user.oid), "date": {"$gte": start, "$lte": end}} + items = list(CarbonTrackDB.energy_coll.find(query)) + energy_items: list[EnergyEntry] = [EnergyEntry.from_json(item) for item in items] + json_items = [item.to_json() for item in energy_items] + return jsonify({ + 'energyEntries': json_items, + 'monthlyData': EnergyEntry.get_monthly_view(start, end, energy_items) + }) + + +@energy_service.route("/get_energy_metric_for_today", methods=['GET']) @carbon_auth.auth.login_required -def get_energy_metric_for_today(user_id: str) -> Response: - start_of_day, end_of_day = get_1_day_range(datetime.now()) - query = {"user_id": ObjectId(user_id), "date": {"$gte": start_of_day, "$lte": end_of_day}} +def get_energy_metric_for_today() -> Response: + user = FirebaseAPI.get_user(flask.request.headers.get('Authorization').split()[1]) + query = {"user_id": ObjectId(user.oid), "date": weekly_metric_reset(datetime.now())} item = CarbonTrackDB.energy_coll.find_one(query) if item is None: - create_energy(ObjectId(user_id)) - return get_energy_metric_for_today(user_id=user_id) + create_energy(ObjectId(user.oid)) + return get_energy_metric_for_today() else: item = EnergyEntry.from_json(item).to_json() return jsonify({'energy': item}) @@ -36,10 +59,10 @@ def get_energy_metric_for_today(user_id: str) -> Response: @carbon_auth.auth.login_required def create_energy(user_id: ObjectId) -> Response: - user = users.get_user_obj(user_id) - energy = EnergyEntry(oid=ObjectId(), user_id=user_id, heating_oil = 0, natural_gas = 0, province = user.province, - household = user.household, electricity = 0, carbon_emissions=0.0, date=weekly_metric_reset(datetime.today())) - energy = energy.to_json(for_mongodb=True) + user = User.from_json(CarbonTrackDB.users_coll.find_one({'_id'})) + energy = EnergyEntry(oid=ObjectId(), user_id=user_id, carbon_emissions=0, date=weekly_metric_reset(datetime.today()), + heating_oil=0, natural_gas=0, province=user.province, household=user.household, electricity=0) + energy = energy.to_json() inserted_id = CarbonTrackDB.energy_coll.insert_one(energy).inserted_id energy = EnergyEntry.from_json(CarbonTrackDB.energy_coll.find_one({"_id": inserted_id})).to_json() return energy @@ -49,7 +72,10 @@ def create_energy(user_id: ObjectId) -> Response: @carbon_auth.auth.login_required def update_energy(oid: str) -> Response: query = {"_id": ObjectId(oid)} - energy = EnergyEntry.from_json(request.get_json()['energy']).to_json(for_mongodb=True) + energy = EnergyEntry.from_json(request.get_json()['energy']).to_json() + del energy['_id'] + del energy['date'] + del energy['user_id'] CarbonTrackDB.energy_coll.update_one(query, {'$set': energy}) item = CarbonTrackDB.energy_coll.find_one(query) item = EnergyEntry.from_json(item).to_json() diff --git a/backend/routes/food.py b/backend/routes/food.py index f93379e..f718e44 100644 --- a/backend/routes/food.py +++ b/backend/routes/food.py @@ -1,12 +1,15 @@ # Python Imports from datetime import datetime + +import flask from bson import ObjectId from flask import Blueprint, Response, jsonify, request from models.food import FoodEntry from mongodb_api.carbon_track_db import CarbonTrackDB from routes import carbon_auth -from utils.metric_resets import weekly_metric_reset, get_1_day_range +from utils.FirebaseAPI import FirebaseAPI +from utils.metric_resets import weekly_metric_reset food_service = Blueprint('/food', __name__) @@ -20,15 +23,36 @@ def get_food(oid: str) -> Response: return jsonify({'food': item}) -@food_service.route("/get_food_metric_for_today/", methods=['GET']) +@food_service.route("/get_food_entries_for_user_using_data_range", methods=['POST']) +@carbon_auth.auth.login_required +def get_food_entries_for_user_using_date_range() -> Response: + user = FirebaseAPI.get_user(flask.request.headers.get('Authorization').split()[1]) + data = request.get_json() + start = datetime.fromisoformat(data.get('start')) + end = datetime.fromisoformat(data.get('end')) + # Validate that both start and end dates are provided + if not start or not end: + return jsonify({'error': 'Both start and end dates are required'}) + + query = {"user_id": ObjectId(user.oid), "date": {"$gte": start, "$lte": end}} + items = list(CarbonTrackDB.food_coll.find(query)) + food_items: list[FoodEntry] = [FoodEntry.from_json(item) for item in items] + json_items = [item.to_json() for item in food_items] + return jsonify({ + 'foodEntries': json_items, + 'monthlyData': FoodEntry.get_monthly_view(start, end, food_items) + }) + + +@food_service.route("/get_food_metric_for_today/", methods=['GET']) @carbon_auth.auth.login_required -def get_food_metric_for_today(user_id: str) -> Response: - start_of_day, end_of_day = get_1_day_range(datetime.now()) - query = {"user_id": ObjectId(user_id), "date": {"$gte": start_of_day, "$lte": end_of_day}} +def get_food_metric_for_today() -> Response: + user = FirebaseAPI.get_user(flask.request.headers.get('Authorization').split()[1]) + query = {"user_id": ObjectId(user.oid), "date": weekly_metric_reset(datetime.now())} item = CarbonTrackDB.food_coll.find_one(query) if item is None: - create_food(ObjectId(user_id)) - return get_food_metric_for_today(user_id=user_id) + create_food(ObjectId(user.oid)) + return get_food_metric_for_today() else: item = FoodEntry.from_json(item).to_json() return jsonify({'food': item}) @@ -37,20 +61,9 @@ def get_food_metric_for_today(user_id: str) -> Response: @carbon_auth.auth.login_required def create_food(user_id: ObjectId) -> Response: food = FoodEntry( - oid=ObjectId(), - user_id=user_id, - beef=0, - lamb=0, - pork=0, - chicken=0, - fish=0, - cheese=0, - milk=0, - food_waste=0, - carbon_emissions=0.0, - date=weekly_metric_reset(datetime.today())) - - food = food.to_json(for_mongodb=True) + oid=ObjectId(), user_id=user_id, carbon_emissions=0, date=weekly_metric_reset(datetime.today()), + beef=0, lamb=0, pork=0, chicken=0, fish=0, cheese=0, milk=0, food_waste=0) + food = food.to_json() inserted_id = CarbonTrackDB.food_coll.insert_one(food).inserted_id food = FoodEntry.from_json(CarbonTrackDB.food_coll.find_one({"_id": inserted_id})).to_json() return food @@ -60,7 +73,10 @@ def create_food(user_id: ObjectId) -> Response: @carbon_auth.auth.login_required def update_food(oid: str) -> Response: query = {"_id": ObjectId(oid)} - food = FoodEntry.from_json(request.get_json()['food']).to_json(for_mongodb=True) + food = FoodEntry.from_json(request.get_json()['food']).to_json() + del food['_id'] + del food['date'] + del food['user_id'] CarbonTrackDB.food_coll.update_one(query, {'$set': food}) item = CarbonTrackDB.food_coll.find_one(query) item = FoodEntry.from_json(item).to_json() diff --git a/backend/routes/transportation.py b/backend/routes/transportation.py index 491701b..5337461 100644 --- a/backend/routes/transportation.py +++ b/backend/routes/transportation.py @@ -3,7 +3,6 @@ from bson import ObjectId from flask import Blueprint, Response, jsonify, request import flask - from models.transportation import TransportationEntry from mongodb_api.carbon_track_db import CarbonTrackDB from routes import carbon_auth @@ -14,7 +13,7 @@ @transportation_service.route("/transportation/", methods=['GET']) -# @carbon_auth.auth.login_required +@carbon_auth.auth.login_required def get_transportation(oid: str) -> Response: query = {"_id": ObjectId(oid)} item = CarbonTrackDB.transportation_coll.find_one(query) @@ -22,9 +21,9 @@ def get_transportation(oid: str) -> Response: return jsonify({"transportation": item}) -@transportation_service.route("/get_transportations_entries_for_user_using_data_range", methods=['POST']) +@transportation_service.route("/get_transportation_entries_for_user_using_data_range", methods=['POST']) @carbon_auth.auth.login_required -def get_transportations_entries_for_user_using_date_range() -> Response: +def get_transportation_entries_for_user_using_date_range() -> Response: user = FirebaseAPI.get_user(flask.request.headers.get('Authorization').split()[1]) data = request.get_json() start = datetime.fromisoformat(data.get('start')) @@ -59,8 +58,8 @@ def get_transportation_metric_for_today() -> Response: @carbon_auth.auth.login_required def create_transportation(user_id: ObjectId) -> Response: - transportation = TransportationEntry(oid=ObjectId(), user_id=user_id, bus=0, train=0, motorbike=0, electric_car=0, - gasoline_car=0, carbon_emissions=0, date=weekly_metric_reset(datetime.today())) + transportation = TransportationEntry(oid=ObjectId(), user_id=user_id, carbon_emissions=0, date=weekly_metric_reset(datetime.today()), + bus=0, train=0, motorbike=0, electric_car=0, gasoline_car=0) transportation = transportation.to_json() inserted_id = CarbonTrackDB.transportation_coll.insert_one(transportation).inserted_id transportation = TransportationEntry.from_json(CarbonTrackDB.transportation_coll.find_one({"_id": inserted_id})).to_json()