feat: service categories endpoints and service creation endpoint
This commit is contained in:
@ -3,4 +3,4 @@ from .deal_service import (
|
|||||||
DealService as DealService,
|
DealService as DealService,
|
||||||
)
|
)
|
||||||
from .product import Product as Product
|
from .product import Product as Product
|
||||||
from .service import Service as Service
|
from .service import Service as Service, ServiceCategory as ServiceCategory
|
||||||
|
|||||||
@ -38,14 +38,10 @@ class Service(BaseModel, IdMixin, SoftDeleteMixin, PriceMixin, CostMixin):
|
|||||||
lexorank: Mapped[str] = mapped_column(comment="Ранг услуги")
|
lexorank: Mapped[str] = mapped_column(comment="Ранг услуги")
|
||||||
|
|
||||||
|
|
||||||
class ServiceCategory(BaseModel, IdMixin):
|
class ServiceCategory(BaseModel, IdMixin, SoftDeleteMixin):
|
||||||
__tablename__ = "fulfillment_base_service_categories"
|
__tablename__ = "fulfillment_base_service_categories"
|
||||||
|
|
||||||
name: Mapped[str] = mapped_column()
|
name: Mapped[str] = mapped_column()
|
||||||
is_deleted: Mapped[bool] = mapped_column(
|
|
||||||
default=False, comment="Удалена ли категория"
|
|
||||||
)
|
|
||||||
|
|
||||||
deal_service_rank: Mapped[str] = mapped_column(comment="Ранг услуги для сделки")
|
deal_service_rank: Mapped[str] = mapped_column(comment="Ранг услуги для сделки")
|
||||||
product_service_rank: Mapped[str] = mapped_column(comment="Ранг услуги для товара")
|
product_service_rank: Mapped[str] = mapped_column(comment="Ранг услуги для товара")
|
||||||
|
|
||||||
|
|||||||
@ -4,3 +4,4 @@ from .deal_service import DealServiceRepository as DealServiceRepository
|
|||||||
from .product import ProductRepository as ProductRepository
|
from .product import ProductRepository as ProductRepository
|
||||||
from .service import ServiceRepository as ServiceRepository
|
from .service import ServiceRepository as ServiceRepository
|
||||||
from .services_kit import ServicesKitRepository as ServicesKitRepository
|
from .services_kit import ServicesKitRepository as ServicesKitRepository
|
||||||
|
from .service_category import ServiceCategoryRepository as ServiceCategoryRepository
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
from modules.fulfillment_base.models import Service
|
from modules.fulfillment_base.models import Service
|
||||||
|
from modules.fulfillment_base.models.service import ServicePriceRange
|
||||||
from modules.fulfillment_base.schemas.service import (
|
from modules.fulfillment_base.schemas.service import (
|
||||||
CreateServiceSchema,
|
CreateServiceSchema,
|
||||||
UpdateServiceSchema,
|
UpdateServiceSchema,
|
||||||
@ -10,13 +11,34 @@ class ServiceRepository(
|
|||||||
BaseRepository,
|
BaseRepository,
|
||||||
RepGetAllMixin[Service],
|
RepGetAllMixin[Service],
|
||||||
RepDeleteMixin[Service],
|
RepDeleteMixin[Service],
|
||||||
RepCreateMixin[Service, CreateServiceSchema],
|
|
||||||
RepUpdateMixin[Service, UpdateServiceSchema],
|
RepUpdateMixin[Service, UpdateServiceSchema],
|
||||||
RepGetByIdMixin[Service],
|
RepGetByIdMixin[Service],
|
||||||
):
|
):
|
||||||
entity_class = Service
|
entity_class = Service
|
||||||
entity_not_found_msg = "Услуга не найдена"
|
entity_not_found_msg = "Услуга не найдена"
|
||||||
|
|
||||||
|
async def create(self, data: CreateServiceSchema) -> int:
|
||||||
|
price_ranges = []
|
||||||
|
for range in data.price_ranges:
|
||||||
|
price_ranges.append(
|
||||||
|
ServicePriceRange(
|
||||||
|
from_quantity=range.from_quantity,
|
||||||
|
to_quantity=range.to_quantity,
|
||||||
|
price=range.price,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
data_dict = data.model_dump()
|
||||||
|
data_dict["price_ranges"] = price_ranges
|
||||||
|
data_dict["category_id"] = data.category.id
|
||||||
|
del data_dict["category"]
|
||||||
|
|
||||||
|
service = Service(**data_dict)
|
||||||
|
self.session.add(service)
|
||||||
|
await self.session.commit()
|
||||||
|
await self.session.refresh(service)
|
||||||
|
return service.id
|
||||||
|
|
||||||
async def update(self, service: Service, data: UpdateServiceSchema) -> Service:
|
async def update(self, service: Service, data: UpdateServiceSchema) -> Service:
|
||||||
return await self._apply_update_data_to_model(service, data, True)
|
return await self._apply_update_data_to_model(service, data, True)
|
||||||
|
|
||||||
|
|||||||
23
modules/fulfillment_base/repositories/service_category.py
Normal file
23
modules/fulfillment_base/repositories/service_category.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
from modules.fulfillment_base.models import ServiceCategory
|
||||||
|
from modules.fulfillment_base.schemas.service_category import (
|
||||||
|
CreateServiceCategorySchema,
|
||||||
|
UpdateServiceCategorySchema,
|
||||||
|
)
|
||||||
|
from repositories.mixins import *
|
||||||
|
|
||||||
|
|
||||||
|
class ServiceCategoryRepository(
|
||||||
|
BaseRepository,
|
||||||
|
RepGetAllMixin[ServiceCategory],
|
||||||
|
RepDeleteMixin[ServiceCategory],
|
||||||
|
RepCreateMixin[ServiceCategory, CreateServiceCategorySchema],
|
||||||
|
RepUpdateMixin[ServiceCategory, UpdateServiceCategorySchema],
|
||||||
|
RepGetByIdMixin[ServiceCategory],
|
||||||
|
):
|
||||||
|
entity_class = ServiceCategory
|
||||||
|
entity_not_found_msg = "Категория услуги не найдена"
|
||||||
|
|
||||||
|
async def update(
|
||||||
|
self, service: ServiceCategory, data: UpdateServiceCategorySchema
|
||||||
|
) -> ServiceCategory:
|
||||||
|
return await self._apply_update_data_to_model(service, data, True)
|
||||||
55
modules/fulfillment_base/routers/service_category.py
Normal file
55
modules/fulfillment_base/routers/service_category.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
from fastapi import APIRouter, Path
|
||||||
|
|
||||||
|
from backend.dependecies import SessionDependency
|
||||||
|
from modules.fulfillment_base.schemas.service_category import *
|
||||||
|
from modules.fulfillment_base.services import ServiceCategoryService
|
||||||
|
|
||||||
|
router = APIRouter(tags=["service-category"])
|
||||||
|
|
||||||
|
|
||||||
|
@router.get(
|
||||||
|
"/",
|
||||||
|
response_model=GetServiceCategoriesResponse,
|
||||||
|
operation_id="get_service_categories",
|
||||||
|
)
|
||||||
|
async def get_services_categories(
|
||||||
|
session: SessionDependency,
|
||||||
|
):
|
||||||
|
return await ServiceCategoryService(session).get_all()
|
||||||
|
|
||||||
|
|
||||||
|
@router.post(
|
||||||
|
"/",
|
||||||
|
response_model=CreateServiceCategoryResponse,
|
||||||
|
operation_id="create_service_category",
|
||||||
|
)
|
||||||
|
async def create_service_category(
|
||||||
|
session: SessionDependency,
|
||||||
|
request: CreateServiceCategoryRequest,
|
||||||
|
):
|
||||||
|
return await ServiceCategoryService(session).create(request)
|
||||||
|
|
||||||
|
|
||||||
|
@router.patch(
|
||||||
|
"/{pk}",
|
||||||
|
response_model=UpdateServiceCategoryResponse,
|
||||||
|
operation_id="update_service_category",
|
||||||
|
)
|
||||||
|
async def update_service_category(
|
||||||
|
session: SessionDependency,
|
||||||
|
request: UpdateServiceCategoryRequest,
|
||||||
|
pk: int = Path(),
|
||||||
|
):
|
||||||
|
return await ServiceCategoryService(session).update(pk, request)
|
||||||
|
|
||||||
|
|
||||||
|
@router.delete(
|
||||||
|
"/{pk}",
|
||||||
|
response_model=DeleteServiceCategoryResponse,
|
||||||
|
operation_id="delete_service_category",
|
||||||
|
)
|
||||||
|
async def delete_service_category(
|
||||||
|
session: SessionDependency,
|
||||||
|
pk: int = Path(),
|
||||||
|
):
|
||||||
|
return await ServiceCategoryService(session).delete(pk)
|
||||||
@ -1,5 +1,6 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
from modules.fulfillment_base.schemas.service_category import ServiceCategorySchema
|
||||||
from schemas.base import BaseSchema, BaseResponse
|
from schemas.base import BaseSchema, BaseResponse
|
||||||
|
|
||||||
|
|
||||||
@ -13,15 +14,7 @@ class ServicePriceRangeSchema(BaseSchema):
|
|||||||
price: float
|
price: float
|
||||||
|
|
||||||
|
|
||||||
class ServiceCategorySchema(BaseSchema):
|
class CreateServiceSchema(BaseSchema):
|
||||||
id: int
|
|
||||||
name: str
|
|
||||||
deal_service_rank: str
|
|
||||||
product_service_rank: str
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceSchema(BaseSchema):
|
|
||||||
id: int
|
|
||||||
name: str
|
name: str
|
||||||
category: ServiceCategorySchema
|
category: ServiceCategorySchema
|
||||||
price: float
|
price: float
|
||||||
@ -31,14 +24,14 @@ class ServiceSchema(BaseSchema):
|
|||||||
lexorank: str
|
lexorank: str
|
||||||
|
|
||||||
|
|
||||||
|
class ServiceSchema(CreateServiceSchema):
|
||||||
|
id: int
|
||||||
|
|
||||||
|
|
||||||
class UpdateServiceSchema(ServiceSchema):
|
class UpdateServiceSchema(ServiceSchema):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class CreateServiceSchema(ServiceSchema):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# endregion
|
# endregion
|
||||||
|
|
||||||
# region Request
|
# region Request
|
||||||
|
|||||||
55
modules/fulfillment_base/schemas/service_category.py
Normal file
55
modules/fulfillment_base/schemas/service_category.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
from schemas.base import BaseSchema, BaseResponse
|
||||||
|
|
||||||
|
|
||||||
|
# region Entity
|
||||||
|
|
||||||
|
|
||||||
|
class CreateServiceCategorySchema(BaseSchema):
|
||||||
|
name: str
|
||||||
|
deal_service_rank: str
|
||||||
|
product_service_rank: str
|
||||||
|
|
||||||
|
|
||||||
|
class ServiceCategorySchema(CreateServiceCategorySchema):
|
||||||
|
id: int
|
||||||
|
|
||||||
|
|
||||||
|
class UpdateServiceCategorySchema(ServiceCategorySchema):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# endregion
|
||||||
|
|
||||||
|
# region Request
|
||||||
|
|
||||||
|
|
||||||
|
class CreateServiceCategoryRequest(BaseSchema):
|
||||||
|
entity: CreateServiceCategorySchema
|
||||||
|
|
||||||
|
|
||||||
|
class UpdateServiceCategoryRequest(BaseSchema):
|
||||||
|
entity: UpdateServiceCategorySchema
|
||||||
|
|
||||||
|
|
||||||
|
# endregion
|
||||||
|
|
||||||
|
# region Response
|
||||||
|
|
||||||
|
|
||||||
|
class GetServiceCategoriesResponse(BaseSchema):
|
||||||
|
items: list[ServiceCategorySchema]
|
||||||
|
|
||||||
|
|
||||||
|
class CreateServiceCategoryResponse(BaseResponse):
|
||||||
|
entity: ServiceCategorySchema
|
||||||
|
|
||||||
|
|
||||||
|
class UpdateServiceCategoryResponse(BaseResponse):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DeleteServiceCategoryResponse(BaseResponse):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# endregion
|
||||||
@ -4,3 +4,4 @@ from .product import ProductService as ProductService
|
|||||||
from .product_service import ProductServiceService as ProductServiceService
|
from .product_service import ProductServiceService as ProductServiceService
|
||||||
from .service import ServiceModelService as ServiceModelService
|
from .service import ServiceModelService as ServiceModelService
|
||||||
from .services_kit import ServicesKitService as ServicesKitService
|
from .services_kit import ServicesKitService as ServicesKitService
|
||||||
|
from .service_category import ServiceCategoryService as ServiceCategoryService
|
||||||
|
|||||||
28
modules/fulfillment_base/services/service_category.py
Normal file
28
modules/fulfillment_base/services/service_category.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
from modules.fulfillment_base.models import ServiceCategory
|
||||||
|
from modules.fulfillment_base.repositories import ServiceCategoryRepository
|
||||||
|
from modules.fulfillment_base.schemas.service_category import (
|
||||||
|
ServiceCategorySchema,
|
||||||
|
CreateServiceCategoryRequest,
|
||||||
|
UpdateServiceCategoryRequest,
|
||||||
|
)
|
||||||
|
from services.mixins import *
|
||||||
|
|
||||||
|
|
||||||
|
class ServiceCategoryService(
|
||||||
|
ServiceGetAllMixin[ServiceCategory, ServiceCategorySchema],
|
||||||
|
ServiceCreateMixin[
|
||||||
|
ServiceCategory, CreateServiceCategoryRequest, ServiceCategorySchema
|
||||||
|
],
|
||||||
|
ServiceUpdateMixin[ServiceCategory, UpdateServiceCategoryRequest],
|
||||||
|
ServiceDeleteMixin[ServiceCategory],
|
||||||
|
):
|
||||||
|
schema_class = ServiceCategorySchema
|
||||||
|
entity_deleted_msg = "Категория услуг успешно удалена"
|
||||||
|
entity_updated_msg = "Категория услуг успешно обновлена"
|
||||||
|
entity_created_msg = "Категория услуг успешно создана"
|
||||||
|
|
||||||
|
def __init__(self, session: AsyncSession):
|
||||||
|
self.repository = ServiceCategoryRepository(session)
|
||||||
|
|
||||||
|
async def is_soft_delete(self, service: ServiceCategorySchema) -> bool:
|
||||||
|
return True
|
||||||
Reference in New Issue
Block a user