from sqlalchemy import select from sqlalchemy.orm import joinedload from models import Service, ServiceCategory from services.base import BaseService from schemas.services import ServiceGetAllResponse, ServiceSchema, ServiceGetAllCategoriesResponse, \ ServiceCategorySchema, ServiceCreateRequest, ServiceCreateResponse, ServiceCreateCategoryRequest, \ ServiceCreateCategoryResponse class ServiceService(BaseService): async def get_all(self) -> ServiceGetAllResponse: query = await (self.session .scalars(select(Service) .options(joinedload(Service.category)) .order_by(Service.category_id, Service.id))) services = [] for service in query.all(): services.append(ServiceSchema.model_validate(service)) return ServiceGetAllResponse(services=services) async def create(self, request: ServiceCreateRequest) -> ServiceCreateResponse: try: raw_service = request.service service_dict = raw_service.model_dump() service_dict['category_id'] = raw_service.category.id del service_dict['id'] del service_dict['category'] service = Service(**service_dict) self.session.add(service) await self.session.commit() return ServiceCreateResponse(ok=True, message="Услуга успешно создана") except Exception as e: return ServiceCreateResponse(ok=False, message=f"Неудалось создать услугу, ошибка: {e}") async def create_category(self, request: ServiceCreateCategoryRequest) -> ServiceCreateCategoryResponse: try: raw_category = request.category category_dict = raw_category.model_dump() del category_dict['id'] category = ServiceCategory(**category_dict) self.session.add(category) await self.session.commit() return ServiceCreateCategoryResponse(ok=True, message="Категория успешно создана") except Exception as e: return ServiceCreateCategoryResponse(ok=False, message=f"Неудалось создать категорию, ошибка: {e}") async def get_all_categories(self) -> ServiceGetAllCategoriesResponse: query = await (self.session .scalars(select(ServiceCategory) .order_by(ServiceCategory.id))) categories = [] for category in query.all(): categories.append(ServiceCategorySchema.model_validate(category)) return ServiceGetAllCategoriesResponse(categories=categories)