feat: add lifespan integration and dependency injection

This commit is contained in:
Johan Lundberg 2026-02-13 13:59:59 +01:00
parent 9f4914a922
commit a45604ff2f
No known key found for this signature in database
GPG key ID: A6C152738D03C7D1
4 changed files with 88 additions and 3 deletions

View file

@ -1,6 +1,39 @@
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from pathlib import Path
import aiosqlite
from fastapi import FastAPI
from fastapi_oidc_op.config import Settings
from fastapi_oidc_op.config import Settings, StorageBackend
from fastapi_oidc_op.store.sqlite.migrations import run_migrations
from fastapi_oidc_op.store.sqlite.repositories import (
SQLiteCredentialRepository,
SQLiteMagicLinkRepository,
SQLiteUserRepository,
)
MIGRATIONS_DIR = Path(__file__).parent / "store" / "sqlite" / "migrations"
@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
settings: Settings = app.state.settings
if settings.storage_backend == StorageBackend.SQLITE:
if settings.sqlite_path != ":memory:":
Path(settings.sqlite_path).parent.mkdir(parents=True, exist_ok=True)
db = await aiosqlite.connect(settings.sqlite_path)
db.row_factory = aiosqlite.Row
await db.execute("PRAGMA journal_mode=WAL")
await db.execute("PRAGMA foreign_keys=ON")
await run_migrations(db, MIGRATIONS_DIR)
app.state.user_repo = SQLiteUserRepository(db)
app.state.credential_repo = SQLiteCredentialRepository(db)
app.state.magic_link_repo = SQLiteMagicLinkRepository(db)
yield
await db.close()
else:
raise NotImplementedError("MongoDB backend not yet implemented")
def create_app(settings: Settings | None = None) -> FastAPI:
@ -12,6 +45,7 @@ def create_app(settings: Settings | None = None) -> FastAPI:
version="0.1.0",
docs_url="/docs" if settings.debug else None,
redoc_url=None,
lifespan=lifespan,
)
app.state.settings = settings

View file

@ -0,0 +1,19 @@
from fastapi import Request
from fastapi_oidc_op.store.protocols import (
CredentialRepository,
MagicLinkRepository,
UserRepository,
)
def get_user_repo(request: Request) -> UserRepository:
return request.app.state.user_repo
def get_credential_repo(request: Request) -> CredentialRepository:
return request.app.state.credential_repo
def get_magic_link_repo(request: Request) -> MagicLinkRepository:
return request.app.state.magic_link_repo