This commit is contained in:
Danilo Reyes
2025-11-02 14:03:01 -06:00
parent f85ae4d417
commit 3700ba02ea
14 changed files with 3103 additions and 19 deletions

View File

@@ -14,6 +14,7 @@ from app.images.repository import ImageRepository
from app.images.schemas import (
BoardImageCreate,
BoardImageResponse,
BoardImageUpdate,
ImageListResponse,
ImageResponse,
ImageUploadResponse,
@@ -277,6 +278,52 @@ async def add_image_to_board(
return board_image
@router.patch("/boards/{board_id}/images/{image_id}", response_model=BoardImageResponse)
async def update_board_image(
board_id: UUID,
image_id: UUID,
data: BoardImageUpdate,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
"""
Update board image position, transformations, z-order, or group.
This endpoint is optimized for frequent position updates (debounced from frontend).
Only provided fields are updated.
"""
# Verify board ownership
from sqlalchemy import select
board_result = await db.execute(select(Board).where(Board.id == board_id))
board = board_result.scalar_one_or_none()
if not board:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Board not found")
if board.user_id != current_user.id:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Access denied")
# Update board image
repo = ImageRepository(db)
board_image = await repo.update_board_image(
board_id=board_id,
image_id=image_id,
position=data.position,
transformations=data.transformations,
z_order=data.z_order,
group_id=data.group_id,
)
if not board_image:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Image not on this board")
# Load image relationship for response
await db.refresh(board_image, ["image"])
return board_image
@router.delete("/boards/{board_id}/images/{image_id}", status_code=status.HTTP_204_NO_CONTENT)
async def remove_image_from_board(
board_id: UUID,