diff --git a/.gitignore b/.gitignore index 8efe6ee..920d775 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ *.DS_Store node_modules .venv +/.idea +*.patch backend/.migrations diff --git a/backend/app.py b/backend/app.py index 43993cd..8d22eb0 100644 --- a/backend/app.py +++ b/backend/app.py @@ -2,18 +2,20 @@ from flask import Flask, Response, jsonify from flask_cors import CORS from werkzeug.exceptions import HTTPException +import ct_confiq +from utils.customJSONEncoder import CustomJSONProvider +# SERVICES from routes.ct_firebase_service import ct_firebase_service -# Imports from routes.users import users from routes.transportation import transportation_service -from utils.customJSONEncoder import CustomJSONProvider from routes.food import food_service from routes.energy import energy_service app = Flask(__name__) app.json = CustomJSONProvider(app) +ct_confiq.run_carbon_track_configurations() # Services app.register_blueprint(users, url_prefix="/users") diff --git a/backend/ct_confiq.py b/backend/ct_confiq.py new file mode 100644 index 0000000..c2815d0 --- /dev/null +++ b/backend/ct_confiq.py @@ -0,0 +1,20 @@ +""" +File Description +""" +import json +import os + + +def _load_secrets() -> None: + if os.environ.get('DB_URI') is None: + with open('secrets.json') as secret_json: + secrets = json.load(secret_json) + for key, value in secrets.items(): + os.environ[key] = value + + +def run_carbon_track_configurations() -> None: + _load_secrets() + + +run_carbon_track_configurations() diff --git a/backend/models/user.py b/backend/models/user.py index 9798792..c2c2825 100644 --- a/backend/models/user.py +++ b/backend/models/user.py @@ -14,19 +14,23 @@ class User(DB_MODEL): email: str badges: list[str] friends: list[str] - score: int + monthly_score: int + yearly_score: int + overall_score: int province: str household: int fuel_efficiency: float - def __init__(self, oid: ObjectId, full_name: str, email: str, badges: list[str], friends: list[str], - score:int, province:str, household:int, fuel_efficiency: float) -> None: + def __init__(self, oid: ObjectId, full_name: str, email: str, badges: list[str], friends: list[str], monthly_score:int, + yearly_score:int, overall_score:int, province:str, household:int, fuel_efficiency: float) -> None: super().__init__(oid) self.full_name = str(full_name) self.email = str(email) self.badges = badges self.friends = friends - self.score = score + self.monthly_score = monthly_score + self.yearly_score = yearly_score + self.overall_score = overall_score self.province = province self.household = household self.fuel_efficiency = fuel_efficiency @@ -38,7 +42,9 @@ def to_json(self) -> json: 'email': self.email, 'badges': self.badges, 'friends': self.friends, - 'score': self.score, + 'monthly_score': self.monthly_score, + 'yearly_score': self.yearly_score, + 'overall_score': self.overall_score, 'province': self.province, 'household': self.household, 'fuel_efficiency': self.fuel_efficiency @@ -52,7 +58,9 @@ def from_json(doc: json) -> User: email=doc["email"], badges=doc["badges"], friends=doc["friends"], - score=doc["score"], + monthly_score=doc["monthly_score"], + yearly_score=doc["yearly_score"], + overall_score=doc["overall_score"], province=doc["province"], household=doc["household"], fuel_efficiency=doc["fuel_efficiency"] diff --git a/backend/mongodb_api/carbon_track_db.py b/backend/mongodb_api/carbon_track_db.py index 906451d..f03f851 100644 --- a/backend/mongodb_api/carbon_track_db.py +++ b/backend/mongodb_api/carbon_track_db.py @@ -1,13 +1,13 @@ # Python Imports +import os +from pymongo import MongoClient from pymongo.collection import Collection from pymongo.database import Database -# Imports -from mongodb_api.secrets import get_db - # Get DB From Cluster -carbonTrackDB: Database = get_db("CarbonTrack") +_cluster: MongoClient = MongoClient(os.environ.get("DB_URI")) +carbonTrackDB: Database = _cluster["CarbonTrack"] class CarbonTrackDB: diff --git a/backend/mongodb_api/secrets.py b/backend/mongodb_api/secrets.py deleted file mode 100644 index 18dec4c..0000000 --- a/backend/mongodb_api/secrets.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Database Orchestrator -""" -import os -import json -from pymongo import MongoClient -from pymongo.database import Database - - -def get_db(database_name: str) -> Database: - - if os.environ.get('DB_URI') is not None: - _DB_URI = os.environ.get('DB_URI') - - else: - with open('secrets.json') as secret_json: - secret_json = json.load(secret_json) - _DB_URI = secret_json.get('DB_URI') - - _cluster: MongoClient = MongoClient(_DB_URI) - _db: Database = _cluster[database_name] - - return _db diff --git a/backend/requirements.txt b/backend/requirements.txt index 7425461..384a9c8 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -4,3 +4,5 @@ Flask_Cors==4.0.0 Flask_HTTPAuth==4.8.0 pymongo==4.6.0 ruff==0.1.4 +typing~=3.7.4.3 +werkzeug~=3.0.1 diff --git a/backend/routes/users.py b/backend/routes/users.py index 93f4a01..f5600ca 100644 --- a/backend/routes/users.py +++ b/backend/routes/users.py @@ -20,6 +20,66 @@ def get_user(user_id: str) -> Response: abort(code=400, description=f"{e}") +@users.route("/get_top_users", methods=['POST']) +@carbon_auth.auth.login_required +def get_top_users() -> Response: + try: + count = request.get_json()["count"] + + # Monthly + _top_monthly_users = CarbonTrackDB.users_coll.find().sort("monthly_score", -1).limit(count) + top_monthly_users = [] + rank = 1 + for user in _top_monthly_users: + obj = User.from_json(user) + user = { + 'rank': rank, + 'name': obj.full_name, + 'footprint': 0, + 'score': obj.overall_score, + } + rank += 1 + top_monthly_users.append(user) + + # Yearly + _top_yearly_users = CarbonTrackDB.users_coll.find().sort("yearly_score", -1).limit(count) + top_yearly_users = [] + rank = 1 + for user in _top_yearly_users: + obj = User.from_json(user) + user = { + 'rank': rank, + 'name': obj.full_name, + 'footprint': 0, + 'score': obj.overall_score, + } + rank += 1 + top_yearly_users.append(user) + + # Overall + _top_overall_users = CarbonTrackDB.users_coll.find().sort("overall_score", -1).limit(count) + top_overall_users = [] + rank = 1 + for user in _top_overall_users: + obj = User.from_json(user) + user = { + 'rank': rank, + 'name': obj.full_name, + 'footprint': 0, + 'score': obj.overall_score, + } + rank += 1 + top_overall_users.append(user) + + return jsonify({ + 'top_monthly_users': top_monthly_users, + 'top_yearly_users': top_yearly_users, + 'top_overall_users': top_overall_users, + }) + except CarbonTrackError as e: + abort(code=400, description=f"{e}") + + @users.route("/user_email/", methods=['GET']) @carbon_auth.auth.login_required def get_user_by_email(user_email: str) -> Response: @@ -80,5 +140,3 @@ def update_user(user_id: str) -> Response: return jsonify({'user': item}) except CarbonTrackError as e: abort(code=400, description=f"{e}") - - diff --git a/backend/templates/google_login.html b/backend/templates/google_login.html index 2ec3e6c..b3cc94d 100644 --- a/backend/templates/google_login.html +++ b/backend/templates/google_login.html @@ -40,7 +40,7 @@