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