From f5f4e67b2d17b0c2ea768c2c7821f271dba640d9 Mon Sep 17 00:00:00 2001 From: Johnny Bouder Date: Wed, 12 Nov 2025 13:37:00 -0500 Subject: [PATCH 1/2] Use fastapi root_path for prefix. --- README.md | 2 +- app/admin/router.py | 2 +- app/applicants/router.py | 6 +++--- app/cases/router.py | 7 +++---- app/config.py | 2 +- app/health/router.py | 6 ++---- app/main.py | 6 +++++- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 96f5032..b709b70 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ The goal of this project is to provide a Python-based starter API, which comes p To override default environment variables, add a `.env` file to the `comet-api` directory and update as needed (optional): ``` -API_PREFIX=[SOME_ROUTE] # Ex: '/api' +ROOT_PATH=[SOME_ROUTE] # Ex: '/api' DATABASE_URL=[SOME_URL] # Ex: 'postgresql://username:password@localhost:5432/database_name' OIDC_CONFIG_URL=[SOME_URL] # Ex: 'https://keycloak.auth.metrostar.cloud/auth/realms/dev/.well-known/openid-configuration' LOG_LEVEL=[LOG_LEVEL] # Ex: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL' (Default: 'INFO') diff --git a/app/admin/router.py b/app/admin/router.py index 0b408ed..47cfa28 100644 --- a/app/admin/router.py +++ b/app/admin/router.py @@ -7,7 +7,7 @@ from app.config import settings router = APIRouter( - prefix=f"{settings.API_PREFIX}/admin", + prefix="/admin", tags=["Admin"], ) diff --git a/app/applicants/router.py b/app/applicants/router.py index acde63b..96051e8 100644 --- a/app/applicants/router.py +++ b/app/applicants/router.py @@ -15,7 +15,7 @@ from app.db import get_db router = APIRouter( - prefix=f"{settings.API_PREFIX}/applicants", + prefix="/applicants", tags=["Applicants"], responses={404: {"description": "Endpoint not found"}}, ) @@ -24,7 +24,7 @@ db_session = Annotated[Session, Depends(get_db)] -@router.get("/", status_code=status.HTTP_200_OK, response_model=ApplicantListResponse) +@router.get("", status_code=status.HTTP_200_OK, response_model=ApplicantListResponse) async def get_applicants(db: db_session, page_number: int = 0, page_size: int = 100): """Retrieve a paginated list of all applicants. @@ -39,7 +39,7 @@ async def get_applicants(db: db_session, page_number: int = 0, page_size: int = return service.get_items(db, page_number, page_size) -@router.post("/", status_code=status.HTTP_201_CREATED, response_model=ApplicantResponse) +@router.post("", status_code=status.HTTP_201_CREATED, response_model=ApplicantResponse) async def create_applicant(applicant: ApplicantCreate, db: db_session): """Create a new applicant. diff --git a/app/cases/router.py b/app/cases/router.py index 162b82f..db66363 100644 --- a/app/cases/router.py +++ b/app/cases/router.py @@ -12,11 +12,10 @@ CaseUpdate, CaseWithApplicant, ) -from app.config import settings from app.db import get_db router = APIRouter( - prefix=f"{settings.API_PREFIX}/cases", + prefix="/cases", tags=["Cases"], responses={404: {"description": "Endpoint not found"}}, ) @@ -25,7 +24,7 @@ db_session = Annotated[Session, Depends(get_db)] -@router.get("/", status_code=status.HTTP_200_OK, response_model=CaseListResponse) +@router.get("", status_code=status.HTTP_200_OK, response_model=CaseListResponse) async def get_cases(db: db_session, page_number: int = 0, page_size: int = 100): """Retrieve a paginated list of all cases. @@ -40,7 +39,7 @@ async def get_cases(db: db_session, page_number: int = 0, page_size: int = 100): return service.get_items(db, page_number, page_size) -@router.post("/", status_code=status.HTTP_201_CREATED, response_model=CaseResponse) +@router.post("", status_code=status.HTTP_201_CREATED, response_model=CaseResponse) async def create_case(case: CaseCreate, db: db_session): """Create a new case. diff --git a/app/config.py b/app/config.py index cd7c784..b1b9f28 100644 --- a/app/config.py +++ b/app/config.py @@ -10,7 +10,7 @@ class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env") - API_PREFIX: str = "" + ROOT_PATH: str = "" DATABASE_URL: str = "sqlite:///./db.sqlite3" OIDC_CONFIG_URL: str | None = None LOG_LEVEL: str = "INFO" diff --git a/app/health/router.py b/app/health/router.py index 27a40bc..bdabcdf 100644 --- a/app/health/router.py +++ b/app/health/router.py @@ -1,15 +1,13 @@ from fastapi import APIRouter from starlette import status -from app.config import settings - router = APIRouter( - prefix=f"{settings.API_PREFIX}/health", + prefix="/health", tags=["Health"], ) -@router.get("/", status_code=status.HTTP_200_OK) +@router.get("", status_code=status.HTTP_200_OK) def get_health(): """Health check endpoint. diff --git a/app/main.py b/app/main.py index 3656678..3c074b8 100644 --- a/app/main.py +++ b/app/main.py @@ -8,6 +8,7 @@ from app.admin.router import router as admin_router from app.applicants.router import router as applicants_router from app.cases.router import router as cases_router +from app.config import settings from app.db import Base, engine from app.health.router import router as health_router from app.utils import setup_logging @@ -16,8 +17,11 @@ setup_logging() logger = logging.getLogger(__name__) +# Set root path if specified in settings +root_path = settings.ROOT_PATH if settings.ROOT_PATH else "" + # Create the app -app = FastAPI() +app = FastAPI(root_path=root_path) logger.info("FastAPI application initialized") # Set up CORS middleware From 0dcdddf09f3b36a5360a3dc5787c1b8e40114b67 Mon Sep 17 00:00:00 2001 From: Johnny Bouder Date: Wed, 12 Nov 2025 13:39:43 -0500 Subject: [PATCH 2/2] Remove ununsed imports. --- app/admin/router.py | 1 - app/applicants/router.py | 1 - 2 files changed, 2 deletions(-) diff --git a/app/admin/router.py b/app/admin/router.py index 47cfa28..dcaf979 100644 --- a/app/admin/router.py +++ b/app/admin/router.py @@ -4,7 +4,6 @@ from starlette import status from app.auth import validate_jwt -from app.config import settings router = APIRouter( prefix="/admin", diff --git a/app/applicants/router.py b/app/applicants/router.py index 96051e8..0989905 100644 --- a/app/applicants/router.py +++ b/app/applicants/router.py @@ -11,7 +11,6 @@ ApplicantResponse, ApplicantUpdate, ) -from app.config import settings from app.db import get_db router = APIRouter(