From 4994f2c026bc204de724d93edab9299f71c1084d Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 9 Oct 2024 02:25:56 +0300 Subject: [PATCH] feat: service category deleting --- models/service.py | 5 ++++ routers/service.py | 11 +++++++ schemas/service.py | 8 +++++ services/service.py | 73 ++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/models/service.py b/models/service.py index a989a86..acf24d8 100644 --- a/models/service.py +++ b/models/service.py @@ -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, diff --git a/routers/service.py b/routers/service.py index 482ea36..53751a7 100644 --- a/routers/service.py +++ b/routers/service.py @@ -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 diff --git a/schemas/service.py b/schemas/service.py index c7ad041..da08a71 100644 --- a/schemas/service.py +++ b/schemas/service.py @@ -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 diff --git a/services/service.py b/services/service.py index 87632a6..b9a23e1 100644 --- a/services/service.py +++ b/services/service.py @@ -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}")