api: move transaction handlung to middleware; + config fixes
This commit is contained in:
parent
2b02de2012
commit
dc3acc5da5
5 changed files with 14 additions and 64 deletions
|
|
@ -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),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
@ -4,14 +4,25 @@ import sys
|
||||||
if '' not in sys.path:
|
if '' not in sys.path:
|
||||||
sys.path = [''] + sys.path
|
sys.path = [''] + sys.path
|
||||||
|
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI, Request
|
||||||
from fastapi.responses import HTMLResponse
|
from fastapi.responses import HTMLResponse
|
||||||
|
import transaction
|
||||||
|
|
||||||
from scopes.api import tracking
|
from scopes.api import tracking
|
||||||
|
|
||||||
# app and routes
|
# app and routes
|
||||||
|
|
||||||
app = FastAPI()
|
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.include_router(tracking.router)
|
||||||
|
|
||||||
@app.get('/')
|
@app.get('/')
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@ type Storage = Annotated[Storage, Depends(deps.storage)]
|
||||||
async def get_tracks(storage: Storage):
|
async def get_tracks(storage: Storage):
|
||||||
tracks = storage.create(tracking.Container)
|
tracks = storage.create(tracking.Container)
|
||||||
result = [tr.asDict() for tr in tracks.query()]
|
result = [tr.asDict() for tr in tracks.query()]
|
||||||
transaction.commit()
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@router.post('/tracks', response_model=Track)
|
@router.post('/tracks', response_model=Track)
|
||||||
|
|
@ -38,6 +37,5 @@ async def post_track(track: Annotated[Track, Body()], storage: Storage):
|
||||||
hd = track.head
|
hd = track.head
|
||||||
tr = tracking.Track(hd['taskId'], hd['userName'], data=track.data)
|
tr = tracking.Track(hd['taskId'], hd['userName'], data=track.data)
|
||||||
tracks.save(tr)
|
tracks.save(tr)
|
||||||
transaction.commit()
|
|
||||||
return tr.asDict()
|
return tr.asDict()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
"""Tests for the fastapi- (and asyncio-) based stuff"""
|
"""Tests for the fastapi- (and asyncio-) based stuff"""
|
||||||
|
|
||||||
from scopes import config
|
from scopes import config
|
||||||
|
config.settings = config.Settings(_env_file='tests/test.env')
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from fastapi.testclient import TestClient
|
from fastapi.testclient import TestClient
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
""" Tests for the (PostgreSQL) storage-related functionalities"""
|
""" Tests for the (PostgreSQL) storage-related functionalities"""
|
||||||
|
|
||||||
from scopes import config
|
from scopes import config
|
||||||
|
config.settings = config.Settings(_env_file='tests/test.env')
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import pytest
|
import pytest
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue