from typing import Optional, List from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.category import Category class CategoryRepository: def __init__(self, db: AsyncSession): self.db = db async def get_by_id(self, category_id: int) -> Optional[Category]: result = await self.db.execute(select(Category).where(Category.id == category_id)) return result.scalar_one_or_none() async def get_all(self, level: Optional[int] = None, parent_id: Optional[int] = None) -> List[Category]: query = select(Category) if level: query = query.where(Category.level == level) if parent_id: query = query.where(Category.parent_id == parent_id) query = query.order_by(Category.sort_order) result = await self.db.execute(query) return list(result.scalars().all()) async def get_children(self, parent_id: int) -> List[Category]: result = await self.db.execute( select(Category) .where(Category.parent_id == parent_id) .order_by(Category.sort_order) ) return list(result.scalars().all()) async def create(self, data: dict) -> Category: category = Category(**data) self.db.add(category) await self.db.flush() return category async def update(self, category_id: int, data: dict) -> Optional[Category]: category = await self.get_by_id(category_id) if not category: return None for key, value in data.items(): setattr(category, key, value) await self.db.flush() return category async def delete(self, category_id: int) -> bool: category = await self.get_by_id(category_id) if not category: return False await self.db.delete(category) return True