feat: service category deleting
This commit is contained in:
@@ -89,6 +89,11 @@ class ServiceCategory(BaseModel):
|
|||||||
__tablename__ = 'service_categories'
|
__tablename__ = 'service_categories'
|
||||||
id = Column(Integer, autoincrement=True, primary_key=True, index=True)
|
id = Column(Integer, autoincrement=True, primary_key=True, index=True)
|
||||||
name = Column(String, nullable=False)
|
name = Column(String, nullable=False)
|
||||||
|
is_deleted: Mapped[bool] = mapped_column(
|
||||||
|
nullable=False,
|
||||||
|
server_default='0',
|
||||||
|
comment='Удалена ли категория'
|
||||||
|
)
|
||||||
|
|
||||||
deal_service_rank: Mapped[str] = mapped_column(
|
deal_service_rank: Mapped[str] = mapped_column(
|
||||||
nullable=False,
|
nullable=False,
|
||||||
|
|||||||
@@ -138,6 +138,17 @@ async def reorder_category(
|
|||||||
):
|
):
|
||||||
return await ServiceService(session).reorder_category(request)
|
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
|
# endregion
|
||||||
|
|
||||||
|
|||||||
@@ -127,6 +127,10 @@ class ServiceUpdateCategoryRequest(BaseSchema):
|
|||||||
category: ServiceCategorySchema
|
category: ServiceCategorySchema
|
||||||
|
|
||||||
|
|
||||||
|
class ServiceDeleteCategoryRequest(BaseSchema):
|
||||||
|
category_id: int
|
||||||
|
|
||||||
|
|
||||||
# endregion
|
# endregion
|
||||||
|
|
||||||
# region Responses
|
# region Responses
|
||||||
@@ -192,4 +196,8 @@ class ServiceCategoryReorderResponse(OkMessageSchema):
|
|||||||
|
|
||||||
class ServiceUpdateCategoryResponse(OkMessageSchema):
|
class ServiceUpdateCategoryResponse(OkMessageSchema):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ServiceDeleteCategoryResponse(OkMessageSchema):
|
||||||
|
pass
|
||||||
# endregion
|
# endregion
|
||||||
|
|||||||
@@ -17,10 +17,18 @@ class ServiceService(BaseService):
|
|||||||
query = await (
|
query = await (
|
||||||
self.session
|
self.session
|
||||||
.scalars(
|
.scalars(
|
||||||
select(Service)
|
select(
|
||||||
.options(joinedload(Service.category))
|
Service
|
||||||
.order_by(Service.rank)
|
)
|
||||||
.filter(Service.is_deleted == False)
|
.options(
|
||||||
|
joinedload(Service.category)
|
||||||
|
)
|
||||||
|
.order_by(
|
||||||
|
Service.rank
|
||||||
|
)
|
||||||
|
.filter(
|
||||||
|
Service.is_deleted == False
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
services_raw = query.all()
|
services_raw = query.all()
|
||||||
@@ -35,9 +43,15 @@ class ServiceService(BaseService):
|
|||||||
category_ids = list(set([service.category_id for service in services_raw]))
|
category_ids = list(set([service.category_id for service in services_raw]))
|
||||||
rest_categories = await (
|
rest_categories = await (
|
||||||
self.session
|
self.session
|
||||||
.scalars(select(ServiceCategory)
|
.scalars(
|
||||||
.where(ServiceCategory.id.notin_(category_ids))
|
select(
|
||||||
)
|
ServiceCategory
|
||||||
|
)
|
||||||
|
.where(
|
||||||
|
ServiceCategory.id.notin_(category_ids),
|
||||||
|
ServiceCategory.is_deleted == False
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
for category in rest_categories:
|
for category in rest_categories:
|
||||||
for service_type in [ServiceType.DEAL_SERVICE, ServiceType.PRODUCT_SERVICE]:
|
for service_type in [ServiceType.DEAL_SERVICE, ServiceType.PRODUCT_SERVICE]:
|
||||||
@@ -456,3 +470,48 @@ class ServiceService(BaseService):
|
|||||||
return ServiceUpdateResponse(ok=True, message="Категория успешно обновлена")
|
return ServiceUpdateResponse(ok=True, message="Категория успешно обновлена")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return ServiceUpdateResponse(ok=False, message=f"Неудалось обновить категорию, ошибка: {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