fix part 2

This commit is contained in:
Danilo Reyes
2025-11-02 18:23:10 -06:00
parent 376ac1dec9
commit 209b6d9f18
18 changed files with 328 additions and 125 deletions

View File

@@ -3,9 +3,10 @@
from uuid import UUID
from fastapi import APIRouter, Depends, File, HTTPException, UploadFile, status
from sqlalchemy.orm import Session
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.deps import get_current_user, get_db
from app.core.deps import get_current_user_async, get_db
from app.database.models.board import Board
from app.database.models.user import User
from app.images.processing import generate_thumbnails
@@ -30,7 +31,7 @@ router = APIRouter(prefix="/images", tags=["images"])
@router.post("/upload", response_model=ImageUploadResponse, status_code=status.HTTP_201_CREATED)
async def upload_image(
file: UploadFile = File(...),
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -64,7 +65,7 @@ async def upload_image(
checksum = calculate_checksum(contents)
# Create metadata
metadata = {"format": mime_type.split("/")[1], "checksum": checksum, "thumbnails": thumbnail_paths}
image_metadata = {"format": mime_type.split("/")[1], "checksum": checksum, "thumbnails": thumbnail_paths}
# Create database record
repo = ImageRepository(db)
@@ -76,7 +77,7 @@ async def upload_image(
mime_type=mime_type,
width=width,
height=height,
metadata=metadata,
image_metadata=image_metadata,
)
return image
@@ -85,7 +86,7 @@ async def upload_image(
@router.post("/upload-zip", response_model=list[ImageUploadResponse])
async def upload_zip(
file: UploadFile = File(...),
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -120,7 +121,7 @@ async def upload_zip(
checksum = calculate_checksum(contents)
# Create metadata
metadata = {
img_metadata = {
"format": mime_type.split("/")[1],
"checksum": checksum,
"thumbnails": thumbnail_paths,
@@ -135,7 +136,7 @@ async def upload_zip(
mime_type=mime_type,
width=width,
height=height,
metadata=metadata,
image_metadata=img_metadata,
)
uploaded_images.append(image)
@@ -155,7 +156,7 @@ async def upload_zip(
async def get_image_library(
page: int = 1,
page_size: int = 50,
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -173,7 +174,7 @@ async def get_image_library(
@router.get("/{image_id}", response_model=ImageResponse)
async def get_image(
image_id: UUID,
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""Get image by ID."""
@@ -193,7 +194,7 @@ async def get_image(
@router.delete("/{image_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_image(
image_id: UUID,
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -223,8 +224,8 @@ async def delete_image(
from app.images.upload import delete_image_from_storage
await delete_image_from_storage(image.storage_path)
if "thumbnails" in image.metadata:
await delete_thumbnails(image.metadata["thumbnails"])
if "thumbnails" in image.image_metadata:
await delete_thumbnails(image.image_metadata["thumbnails"])
# Delete from database
await repo.delete_image(image_id)
@@ -234,7 +235,7 @@ async def delete_image(
async def add_image_to_board(
board_id: UUID,
data: BoardImageCreate,
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -243,8 +244,6 @@ async def add_image_to_board(
The image must already be uploaded and owned by the current user.
"""
# 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()
@@ -284,7 +283,7 @@ async def update_board_image(
board_id: UUID,
image_id: UUID,
data: BoardImageUpdate,
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -294,8 +293,6 @@ async def update_board_image(
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()
@@ -329,7 +326,7 @@ async def update_board_image(
async def remove_image_from_board(
board_id: UUID,
image_id: UUID,
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -339,8 +336,6 @@ async def remove_image_from_board(
The image remains in the user's library.
"""
# 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()
@@ -362,7 +357,7 @@ async def remove_image_from_board(
async def bulk_update_board_images(
board_id: UUID,
data: BulkImageUpdate,
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -371,8 +366,6 @@ async def bulk_update_board_images(
Applies the same changes to all specified images. Useful for multi-selection operations.
"""
# 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()
@@ -438,7 +431,7 @@ async def bulk_update_board_images(
@router.get("/boards/{board_id}/images", response_model=list[BoardImageResponse])
async def get_board_images(
board_id: UUID,
current_user: User = Depends(get_current_user),
current_user: User = Depends(get_current_user_async),
db: AsyncSession = Depends(get_db),
):
"""
@@ -447,8 +440,6 @@ async def get_board_images(
Used for loading board contents in the canvas.
"""
# Verify board access (owner or shared link - for now just owner)
from sqlalchemy import select
board_result = await db.execute(select(Board).where(Board.id == board_id))
board = board_result.scalar_one_or_none()