8a18ded2bc
FastAPI's redirect_slashes=True causes GET /api/v1/canvas to 307 redirect to /api/v1/canvas/ — axios follows the redirect but drops the Authorization header, resulting in 403. Fixed by declaring routes as empty string instead of '/' so no redirect is issued. Same fix applied to nodes and edges routes. Updated all tests to use paths without trailing slashes.
49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.api.deps import get_current_user
|
|
from app.db.database import get_db
|
|
from app.db.models import Edge
|
|
from app.schemas.edges import EdgeCreate, EdgeResponse, EdgeUpdate
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("", response_model=list[EdgeResponse])
|
|
async def list_edges(db: AsyncSession = Depends(get_db), _: str = Depends(get_current_user)):
|
|
result = await db.execute(select(Edge))
|
|
return result.scalars().all()
|
|
|
|
|
|
@router.post("", response_model=EdgeResponse, status_code=status.HTTP_201_CREATED)
|
|
async def create_edge(body: EdgeCreate, db: AsyncSession = Depends(get_db), _: str = Depends(get_current_user)):
|
|
edge = Edge(**body.model_dump())
|
|
db.add(edge)
|
|
await db.commit()
|
|
await db.refresh(edge)
|
|
return edge
|
|
|
|
|
|
@router.delete("/{edge_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
async def delete_edge(edge_id: str, db: AsyncSession = Depends(get_db), _: str = Depends(get_current_user)):
|
|
edge = await db.get(Edge, edge_id)
|
|
if not edge:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Edge not found")
|
|
await db.delete(edge)
|
|
await db.commit()
|
|
|
|
|
|
@router.patch("/{edge_id}", response_model=EdgeResponse)
|
|
async def update_edge(
|
|
edge_id: str, body: EdgeUpdate, db: AsyncSession = Depends(get_db), _: str = Depends(get_current_user)
|
|
):
|
|
edge = await db.get(Edge, edge_id)
|
|
if not edge:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Edge not found")
|
|
for field, value in body.model_dump(exclude_unset=True).items():
|
|
setattr(edge, field, value)
|
|
await db.commit()
|
|
await db.refresh(edge)
|
|
return edge
|