api: move transaction handlung to middleware; + config fixes

This commit is contained in:
Helmut Merz 2026-11-02 09:46:58 +01:00
parent 2b02de2012
commit dc3acc5da5
5 changed files with 14 additions and 64 deletions

View file

@ -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),
)

View file

@ -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('/')

View file

@ -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()

View file

@ -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

View file

@ -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