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