124 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from sqlalchemy import select, update
 | 
						|
from sqlalchemy.orm import joinedload
 | 
						|
 | 
						|
from models import Service, ServiceCategory, ServicePriceRange
 | 
						|
from services.base import BaseService
 | 
						|
from schemas.service import ServiceGetAllResponse, ServiceSchema, ServiceGetAllCategoriesResponse, \
 | 
						|
    ServiceCategorySchema, ServiceCreateRequest, ServiceCreateResponse, ServiceCreateCategoryRequest, \
 | 
						|
    ServiceCreateCategoryResponse, ServiceUpdateRequest, ServiceUpdateResponse, ServiceDeleteResponse, \
 | 
						|
    ServiceDeleteRequest
 | 
						|
 | 
						|
 | 
						|
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']
 | 
						|
            del service_dict['price_ranges']
 | 
						|
            service = Service(**service_dict)
 | 
						|
            self.session.add(service)
 | 
						|
            await self.session.flush()
 | 
						|
            price_ranges = request.service.price_ranges
 | 
						|
            for price_range in price_ranges:
 | 
						|
                price_range_dict = price_range.model_dump()
 | 
						|
                price_range_dict['service_id'] = service.id
 | 
						|
                del price_range_dict['id']
 | 
						|
                price_range_obj = ServicePriceRange(**price_range_dict)
 | 
						|
                self.session.add(price_range_obj)
 | 
						|
 | 
						|
            await self.session.commit()
 | 
						|
            return ServiceCreateResponse(ok=True, message="Услуга успешно создана")
 | 
						|
        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.get(Service, 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']
 | 
						|
            del service_dict['price_ranges']
 | 
						|
            await self.session.execute(
 | 
						|
                update(Service)
 | 
						|
                .where(Service.id == raw_service.id)
 | 
						|
                .values(**service_dict)
 | 
						|
            )
 | 
						|
            # checking if old price ranges are still in the request
 | 
						|
            request_price_range_ids = [price_range.id for price_range in raw_service.price_ranges if price_range.id]
 | 
						|
            price_ranges_to_delete = []
 | 
						|
            for price_range in service.price_ranges:
 | 
						|
                if price_range.id not in request_price_range_ids:
 | 
						|
                    price_ranges_to_delete.append(price_range)
 | 
						|
            for price_range in price_ranges_to_delete:
 | 
						|
                await self.session.delete(price_range)
 | 
						|
            await self.session.flush()
 | 
						|
            for price_range in raw_service.price_ranges:
 | 
						|
                price_range_dict = price_range.dict()
 | 
						|
                price_range_dict['service_id'] = raw_service.id
 | 
						|
                if price_range.id:
 | 
						|
                    await self.session.execute(
 | 
						|
                        update(ServicePriceRange)
 | 
						|
                        .where(ServicePriceRange.id == price_range.id)
 | 
						|
                        .values(**price_range_dict)
 | 
						|
                    )
 | 
						|
                else:
 | 
						|
                    del price_range_dict['id']
 | 
						|
                    price_range_obj = ServicePriceRange(**price_range_dict)
 | 
						|
                    self.session.add(price_range_obj)
 | 
						|
            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
 | 
						|
            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)
 |