feat: service category deleting
This commit is contained in:
@@ -89,6 +89,11 @@ class ServiceCategory(BaseModel):
|
||||
__tablename__ = 'service_categories'
|
||||
id = Column(Integer, autoincrement=True, primary_key=True, index=True)
|
||||
name = Column(String, nullable=False)
|
||||
is_deleted: Mapped[bool] = mapped_column(
|
||||
nullable=False,
|
||||
server_default='0',
|
||||
comment='Удалена ли категория'
|
||||
)
|
||||
|
||||
deal_service_rank: Mapped[str] = mapped_column(
|
||||
nullable=False,
|
||||
|
||||
@@ -138,6 +138,17 @@ async def reorder_category(
|
||||
):
|
||||
return await ServiceService(session).reorder_category(request)
|
||||
|
||||
@service_router.post(
|
||||
'/categories/delete',
|
||||
response_model=ServiceDeleteCategoryResponse,
|
||||
operation_id="delete_service_category",
|
||||
dependencies=[Depends(authorized_user)]
|
||||
)
|
||||
async def delete_category(
|
||||
session: Annotated[AsyncSession, Depends(get_session)],
|
||||
request: ServiceDeleteCategoryRequest
|
||||
):
|
||||
return await ServiceService(session).delete_category(request)
|
||||
|
||||
# endregion
|
||||
|
||||
|
||||
@@ -127,6 +127,10 @@ class ServiceUpdateCategoryRequest(BaseSchema):
|
||||
category: ServiceCategorySchema
|
||||
|
||||
|
||||
class ServiceDeleteCategoryRequest(BaseSchema):
|
||||
category_id: int
|
||||
|
||||
|
||||
# endregion
|
||||
|
||||
# region Responses
|
||||
@@ -192,4 +196,8 @@ class ServiceCategoryReorderResponse(OkMessageSchema):
|
||||
|
||||
class ServiceUpdateCategoryResponse(OkMessageSchema):
|
||||
pass
|
||||
|
||||
|
||||
class ServiceDeleteCategoryResponse(OkMessageSchema):
|
||||
pass
|
||||
# endregion
|
||||
|
||||
@@ -17,10 +17,18 @@ class ServiceService(BaseService):
|
||||
query = await (
|
||||
self.session
|
||||
.scalars(
|
||||
select(Service)
|
||||
.options(joinedload(Service.category))
|
||||
.order_by(Service.rank)
|
||||
.filter(Service.is_deleted == False)
|
||||
select(
|
||||
Service
|
||||
)
|
||||
.options(
|
||||
joinedload(Service.category)
|
||||
)
|
||||
.order_by(
|
||||
Service.rank
|
||||
)
|
||||
.filter(
|
||||
Service.is_deleted == False
|
||||
)
|
||||
)
|
||||
)
|
||||
services_raw = query.all()
|
||||
@@ -35,9 +43,15 @@ class ServiceService(BaseService):
|
||||
category_ids = list(set([service.category_id for service in services_raw]))
|
||||
rest_categories = await (
|
||||
self.session
|
||||
.scalars(select(ServiceCategory)
|
||||
.where(ServiceCategory.id.notin_(category_ids))
|
||||
)
|
||||
.scalars(
|
||||
select(
|
||||
ServiceCategory
|
||||
)
|
||||
.where(
|
||||
ServiceCategory.id.notin_(category_ids),
|
||||
ServiceCategory.is_deleted == False
|
||||
)
|
||||
)
|
||||
)
|
||||
for category in rest_categories:
|
||||
for service_type in [ServiceType.DEAL_SERVICE, ServiceType.PRODUCT_SERVICE]:
|
||||
@@ -456,3 +470,48 @@ class ServiceService(BaseService):
|
||||
return ServiceUpdateResponse(ok=True, message="Категория успешно обновлена")
|
||||
except Exception as e:
|
||||
return ServiceUpdateResponse(ok=False, message=f"Неудалось обновить категорию, ошибка: {e}")
|
||||
|
||||
async def delete_category(self, request: ServiceDeleteCategoryRequest) -> ServiceDeleteResponse:
|
||||
try:
|
||||
active_services = await self.session.scalars(
|
||||
select(
|
||||
Service
|
||||
)
|
||||
.where(
|
||||
Service.category_id == request.category_id,
|
||||
Service.is_deleted == False
|
||||
)
|
||||
)
|
||||
if active_services.first():
|
||||
return ServiceDeleteResponse(ok=False, message="Категория используется в услугах")
|
||||
|
||||
# Check if category is used in deleted services
|
||||
deleted_services = await self.session.scalars(
|
||||
select(
|
||||
Service
|
||||
)
|
||||
.where(
|
||||
Service.category_id == request.category_id,
|
||||
Service.is_deleted == True
|
||||
)
|
||||
)
|
||||
category = await self.session.scalar(
|
||||
select(
|
||||
ServiceCategory
|
||||
)
|
||||
.filter(
|
||||
ServiceCategory.id == request.category_id
|
||||
)
|
||||
)
|
||||
if not category:
|
||||
return ServiceDeleteResponse(ok=False, message="Категория не найдена")
|
||||
|
||||
if deleted_services.first():
|
||||
category.is_deleted = True
|
||||
else:
|
||||
await self.session.delete(category)
|
||||
|
||||
await self.session.commit()
|
||||
return ServiceDeleteResponse(ok=True, message="Категория успешно удалена")
|
||||
except Exception as e:
|
||||
return ServiceDeleteResponse(ok=False, message=f"Неудалось удалить категорию, ошибка: {e}")
|
||||
|
||||
Reference in New Issue
Block a user