feat: service categories endpoints and service creation endpoint

This commit is contained in:
2025-09-27 18:21:20 +04:00
parent 8cf589c54e
commit fbadddeada
10 changed files with 194 additions and 20 deletions

View File

@ -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

View File

@ -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="Ранг услуги для товара")

View File

@ -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

View File

@ -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)

View 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)

View 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)

View File

@ -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

View 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

View File

@ -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

View 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