Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/catalogue/models/pydantic.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
13 changes: 11 additions & 2 deletions src/catalogue/repository.py
Original file line number Diff line number Diff line change
@@ -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,
)
Expand All @@ -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)
4 changes: 4 additions & 0 deletions src/catalogue/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@

class CatalogueRoutesPrefixes:
product: str = '/product'
category: str = '/category'


class ProductRoutesPrefixes(BaseCrudPrefixes):
...

class CategoryRoutesPrefixes(BaseCrudPrefixes):
...
12 changes: 11 additions & 1 deletion src/catalogue/services.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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)
42 changes: 41 additions & 1 deletion src/catalogue/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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