feat: service category deleting

This commit is contained in:
2024-10-09 02:25:56 +03:00
parent 7ee4ce36ce
commit 4994f2c026
4 changed files with 90 additions and 7 deletions

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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}")