From be371a050908c715083f40ff81d9a3e7462dc45c Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Sat, 17 Sep 2022 09:37:11 +0200 Subject: [PATCH 1/3] refactor to instantiate app with deployment settings --- src/climsoft_api/main.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/climsoft_api/main.py b/src/climsoft_api/main.py index 9ab4894..a74dd04 100644 --- a/src/climsoft_api/main.py +++ b/src/climsoft_api/main.py @@ -2,19 +2,23 @@ from pathlib import Path from climsoft_api.db import SessionLocal from fastapi import Response, Request -from climsoft_api.config import settings +from climsoft_api.config import settings, Settings from climsoft_api.middlewares.localization import LocalizationMiddleware from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from starlette.middleware.base import BaseHTTPMiddleware from climsoft_api.api import api_routers - +from sqlalchemy import create_engine +from sqlalchemy.engine import Engine +from sqlalchemy.orm import sessionmaker # load controllers -def get_app(): +def get_app(config=None): app = FastAPI(docs_url="/") app.add_middleware(BaseHTTPMiddleware, dispatch=LocalizationMiddleware()) + if config: + settings = Settings(**config) if settings.MOUNT_STATIC: try: Path(settings.UPLOAD_DIR).mkdir(parents=True, exist_ok=True) @@ -28,6 +32,10 @@ def get_app(): @app.middleware("http") async def db_session_middleware(request: Request, call_next): + if config.get("DATABASE_URI"): + engine: Engine = create_engine(config.get("DATABASE_URI")) + SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False) + try: request.state.get_session = SessionLocal response = await call_next(request) From 9f5ca03772a52614c503497ca46dbb6f80d2758a Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Sat, 17 Sep 2022 11:55:55 +0200 Subject: [PATCH 2/3] remove unnecessary import --- src/climsoft_api/main.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/climsoft_api/main.py b/src/climsoft_api/main.py index a74dd04..318d774 100644 --- a/src/climsoft_api/main.py +++ b/src/climsoft_api/main.py @@ -2,7 +2,7 @@ from pathlib import Path from climsoft_api.db import SessionLocal from fastapi import Response, Request -from climsoft_api.config import settings, Settings +from climsoft_api.config import settings from climsoft_api.middlewares.localization import LocalizationMiddleware from fastapi import FastAPI from fastapi.staticfiles import StaticFiles @@ -17,8 +17,6 @@ def get_app(config=None): app = FastAPI(docs_url="/") app.add_middleware(BaseHTTPMiddleware, dispatch=LocalizationMiddleware()) - if config: - settings = Settings(**config) if settings.MOUNT_STATIC: try: Path(settings.UPLOAD_DIR).mkdir(parents=True, exist_ok=True) @@ -35,7 +33,6 @@ async def db_session_middleware(request: Request, call_next): if config.get("DATABASE_URI"): engine: Engine = create_engine(config.get("DATABASE_URI")) SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False) - try: request.state.get_session = SessionLocal response = await call_next(request) @@ -46,8 +43,8 @@ async def db_session_middleware(request: Request, call_next): return app -def get_app_with_routers(): - app = get_app() +def get_app_with_routers(config=None): + app = get_app(config) for router in api_routers: app.include_router(**router.dict()) From 0b07a69bfd3c104fbf607b89c2483abb40c6840e Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Sat, 24 Sep 2022 12:24:07 +0200 Subject: [PATCH 3/3] refactor statistics endpoint --- src/climsoft_api/api/statistics/router.py | 18 ++++++++++-------- src/climsoft_api/main.py | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/climsoft_api/api/statistics/router.py b/src/climsoft_api/api/statistics/router.py index 0e72378..37d57a4 100644 --- a/src/climsoft_api/api/statistics/router.py +++ b/src/climsoft_api/api/statistics/router.py @@ -3,9 +3,11 @@ from climsoft_api.db import engine from climsoft_api.utils.response import get_error_response -from fastapi import APIRouter +from fastapi import APIRouter, Depends from opencdms.models.climsoft.v4_1_1_core import TARGET_TABLES from sqlalchemy import text +from sqlalchemy.orm import Session +from climsoft_api.api import deps router = APIRouter() @@ -47,16 +49,16 @@ class ClimsoftTables(str, enum.Enum): "/statistics", ) # async def get_statistics_for_all_climsoft_tables(table: ClimsoftTables): -async def get_statistics_for_all_climsoft_tables(): +async def get_statistics_for_all_climsoft_tables( + db_session: Session = Depends(deps.get_session) +): try: stats = {} for _table in TARGET_TABLES: - with engine.connect() as connection: - result = connection.execute( - text(f"SELECT COUNT(*) as count FROM {_table};") - ) - count = [row['count'] for row in result][0] - stats[_table] = count + result = db_session.execute( + text(f"SELECT COUNT(*) as count FROM {_table};") + ) + stats[_table] = [row['count'] for row in result][0] return stats except TypeError: raise diff --git a/src/climsoft_api/main.py b/src/climsoft_api/main.py index 318d774..1be7926 100644 --- a/src/climsoft_api/main.py +++ b/src/climsoft_api/main.py @@ -30,7 +30,7 @@ def get_app(config=None): @app.middleware("http") async def db_session_middleware(request: Request, call_next): - if config.get("DATABASE_URI"): + if config is not None and config.get("DATABASE_URI"): engine: Engine = create_engine(config.get("DATABASE_URI")) SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False) try: