Skip to content

Commit 5d0207c

Browse files
authored
Merge pull request #238 from grillazz/rotoger-one-more-time
rotoger-one-more-time
2 parents ab887ad + a24f440 commit 5d0207c

6 files changed

Lines changed: 54 additions & 16 deletions

File tree

app/api/stuff.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
from collections.abc import Callable
2+
from typing import Annotated, Any
3+
14
from fastapi import APIRouter, Depends, HTTPException, Request, status
5+
from pydantic import ValidationError, WrapValidator
26
from rotoger import get_logger
37
from sqlalchemy.exc import SQLAlchemyError
48
from sqlalchemy.ext.asyncio import AsyncSession
@@ -22,12 +26,26 @@ async def create_random_stuff(
2226
return {"id": str(random_stuff.id)}
2327

2428

29+
failed_items: list[dict] = [] # Global or pass via context
30+
31+
def catch_invalid(v: Any, handler: Callable[[Any], Any] ) -> Any:
32+
try:
33+
return handler(v)
34+
except ValidationError:
35+
failed_items.append(v) # Intercept here!
36+
return None # Or raise if needed
37+
2538
@router.post("/add_many", status_code=status.HTTP_201_CREATED)
2639
async def create_multi_stuff(
27-
payload: list[StuffSchema], db_session: AsyncSession = Depends(get_db)
40+
payload: list[Annotated[StuffSchema, WrapValidator(catch_invalid)]], db_session: AsyncSession = Depends(get_db)
2841
):
42+
await logger.ainfo(f">>>{failed_items}")
2943
try:
30-
stuff_instances = [Stuff(**stuff.model_dump()) for stuff in payload]
44+
await logger.ainfo(f">>>{failed_items}")
45+
await logger.ainfo(f">>>{payload}")
46+
stuff_instances = [
47+
Stuff(**stuff.model_dump()) for stuff in payload if stuff is not None
48+
]
3149
db_session.add_all(stuff_instances)
3250
await db_session.commit()
3351
except SQLAlchemyError as ex:
@@ -39,6 +57,7 @@ async def create_multi_stuff(
3957
await logger.ainfo(
4058
f"{len(stuff_instances)} Stuff instances inserted into the database."
4159
)
60+
return {"inserted": len(stuff_instances)}
4261
return True
4362

4463

app/main.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@
2121
from app.redis import get_redis
2222
from app.services.auth import AuthBearer
2323

24-
logger = get_logger()
2524
templates = Jinja2Templates(directory=Path(__file__).parent.parent / "templates")
2625

2726

2827
@asynccontextmanager
2928
async def lifespan(app: FastAPI):
29+
app.logger = get_logger()
3030
app.redis = await get_redis()
3131
postgres_dsn = global_settings.postgres_url.unicode_string()
3232
try:
@@ -35,12 +35,12 @@ async def lifespan(app: FastAPI):
3535
min_size=5,
3636
max_size=20,
3737
)
38-
await logger.ainfo(
38+
await app.logger.ainfo(
3939
"Postgres pool created", idle_size=app.postgres_pool.get_idle_size()
4040
)
4141
yield
4242
except Exception as e:
43-
await logger.aerror("Error during app startup", error=repr(e))
43+
await app.logger.aerror("Error during app startup", error=repr(e))
4444
raise
4545
finally:
4646
await app.redis.close()

app/schemas/stuff.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
config = ConfigDict(from_attributes=True)
77

8-
98
class RandomStuff(BaseModel):
109
chaos: dict[str, Any] = Field(
1110
..., description="Pretty chaotic JSON data can be added here..."

app/server.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from granian import Granian
2+
3+
4+
def startup():
5+
print("Server starting up...")
6+
7+
def shutdown():
8+
print("Server shutting down...")
9+
10+
server = Granian(
11+
"main:app",
12+
host="0.0.0.0", # Bind to all interfaces
13+
port=8000,
14+
workers=4,
15+
interface="asgi",
16+
blocking_threads=8 # Optional: threads per worker for blocking ops
17+
)
18+
server.on_startup(startup)
19+
server.on_shutdown(shutdown)
20+
server.serve_forever()

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ dependencies = [
2222
"redis==7.1.0",
2323
"bcrypt==5.0.0",
2424
"polars[pyarrow]==1.36.1",
25-
"python-multipart==0.0.20",
25+
"python-multipart==0.0.22",
2626
"fastexcel==0.18.0",
2727
"inline-snapshot==0.31.1",
2828
"dirty-equals==0.11",
2929
"polyfactory==3.1.0",
3030
"granian==2.6.0",
3131
"apscheduler[redis,sqlalchemy]>=4.0.0a6",
32-
"rotoger==0.2.1",
32+
"rotoger==0.3.0",
3333
"pyinstrument>=5.1.2",
3434
]
3535

uv.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)