diff --git a/apidemo/config.py b/apidemo/config.py deleted file mode 100644 index 951e5d1..0000000 --- a/apidemo/config.py +++ /dev/null @@ -1,61 +0,0 @@ -# py-scopes/apidemo/config.py -from pydantic_settings import BaseSettings, SettingsConfigDict - -class Settings(BaseSettings): - model_config = SettingsConfigDict(env_file='.env', extra='ignore') - #, env_prefix='SCOPES_') - - base_url: str = 'https://test.cy7.eu' - - log_file: str = 'log/scopes.log' - log_level: str = 'INFO' - log_format: str = '%(asctime)s %(levelname)s %(name)s %(message)s' - log_dateformat: str = '%Y-%m-%dT%H:%M:%S' - - dbengine: str = 'postgresql+psycopg' - dbname: str = 'demo' - dbuser: str = 'demo' - dbpassword: str = 'secret' - dbschema: str = 'demo' - -settings = Settings() - -from dotenv import load_dotenv -import logging -from os import getenv - -load_dotenv() - -base_url = settings.base_url - -logging.basicConfig(filename=settings.log_file, level=settings.log_level, - format=settings.log_format, datefmt=settings.log_dateformat) -logging.getLogger('uvicorn.error').propagate = True - -# storage settings -from scopes.storage.db.postgres import StorageFactory -dbengine = settings.dbengine -dbname = settings.dbname -dbuser = settings.dbuser -dbpassword = settings.dbpassword -dbschema = settings.dbschema - -# authentication settings -oidc_provider = getenv('OIDC_PROVIDER', 'https://a1.cy7.de') -oidc_client_id = getenv('OIDC_CLIENT_ID', '12345') -oidc_params = dict( - op_config_url=oidc_provider + '/.well-known/openid-configuration', - op_uris=None, - op_keys=None, - op_project_scope='urn:zitadel:iam:org:project:id:zitadel:aud', - callback_url=getenv('OIDC_CALLBACK_URL', base_url + '/auth/callback'), - client_id = oidc_client_id, - cookie_name=getenv('OIDC_COOKIE_NAME', 'oidc_' + oidc_client_id), - cookie_domain=getenv('OIDC_COOKIE_DOMAIN', None), - cookie_lifetime=getenv('OIDC_COOKIE_LIFETIME', '86400'), - cookie_crypt=getenv('OIDC_COOKIE_CRYPT', None), - private_key_file=getenv('OIDC_SERVICE_USER_PRIVATE_KEY_FILE', '.private-key.json'), - organization_id=getenv('OIDC_ORGANIZATION_ID', '12346'), - project_id=getenv('OIDC_PROJECT_ID', None), -) - diff --git a/scopes/api/main.py b/scopes/api/main.py index 9de6a67..67c988e 100644 --- a/scopes/api/main.py +++ b/scopes/api/main.py @@ -4,14 +4,25 @@ import sys if '' not in sys.path: sys.path = [''] + sys.path -from fastapi import FastAPI +from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse +import transaction from scopes.api import tracking # app and routes app = FastAPI() + +@app.middleware('http') +async def handle_transactions(request: Request, call_next): + response = await call_next(request) + if response.status_code >= 400: + transaction.abort() + else: + transaction.commit() + return response + app.include_router(tracking.router) @app.get('/') diff --git a/scopes/api/tracking.py b/scopes/api/tracking.py index 5d2eb5f..c99e31e 100644 --- a/scopes/api/tracking.py +++ b/scopes/api/tracking.py @@ -29,7 +29,6 @@ type Storage = Annotated[Storage, Depends(deps.storage)] async def get_tracks(storage: Storage): tracks = storage.create(tracking.Container) result = [tr.asDict() for tr in tracks.query()] - transaction.commit() return result @router.post('/tracks', response_model=Track) @@ -38,6 +37,5 @@ async def post_track(track: Annotated[Track, Body()], storage: Storage): hd = track.head tr = tracking.Track(hd['taskId'], hd['userName'], data=track.data) tracks.save(tr) - transaction.commit() return tr.asDict() diff --git a/tests/test_api.py b/tests/test_api.py index 10ef68b..a258c63 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3,6 +3,7 @@ """Tests for the fastapi- (and asyncio-) based stuff""" from scopes import config +config.settings = config.Settings(_env_file='tests/test.env') import pytest from fastapi.testclient import TestClient diff --git a/tests/test_storage.py b/tests/test_storage.py index c24ec92..53fe3bc 100644 --- a/tests/test_storage.py +++ b/tests/test_storage.py @@ -3,6 +3,7 @@ """ Tests for the (PostgreSQL) storage-related functionalities""" from scopes import config +config.settings = config.Settings(_env_file='tests/test.env') from datetime import datetime import pytest