56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
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 |