diff --git a/server/src/main.py b/server/src/main.py index ef1b502..51858d3 100644 --- a/server/src/main.py +++ b/server/src/main.py @@ -7,10 +7,11 @@ import sys from src.signup import Signup from src.login import Login -from src.wayfinding import router # Import the API routes +from src.preferences import router as preferences_router from src.weatherApi import weatherAPI from src.preferences import Preferences from src.networking import Networking +from src.wayfinding import wayfinding_router_setup class Server: @@ -21,15 +22,24 @@ def __init__(self): # Initialize FastAPI app self.app = FastAPI() # Include the API routes from the my_routes.py file - self.app.include_router(router) # Instantiate components - self.signup_logic = Signup(self.app, self.logger) + self.login_logic = Login(self.app, self.logger) - self.preferences_logic = Preferences(self.app, self.logger) self.connection_manager = ConnectionManager() self.weather_api = weatherAPI() self.networking = Networking(self.app, self.logger) + self.preferences_logic = Preferences(self.app, self.logger) + self.signup_logic = Signup(self.app, self.logger, + self.preferences_logic) + + wayfinding_router = wayfinding_router_setup( + preferences_logic=self.preferences_logic, + logger=self.logger, + ) + + self.app.include_router(wayfinding_router, prefix="/wayfinding") + self.app.include_router(preferences_router, prefix="/preferences") # Configure CORS self.configure_cors() diff --git a/server/src/preferences.py b/server/src/preferences.py index cf687b6..ce91ce9 100644 --- a/server/src/preferences.py +++ b/server/src/preferences.py @@ -1,9 +1,11 @@ import logging -from fastapi import Body +from fastapi import Body, APIRouter from dotenv import load_dotenv from pydantic import BaseModel from src.Database_class import DataBase +router = APIRouter() + class Preferences: def __init__(self, api, logger: logging.Logger): @@ -16,29 +18,29 @@ def __init__(self, api, logger: logging.Logger): def set_Preferences( self, - ): + ): @self.app.post("/setPreferences") async def set_Preferences(request: userPersonalizedSettings): self.logger.info("Received user personalized settings:") self.db_handle_preferences(request) - return {"message": "Successfully saved user preferences"} - + return {"message": "Successfully saved user preferences"} + def db_handle_preferences(self, request): db = DataBase() db.connect_db() dict = request.request_into_dictionary() - + for key, val in dict.items(): db.update_entry( - "user_personalized_settings", dict["username"], key, val + "user_personalized_settings", dict["username"], key, val ) self.logger.info("User preferences updated in the database") db.close_con() - + def db_initialise_preferences(self, username): db = DataBase() db.connect_db() - + dict = { "username": username, "bike": False, @@ -53,26 +55,29 @@ def db_initialise_preferences(self, username): "tram": False, "personal_bike": False, } - - db.add_entry( - "user_personalized_settings", dict + + db.add_entry("user_personalized_settings", dict) + self.logger.info( + "User has signed up and a preferences entry has been created" ) - self.logger.info("User has signed up and a preferences entry has been created for him with default values all set to false") - db.close_con() - + db.close_con() + def db_get_preferences(self, username): db = DataBase() db.connect_db() - motorwayPref = db.search_entry("user_personalized_settings", username, 'motorways') - tollsPref = db.search_entry("user_personalized_settings", username, 'tolls') + motorwayPref = db.search_entry( + "user_personalized_settings", username, "motorways" + ) + tollsPref = db.search_entry( + "user_personalized_settings", username, "tolls" + ) self.logger.info("User preferences retrieved from database") print("preferences retrieved from db", motorwayPref, tollsPref) db.close_con() - return { + return { "motorways": motorwayPref, "tolls": tollsPref, } - class userPersonalizedSettings(BaseModel): @@ -91,7 +96,7 @@ class userPersonalizedSettings(BaseModel): def request_into_dictionary(self): return { - "username": self.username, + "username": self.username, "bike": self.bike, "private_vehicle": self.privateVehicle, "accessibility": self.accessibility, diff --git a/server/src/signup.py b/server/src/signup.py index 937e276..a8fc474 100644 --- a/server/src/signup.py +++ b/server/src/signup.py @@ -3,18 +3,17 @@ from .Database_class import DataBase from src.preferences import Preferences import logging -from fastapi import FastAPI -app = FastAPI() + logger = logging.getLogger("test_logger") -preferences = Preferences(api=app, logger=logger) class Signup: - def __init__(self, api, logger: logging.Logger): + def __init__(self, api, logger: logging.Logger, + preferences_logic: Preferences): self.app = api self.logger = logger - + self.preferences = preferences_logic # register signup route self.handle_signup() @@ -58,8 +57,8 @@ def signup_user(self, username: str, password: str): self.logger.info(f"User {username} signed up") db.close_con() - - preferences.db_initialise_preferences(username) + + self.preferences.db_initialise_preferences(username) return True diff --git a/server/src/wayfinding.py b/server/src/wayfinding.py index 94dda0d..72ed471 100644 --- a/server/src/wayfinding.py +++ b/server/src/wayfinding.py @@ -2,18 +2,16 @@ import os from fastapi import APIRouter, Body from dotenv import load_dotenv -from src.preferences import Preferences import logging -from fastapi import FastAPI +from src.preferences import Preferences load_dotenv() GOOGLE_MAPS_API_KEY = os.getenv("GOOGLE_MAPS_API_KEY") router = APIRouter() -app = FastAPI() logger = logging.getLogger("test_logger") -preferences = Preferences(api=app, logger=logger) + @router.post("/wayfinding/get_routes") def get_routes( @@ -32,48 +30,53 @@ def get_routes( "key": GOOGLE_MAPS_API_KEY, } response = requests.get(url, params=parameters) - return response.json() + return response.json() -@router.post("/wayfinding/preferences/get_routes") -def get_routes_with_preferences( - origin: str = Body(...), - destination: str = Body(...), - mode: str = Body(...), - alternatives: bool = Body(...), - username: str = Body(...), -): - print(username) - preferencesList = preferences.db_get_preferences(username) - print(preferencesList) - if not preferencesList: - logger.error(f"No preferences found for user {username}. Using default route.") - return get_routes( - origin=origin, - destination=destination, - mode=mode, - alternatives=alternatives, - ) - - if preferencesList["tolls"] and preferencesList["motorways"]: - toAvoid = "tolls|highways" - elif preferencesList["tolls"]: - toAvoid = "tolls" - elif preferencesList["motorways"]: - toAvoid = "motorways" - else: - toAvoid = "" - - url = "https://maps.googleapis.com/maps/api/directions/json" - parameters = { - "origin": origin, - "destination": destination, - "mode": mode.lower(), - "alternatives": str(alternatives).lower(), - "key": GOOGLE_MAPS_API_KEY, - "username": username, - "avoid": toAvoid - } +def wayfinding_router_setup(preferences_logic: Preferences, logger): + router = APIRouter() - response = requests.get(url, params=parameters) - return response.json() + @router.post("/preferences/get_routes") + def get_routes_with_preferences( + origin: str = Body(...), + destination: str = Body(...), + mode: str = Body(...), + alternatives: bool = Body(...), + username: str = Body(...), + ): + + print(username) + preferencesList = preferences_logic.db_get_preferences(username) + print(preferencesList) + if not preferencesList: + logger.error(f"No preferences {username}. Using default route.") + return get_routes( + origin=origin, + destination=destination, + mode=mode, + alternatives=alternatives, + ) + + if preferencesList["tolls"] and preferencesList["motorways"]: + toAvoid = "tolls|highways" + elif preferencesList["tolls"]: + toAvoid = "tolls" + elif preferencesList["motorways"]: + toAvoid = "motorways" + else: + toAvoid = "" + + url = "https://maps.googleapis.com/maps/api/directions/json" + parameters = { + "origin": origin, + "destination": destination, + "mode": mode.lower(), + "alternatives": str(alternatives).lower(), + "key": GOOGLE_MAPS_API_KEY, + "username": username, + "avoid": toAvoid + } + + response = requests.get(url, params=parameters) + return response.json() + return router diff --git a/server/tests/test_signup.py b/server/tests/test_signup.py index 62c1862..8bd7739 100644 --- a/server/tests/test_signup.py +++ b/server/tests/test_signup.py @@ -6,6 +6,11 @@ from src.signup import Signup +class MockPreferences: + def db_initialise_preferences(self, username): + print("Mocking preferences") + + @pytest.fixture def test_app(): """ @@ -14,7 +19,9 @@ def test_app(): """ app = FastAPI() logger = logging.getLogger("test_logger") - signup = Signup(api=app, logger=logger) # noqa: F841 + mock_preferences = MockPreferences() + signup = Signup( # noqa: F841 + api=app, logger=logger, preferences_logic=mock_preferences) return TestClient(app)