Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ compile_commands.json
*.sw?

.env
.*.env
*.db

/build*
Expand Down
6 changes: 5 additions & 1 deletion gs/backend/api/backend_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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,
)
10 changes: 6 additions & 4 deletions gs/backend/api/middleware/cors_middleware.py
Original file line number Diff line number Diff line change
@@ -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:
"""
Expand All @@ -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,
)
15 changes: 15 additions & 0 deletions gs/backend/config/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
14 changes: 14 additions & 0 deletions gs/backend/config/cors_config.py
Original file line number Diff line number Diff line change
@@ -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] = ["*"]
13 changes: 13 additions & 0 deletions gs/backend/config/logger_config.py
Original file line number Diff line number Diff line change
@@ -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] = []
29 changes: 29 additions & 0 deletions python_test/test_config_manager.py
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading