diff --git a/.gitignore b/.gitignore index 0bb0afac4..a5be88d73 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,7 @@ compile_commands.json *.sw? .env +.*.env *.db /build* diff --git a/gs/backend/api/backend_setup.py b/gs/backend/api/backend_setup.py index b6ba6080e..733999e28 100644 --- a/gs/backend/api/backend_setup.py +++ b/gs/backend/api/backend_setup.py @@ -9,6 +9,7 @@ from gs.backend.api.v1.mcc.endpoints.commands import commands_router from gs.backend.api.v1.mcc.endpoints.main_commands import main_commands_router from gs.backend.api.v1.mcc.endpoints.telemetry import telemetry_router +from gs.backend.config.config import backend_config def setup_routes(app: FastAPI) -> None: @@ -32,4 +33,7 @@ def setup_middlewares(app: FastAPI) -> None: """Adds the middlewares to the app""" add_cors_middleware(app) # Cors middleware should be added first app.add_middleware(AuthMiddleware) - app.add_middleware(LoggerMiddleware, excluded_endpoints=[]) + app.add_middleware( + LoggerMiddleware, + excluded_endpoints=backend_config.logger_config.excluded_endpoints, + ) diff --git a/gs/backend/api/middleware/cors_middleware.py b/gs/backend/api/middleware/cors_middleware.py index 9fcde730c..001d524df 100644 --- a/gs/backend/api/middleware/cors_middleware.py +++ b/gs/backend/api/middleware/cors_middleware.py @@ -1,6 +1,8 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from gs.backend.config.config import backend_config + def add_cors_middleware(app: FastAPI) -> None: """ @@ -10,8 +12,8 @@ def add_cors_middleware(app: FastAPI) -> None: """ app.add_middleware( CORSMiddleware, - allow_origins=["http://localhost:5173"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], + allow_origins=backend_config.cors_config.allow_origins, + allow_credentials=backend_config.cors_config.allow_credentials, + allow_methods=backend_config.cors_config.allow_methods, + allow_headers=backend_config.cors_config.allow_headers, ) diff --git a/gs/backend/config/config.py b/gs/backend/config/config.py index 6df17d795..77d5281f7 100644 --- a/gs/backend/config/config.py +++ b/gs/backend/config/config.py @@ -4,9 +4,24 @@ from dotenv import load_dotenv +from .cors_config import CORSConfig +from .logger_config import LoggerConfig + load_dotenv() +class BackendConfiguration: + """ + Class for storing backend configuration settings + """ + + def __init__(self) -> None: + self.cors_config = CORSConfig() + self.logger_config = LoggerConfig() + + +backend_config = BackendConfiguration() + # TODO: Make these throw an exception if they are None GS_DATABASE_USER = environ.get("GS_DATABASE_USER") GS_DATABASE_PASSWORD = environ.get("GS_DATABASE_PASSWORD") diff --git a/gs/backend/config/cors_config.py b/gs/backend/config/cors_config.py new file mode 100644 index 000000000..767954024 --- /dev/null +++ b/gs/backend/config/cors_config.py @@ -0,0 +1,14 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class CORSConfig(BaseSettings): + """ + Pydantic class for storing CORS middleware configuration settings + """ + + model_config = SettingsConfigDict(env_prefix="CORS_") + + allow_origins: list[str] = ["http://localhost:5173"] + allow_credentials: bool = True + allow_methods: list[str] = ["*"] + allow_headers: list[str] = ["*"] diff --git a/gs/backend/config/logger_config.py b/gs/backend/config/logger_config.py new file mode 100644 index 000000000..2886e1818 --- /dev/null +++ b/gs/backend/config/logger_config.py @@ -0,0 +1,13 @@ +from collections.abc import Sequence + +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class LoggerConfig(BaseSettings): + """ + Pydantic class for storing logger middleware configuration settings + """ + + model_config = SettingsConfigDict(env_prefix="LOGGER_") + + excluded_endpoints: Sequence[str] = [] diff --git a/python_test/test_config_manager.py b/python_test/test_config_manager.py new file mode 100644 index 000000000..e33de65a4 --- /dev/null +++ b/python_test/test_config_manager.py @@ -0,0 +1,29 @@ +import importlib + +from gs.backend.config import config +from gs.backend.config.cors_config import CORSConfig +from gs.backend.config.logger_config import LoggerConfig + + +def test_logger_config_default(): + cfg = LoggerConfig() + assert cfg.excluded_endpoints == [] + + +def test_cors_config_default(): + cfg = CORSConfig() + + assert cfg.allow_origins == ["http://localhost:5173"] + assert cfg.allow_credentials == True + assert cfg.allow_methods == ["*"] + assert cfg.allow_headers == ["*"] + + +def test_backend_configuration_from_env(monkeypatch): + monkeypatch.setenv("LOGGER_EXCLUDED_ENDPOINTS", '["/test"]') + monkeypatch.setenv("CORS_ALLOW_ORIGINS", '["http://test.com"]') + + importlib.reload(config) + cfg = config.backend_config + assert "/test" in cfg.logger_config.excluded_endpoints + assert "http://test.com" in cfg.cors_config.allow_origins diff --git a/requirements.txt b/requirements.txt index 28dc36306..8a6528093 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,7 @@ hypothesis==6.131.30 psycopg2-binary==2.9.10 python-dotenv==1.1.0 tqdm==4.67 +pydantic-settings==2.4.0 # Typed packages types-requests==2.31.0