Skip to content

Commit c627c49

Browse files
committed
handling 404 properly
1 parent e100ba6 commit c627c49

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

app/api/snippets.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from fastapi import APIRouter, Depends
1+
from fastapi import HTTPException, APIRouter, Depends
22
from sqlalchemy.ext.asyncio import AsyncSession
33
from sqlalchemy import select
44
from app.db.session import SessionLocal
@@ -25,7 +25,10 @@ async def create_snippet(data: SnippetCreate, db: AsyncSession = Depends(get_db)
2525
return snippet
2626

2727

28-
@router.get("/{snippet_id}", response_model=SnippetOut)
28+
@router.get("/{snippet_id}")
2929
async def get_snippet(snippet_id: int, db: AsyncSession = Depends(get_db)):
3030
q = await db.execute(select(Snippet).where(Snippet.id == snippet_id))
31-
return q.scalar_one()
31+
snippet = q.scalar_one_or_none() # <-- returns None if not found
32+
if snippet is None:
33+
raise HTTPException(status_code=404, detail="Snippet not found")
34+
return snippet

app/main.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
1+
from contextlib import asynccontextmanager
12
from fastapi import FastAPI
3+
from app.db.models import Base
4+
from app.db.session import engine
25
from app.api import snippets, execute
36

4-
app = FastAPI(title="Code Snippet Execution Platform")
7+
@asynccontextmanager
8+
async def lifespan(app: FastAPI):
9+
async with engine.begin() as conn:
10+
await conn.run_sync(Base.metadata.create_all)
11+
yield
12+
await engine.dispose()
13+
14+
app = FastAPI(title="Code Snippet Execution Platform", lifespan=lifespan)
515

616
app.include_router(snippets.router)
717
app.include_router(execute.router)

0 commit comments

Comments
 (0)