from typing import Optional, List from sqlalchemy.ext.asyncio import AsyncSession from app.models.category import Category from app.repositories.category import CategoryRepository class CategoryService: def __init__(self, db: AsyncSession): self.db = db self.repo = CategoryRepository(db) async def get_categories(self, level: Optional[int] = None, parent_id: Optional[int] = None) -> List[Category]: return await self.repo.get_all(level=level, parent_id=parent_id) async def get_category(self, category_id: int) -> Optional[Category]: return await self.repo.get_by_id(category_id) async def get_category_with_children(self, category_id: int) -> Optional[Category]: category = await self.repo.get_by_id(category_id) if category: category.children = await self.repo.get_children(category_id) return category async def create_category(self, data: dict) -> Category: return await self.repo.create(data) async def update_category(self, category_id: int, data: dict) -> Optional[Category]: return await self.repo.update(category_id, data) async def delete_category(self, category_id: int) -> bool: return await self.repo.delete(category_id) async def get_category_tree(self) -> List[dict]: root_categories = await self.repo.get_all(level=1) tree = [] for category in root_categories: children = await self.repo.get_children(category.id) tree.append({ "id": category.id, "name": category.name, "level": category.level, "icon": category.icon, "sort_order": category.sort_order, "children": [ { "id": child.id, "name": child.name, "level": child.level, "icon": child.icon, "sort_order": child.sort_order } for child in children ] }) return tree