diff --git a/routers/service.py b/routers/service.py index 3a0f8f8..5c979be 100644 --- a/routers/service.py +++ b/routers/service.py @@ -38,6 +38,30 @@ async def create( return await ServiceService(session).create(request) +@service_router.post( + '/update', + response_model=ServiceUpdateResponse, + operation_id="update_service" +) +async def update( + session: Annotated[AsyncSession, Depends(get_session)], + request: ServiceUpdateRequest +): + return await ServiceService(session).update(request) + + +@service_router.post( + '/delete', + response_model=ServiceDeleteResponse, + operation_id="delete_service" +) +async def delete( + session: Annotated[AsyncSession, Depends(get_session)], + request: ServiceDeleteRequest +): + return await ServiceService(session).delete(request) + + @service_router.get( '/categories/get-all', response_model=ServiceGetAllCategoriesResponse, diff --git a/schemas/service.py b/schemas/service.py index 4b6c3d2..b8a7314 100644 --- a/schemas/service.py +++ b/schemas/service.py @@ -28,6 +28,14 @@ class ServiceCreateCategoryRequest(CustomModelCamel): category: ServiceCategorySchema +class ServiceUpdateRequest(CustomModelCamel): + data: ServiceSchema + + +class ServiceDeleteRequest(CustomModelCamel): + service_id: int + + # endregion @@ -46,4 +54,12 @@ class ServiceCreateResponse(OkMessageSchema): class ServiceCreateCategoryResponse(OkMessageSchema): pass + + +class ServiceUpdateResponse(OkMessageSchema): + pass + + +class ServiceDeleteResponse(OkMessageSchema): + pass # endregion diff --git a/services/service.py b/services/service.py index 41a6890..2b5829c 100644 --- a/services/service.py +++ b/services/service.py @@ -1,11 +1,12 @@ -from sqlalchemy import select +from sqlalchemy import select, update from sqlalchemy.orm import joinedload from models import Service, ServiceCategory from services.base import BaseService from schemas.service import ServiceGetAllResponse, ServiceSchema, ServiceGetAllCategoriesResponse, \ ServiceCategorySchema, ServiceCreateRequest, ServiceCreateResponse, ServiceCreateCategoryRequest, \ - ServiceCreateCategoryResponse + ServiceCreateCategoryResponse, ServiceUpdateRequest, ServiceUpdateResponse, ServiceDeleteResponse, \ + ServiceDeleteRequest class ServiceService(BaseService): @@ -33,6 +34,42 @@ class ServiceService(BaseService): except Exception as e: return ServiceCreateResponse(ok=False, message=f"Неудалось создать услугу, ошибка: {e}") + async def update(self, request: ServiceUpdateRequest) -> ServiceUpdateResponse: + try: + raw_service = request.data + service = await (self.session + .scalars(select(Service) + .filter(Service.id == raw_service.id))) + if not service: + return ServiceUpdateResponse(ok=False, message="Услуга не найдена") + + service_dict = raw_service.dict() + service_dict['category_id'] = raw_service.category.id + del service_dict['category'] + await self.session.execute( + update(Service) + .where(Service.id == raw_service.id) + .values(**service_dict) + ) + + await self.session.commit() + return ServiceUpdateResponse(ok=True, message="Услуга успешно обновлена") + except Exception as e: + return ServiceUpdateResponse(ok=False, message=f"Неудалось обновить услугу, ошибка: {e}") + + async def delete(self, request: ServiceDeleteRequest) -> ServiceDeleteResponse: + try: + service = await (self.session + .scalar(select(Service) + .filter(Service.id == request.service_id))) + if not service: + return ServiceDeleteResponse(ok=False, message="Услуга не найдена") + await self.session.delete(service) + await self.session.commit() + return ServiceDeleteResponse(ok=True, message="Услуга успешно удалена") + except Exception as e: + return ServiceDeleteResponse(ok=False, message=f"Неудалось удалить услугу, ошибка: {e}") + async def create_category(self, request: ServiceCreateCategoryRequest) -> ServiceCreateCategoryResponse: try: raw_category = request.category