diff --git a/routers/service.py b/routers/service.py index 3436127..de03c92 100644 --- a/routers/service.py +++ b/routers/service.py @@ -112,6 +112,19 @@ async def create_category( return await ServiceService(session).create_category(request) +@service_router.post( + '/categories/update', + response_model=ServiceUpdateCategoryResponse, + operation_id="update_service_category", + dependencies=[Depends(authorized_user)] +) +async def update_category( + session: Annotated[AsyncSession, Depends(get_session)], + request: ServiceUpdateCategoryRequest +): + return await ServiceService(session).update_category(request) + + @service_router.post( '/categories/reorder', response_model=ServiceCategoryReorderResponse, diff --git a/schemas/service.py b/schemas/service.py index 1be839c..dbc6c8c 100644 --- a/schemas/service.py +++ b/schemas/service.py @@ -122,6 +122,10 @@ class ServiceCategoryReorderRequest(BaseSchema): service_type: int +class ServiceUpdateCategoryRequest(BaseSchema): + category: ServiceCategorySchema + + # endregion # region Responses @@ -183,4 +187,8 @@ class ServiceReorderResponse(OkMessageSchema): class ServiceCategoryReorderResponse(OkMessageSchema): pass + + +class ServiceUpdateCategoryResponse(OkMessageSchema): + pass # endregion diff --git a/services/service.py b/services/service.py index b5b7ee7..f825305 100644 --- a/services/service.py +++ b/services/service.py @@ -160,6 +160,26 @@ class ServiceService(BaseService): raw_category = request.category category_dict = raw_category.model_dump() del category_dict['id'] + last_deal_service_rank = await self.session.scalar( + select(ServiceCategory.deal_service_rank) + .order_by(ServiceCategory.deal_service_rank.desc()) + .limit(1) + ) + last_product_service_rank = await self.session.scalar( + select(ServiceCategory.product_service_rank) + .order_by(ServiceCategory.product_service_rank.desc()) + .limit(1) + ) + last_product_service_rank = lexorank.parse( + last_product_service_rank) if last_product_service_rank else middle( + Bucket.BUCEKT_0) + last_deal_service_rank = lexorank.parse(last_deal_service_rank) if last_deal_service_rank else middle( + Bucket.BUCEKT_0) + last_deal_service_rank = last_deal_service_rank.next() + last_product_service_rank = last_product_service_rank.next() + category_dict['deal_service_rank'] = str(last_deal_service_rank) + category_dict['product_service_rank'] = str(last_product_service_rank) + category = ServiceCategory(**category_dict) self.session.add(category) await self.session.commit() @@ -379,3 +399,21 @@ class ServiceService(BaseService): return ServiceCategoryReorderResponse(ok=True, message="Категории успешно пересортированы") except Exception as e: return ServiceCategoryReorderResponse(ok=False, message=f"Неудалось пересортировать категорию, ошибка: {e}") + + async def update_category(self, request: ServiceUpdateCategoryRequest) -> ServiceUpdateResponse: + try: + raw_category = request.category + category = await (self.session.get(ServiceCategory, raw_category.id)) + if not category: + return ServiceUpdateResponse(ok=False, message="Категория не найдена") + category_dict = raw_category.dict() + del category_dict['id'] + await self.session.execute( + update(ServiceCategory) + .where(ServiceCategory.id == raw_category.id) + .values(**category_dict) + ) + await self.session.commit() + return ServiceUpdateResponse(ok=True, message="Категория успешно обновлена") + except Exception as e: + return ServiceUpdateResponse(ok=False, message=f"Неудалось обновить категорию, ошибка: {e}")