diff --git a/src/catalogue/models/pydantic.py b/src/catalogue/models/pydantic.py index 320c2cb1..d0a3bce5 100644 --- a/src/catalogue/models/pydantic.py +++ b/src/catalogue/models/pydantic.py @@ -15,3 +15,15 @@ class ProductModel(BaseModel): class Config: from_attributes = True + + +class CategoryModel(BaseModel): + id: Optional[int] + title: str + description: Optional[str] + image: str + is_active: bool + parent_id: Optional[int] + + class Config: + from_attributes = True \ No newline at end of file diff --git a/src/catalogue/repository.py b/src/catalogue/repository.py index c5c77cc8..b82431f6 100644 --- a/src/catalogue/repository.py +++ b/src/catalogue/repository.py @@ -1,8 +1,8 @@ from fastapi import Depends from sqlalchemy.ext.asyncio import AsyncSession -from src.catalogue.models.pydantic import ProductModel -from src.catalogue.models.sqlalchemy import Product +from src.catalogue.models.pydantic import ProductModel, CategoryModel +from src.catalogue.models.sqlalchemy import Product, Category from src.common.databases.postgres import ( get_session, ) @@ -16,3 +16,12 @@ def __init__(self, session: AsyncSession): def get_product_repository(session: AsyncSession = Depends(get_session)) -> ProductRepository: return ProductRepository(session=session) + + +class CategoryRepository(BaseSQLAlchemyRepository[Category, CategoryModel]): + def __init__(self, session: AsyncSession): + super().__init__(model=Category, pydantic_model=CategoryModel, session=session) + + +def get_category_repository(session: AsyncSession = Depends(get_session)) -> CategoryRepository: + return CategoryRepository(session=session) diff --git a/src/catalogue/routes.py b/src/catalogue/routes.py index c40fe3ac..bd6890b1 100644 --- a/src/catalogue/routes.py +++ b/src/catalogue/routes.py @@ -3,7 +3,11 @@ class CatalogueRoutesPrefixes: product: str = '/product' + category: str = '/category' class ProductRoutesPrefixes(BaseCrudPrefixes): ... + +class CategoryRoutesPrefixes(BaseCrudPrefixes): + ... diff --git a/src/catalogue/services.py b/src/catalogue/services.py index 421359b9..c220e7ec 100644 --- a/src/catalogue/services.py +++ b/src/catalogue/services.py @@ -1,9 +1,10 @@ from fastapi import Depends -from src.catalogue.models.pydantic import ProductModel +from src.catalogue.models.pydantic import ProductModel, CategoryModel from src.catalogue.repository import ( ProductRepository, get_product_repository, + CategoryRepository, get_category_repository, ) from src.common.service import BaseService @@ -15,3 +16,12 @@ def __init__(self, repository: ProductRepository): def get_product_service(repo: ProductRepository = Depends(get_product_repository)) -> ProductService: return ProductService(repository=repo) + + +class CategoryService(BaseService[CategoryModel]): + def __init__(self, repository: CategoryRepository): + super().__init__(repository) + + +def get_category_service(repo: CategoryRepository = Depends(get_category_repository)) -> CategoryService: + return CategoryService(repository=repo) \ No newline at end of file diff --git a/src/catalogue/views.py b/src/catalogue/views.py index 636b0841..065a3592 100644 --- a/src/catalogue/views.py +++ b/src/catalogue/views.py @@ -10,13 +10,15 @@ status, ) -from src.catalogue.models.pydantic import ProductModel +from src.catalogue.models.pydantic import ProductModel, CategoryModel from src.catalogue.routes import ( CatalogueRoutesPrefixes, ProductRoutesPrefixes, + CategoryRoutesPrefixes, ) from src.catalogue.services import ( get_product_service, + get_category_service, ) from src.common.exceptions.base import ObjectDoesNotExistException from src.common.schemas.common import ErrorResponse @@ -69,3 +71,41 @@ async def product_detail( return ErrorResponse(message=exc.message) return response + + +category_router = APIRouter(prefix=CatalogueRoutesPrefixes.category) + + +@category_router.get( + CategoryRoutesPrefixes.root, + status_code=status.HTTP_200_OK, + response_model=list[CategoryModel], +) +# async def product_list(product_service: Annotated[get_product_service, Depends()]) -> list[ProductModel]: +async def category_list(category_service=Depends(get_category_service)) -> list[CategoryModel]: + + return await category_service.list() + + +@category_router.get( + CategoryRoutesPrefixes.detail, + responses={ + status.HTTP_200_OK: {'model': CategoryModel}, + status.HTTP_404_NOT_FOUND: {'model': ErrorResponse}, + }, + status_code=status.HTTP_200_OK, + response_model=Union[CategoryModel, ErrorResponse], +) +async def category_detail( + response: Response, + pk: int, + service: Annotated[get_category_service, Depends()], +) -> Union[Response, ErrorResponse]: + + try: + response = await service.detail(pk=pk) + except ObjectDoesNotExistException as exc: + response.status_code = status.HTTP_404_NOT_FOUND + return ErrorResponse(message=exc.message) + + return response \ No newline at end of file