This commit is contained in:
grillazz
2026-03-09 18:08:22 +01:00
parent 21c5953385
commit a24f440a19
4 changed files with 27 additions and 8 deletions
+22 -3
View File
@@ -1,5 +1,9 @@
from collections.abc import Callable
from typing import Annotated, Any
from fastapi import APIRouter, Depends, HTTPException, Request, status from fastapi import APIRouter, Depends, HTTPException, Request, status
from app.services.logging import get_logger from pydantic import ValidationError, WrapValidator
from rotoger import get_logger
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
@@ -22,12 +26,26 @@ async def create_random_stuff(
return {"id": str(random_stuff.id)} return {"id": str(random_stuff.id)}
failed_items: list[dict] = [] # Global or pass via context
def catch_invalid(v: Any, handler: Callable[[Any], Any] ) -> Any:
try:
return handler(v)
except ValidationError:
failed_items.append(v) # Intercept here!
return None # Or raise if needed
@router.post("/add_many", status_code=status.HTTP_201_CREATED) @router.post("/add_many", status_code=status.HTTP_201_CREATED)
async def create_multi_stuff( async def create_multi_stuff(
payload: list[StuffSchema], db_session: AsyncSession = Depends(get_db) payload: list[Annotated[StuffSchema, WrapValidator(catch_invalid)]], db_session: AsyncSession = Depends(get_db)
): ):
await logger.ainfo(f">>>{failed_items}")
try: try:
stuff_instances = [Stuff(**stuff.model_dump()) for stuff in payload] await logger.ainfo(f">>>{failed_items}")
await logger.ainfo(f">>>{payload}")
stuff_instances = [
Stuff(**stuff.model_dump()) for stuff in payload if stuff is not None
]
db_session.add_all(stuff_instances) db_session.add_all(stuff_instances)
await db_session.commit() await db_session.commit()
except SQLAlchemyError as ex: except SQLAlchemyError as ex:
@@ -39,6 +57,7 @@ async def create_multi_stuff(
await logger.ainfo( await logger.ainfo(
f"{len(stuff_instances)} Stuff instances inserted into the database." f"{len(stuff_instances)} Stuff instances inserted into the database."
) )
return {"inserted": len(stuff_instances)}
return True return True
+1 -2
View File
@@ -5,7 +5,7 @@ import asyncpg
from fastapi import Depends, FastAPI, Request from fastapi import Depends, FastAPI, Request
from fastapi.responses import HTMLResponse from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from app.services.logging import get_logger from rotoger import get_logger
from starlette.middleware import Middleware from starlette.middleware import Middleware
from starlette.middleware.gzip import GZipMiddleware from starlette.middleware.gzip import GZipMiddleware
@@ -21,7 +21,6 @@ from app.middleware.profiler import ProfilingMiddleware
from app.redis import get_redis from app.redis import get_redis
from app.services.auth import AuthBearer from app.services.auth import AuthBearer
# logger = get_logger()
templates = Jinja2Templates(directory=Path(__file__).parent.parent / "templates") templates = Jinja2Templates(directory=Path(__file__).parent.parent / "templates")
+2 -2
View File
@@ -1,7 +1,7 @@
from typing import Any, Callable from typing import Any
from uuid import UUID from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field, WrapValidator, ValidationError from pydantic import BaseModel, ConfigDict, Field
config = ConfigDict(from_attributes=True) config = ConfigDict(from_attributes=True)
+2 -1
View File
@@ -1,5 +1,6 @@
from granian import Granian from granian import Granian
def startup(): def startup():
print("Server starting up...") print("Server starting up...")
@@ -16,4 +17,4 @@ server = Granian(
) )
server.on_startup(startup) server.on_startup(startup)
server.on_shutdown(shutdown) server.on_shutdown(shutdown)
server.serve_forever() server.serve_forever()