from typing import List, Optional from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from app.models.category import Category from app.schemas.category import CategoryCreate, CategoryUpdate async def get_categories(db: AsyncSession) -> List[Category]: """Get all categories.""" result = await db.execute(select(Category)) return result.scalars().all() async def get_category(db: AsyncSession, category_id: int) -> Optional[Category]: """Get a category by ID.""" return await db.get(Category, category_id) async def get_category_with_products( db: AsyncSession, category_id: int ) -> Optional[Category]: """Get a category with related products.""" query = ( select(Category) .where(Category.id == category_id) .options(selectinload(Category.products)) ) result = await db.execute(query) return result.scalar_one_or_none() async def create_category(db: AsyncSession, category: CategoryCreate) -> Category: """Create a new category.""" db_category = Category(**category.model_dump()) db.add(db_category) await db.commit() await db.refresh(db_category) return db_category async def update_category( db: AsyncSession, db_category: Category, category_update: CategoryUpdate ) -> Category: """Update a category.""" update_data = category_update.model_dump(exclude_unset=True) for field, value in update_data.items(): setattr(db_category, field, value) await db.commit() await db.refresh(db_category) return db_category async def delete_category(db: AsyncSession, db_category: Category) -> None: """Delete a category.""" await db.delete(db_category) await db.commit()