import uuid from fastapi import APIRouter, Depends, status from sqlalchemy.ext.asyncio import AsyncSession from app.auth.dependencies import get_current_user from app.database import get_session from app.models.category import CategoryType from app.models.user import User from app.schemas.category import CategoryCreate, CategoryResponse, CategoryUpdate from app.services import category_service router = APIRouter(prefix="/categories", tags=["categories"]) @router.get("", response_model=list[CategoryResponse]) async def list_categories( type: CategoryType | None = None, session: AsyncSession = Depends(get_session), current_user: User = Depends(get_current_user), ) -> list[CategoryResponse]: cats = await category_service.list_categories(session, current_user.id, type_filter=type) return [CategoryResponse.model_validate(c) for c in cats] @router.post("", response_model=CategoryResponse, status_code=status.HTTP_201_CREATED) async def create_category( data: CategoryCreate, session: AsyncSession = Depends(get_session), current_user: User = Depends(get_current_user), ) -> CategoryResponse: cat = await category_service.create_category(session, current_user.id, data) return CategoryResponse.model_validate(cat) @router.put("/{category_id}", response_model=CategoryResponse) async def update_category( category_id: uuid.UUID, data: CategoryUpdate, session: AsyncSession = Depends(get_session), current_user: User = Depends(get_current_user), ) -> CategoryResponse: cat = await category_service.update_category(session, current_user.id, category_id, data) return CategoryResponse.model_validate(cat) @router.delete("/{category_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_category( category_id: uuid.UUID, session: AsyncSession = Depends(get_session), current_user: User = Depends(get_current_user), ) -> None: await category_service.delete_category(session, current_user.id, category_id)