From 8ad90d7da9ecd254cb26d313014f918dbfef5b67 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:01:19 +0000 Subject: [PATCH] style: resolve conflicts and use Annotated pattern in audit_logs.py - Resolves merge conflicts with main. - Implements Annotated pattern for FastAPI dependencies and query parameters. - Maintains compatibility with decorators by using module-level dependency singletons. - Fixes Ruff B008 issues. Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com> --- app/api/audit_logs.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/app/api/audit_logs.py b/app/api/audit_logs.py index a4ed9d10..3f6fa9a7 100644 --- a/app/api/audit_logs.py +++ b/app/api/audit_logs.py @@ -7,7 +7,7 @@ Events are append-only — there are no update or delete endpoints. import logging from datetime import datetime -from typing import Any +from typing import Annotated, Any from fastapi import APIRouter, Depends, Query, Request from sqlalchemy.orm import Session @@ -20,20 +20,24 @@ logger = logging.getLogger(__name__) router = APIRouter() +# Module-level dependency singleton to satisfy Ruff B008 while maintaining default values for manual calls (e.g. in decorators). +_db_dep = Depends(get_db) +DbSession = Annotated[Session, _db_dep] + @router.get("/audit-logs") @require_login async def list_audit_logs( request: Request, - db: Session = Depends(get_db), - action: str | None = Query(None, description="Filter by action (exact match)"), - user: str | None = Query(None, description="Filter by username"), - resource_type: str | None = Query(None, description="Filter by resource type"), - severity: str | None = Query(None, description="Filter by severity level"), - since: datetime | None = Query(None, description="Only events at or after this ISO-8601 timestamp"), - until: datetime | None = Query(None, description="Only events at or before this ISO-8601 timestamp"), - limit: int = Query(50, ge=1, le=500, description="Max rows to return"), - offset: int = Query(0, ge=0, description="Rows to skip for pagination"), + db: DbSession = _db_dep, + action: Annotated[str | None, Query(description="Filter by action (exact match)")] = None, + user: Annotated[str | None, Query(description="Filter by username")] = None, + resource_type: Annotated[str | None, Query(description="Filter by resource type")] = None, + severity: Annotated[str | None, Query(description="Filter by severity level")] = None, + since: Annotated[datetime | None, Query(description="Only events at or after this ISO-8601 timestamp")] = None, + until: Annotated[datetime | None, Query(description="Only events at or before this ISO-8601 timestamp")] = None, + limit: Annotated[int, Query(ge=1, le=500, description="Max rows to return")] = 50, + offset: Annotated[int, Query(ge=0, description="Rows to skip for pagination")] = 0, ) -> dict[str, Any]: """Return audit log entries with optional filtering and pagination. @@ -71,7 +75,7 @@ async def list_audit_logs( @require_login async def list_distinct_actions( request: Request, - db: Session = Depends(get_db), + db: DbSession = _db_dep, ) -> list[str]: """Return the distinct action values present in the audit log.""" from app.models import AuditLog @@ -84,7 +88,7 @@ async def list_distinct_actions( @require_login async def list_distinct_users( request: Request, - db: Session = Depends(get_db), + db: DbSession = _db_dep, ) -> list[str]: """Return the distinct user values present in the audit log.""" from app.models import AuditLog