59 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import Union
 | 
						||
 | 
						||
from sqlalchemy import select, insert, delete
 | 
						||
 | 
						||
from models import Position, user_position
 | 
						||
from schemas.position import *
 | 
						||
from services.base import BaseService
 | 
						||
 | 
						||
 | 
						||
class PositionService(BaseService):
 | 
						||
    async def get_all(self) -> GetAllPositionsResponse:
 | 
						||
        stmt = select(Position).order_by(Position.key)
 | 
						||
        positions = (await self.session.scalars(stmt)).all()
 | 
						||
        positions_schemas = [PositionSchema.model_validate(position) for position in positions]
 | 
						||
        response = GetAllPositionsResponse(positions=positions_schemas)
 | 
						||
        return response
 | 
						||
 | 
						||
    async def get_by_key(self, key: str) -> Union[Position, None]:
 | 
						||
        stmt = select(Position).where(Position.key == key)
 | 
						||
        return await self.session.scalar(stmt)
 | 
						||
 | 
						||
    async def create(self, request: CreatePositionRequest) -> CreatePositionResponse:
 | 
						||
        try:
 | 
						||
            if await self.get_by_key(request.data.key):
 | 
						||
                return CreatePositionResponse(ok=False, message='Должность с таким ключом уже существует')
 | 
						||
            stmt = insert(Position).values(request.data.model_dump())
 | 
						||
            await self.session.execute(stmt)
 | 
						||
            await self.session.commit()
 | 
						||
            return CreatePositionResponse(ok=True, message='Должность успешно создана')
 | 
						||
        except Exception as e:
 | 
						||
            return CreatePositionResponse(ok=False, message=str(e))
 | 
						||
 | 
						||
    async def delete(self, request: DeletePositionRequest) -> DeletePositionResponse:
 | 
						||
        try:
 | 
						||
            # Prevent deleting if existing on users
 | 
						||
            stmt = (
 | 
						||
                select(
 | 
						||
                    user_position
 | 
						||
                )
 | 
						||
                .where(
 | 
						||
                    user_position.c.position_key == request.position_key
 | 
						||
                )
 | 
						||
            )
 | 
						||
            if await self.session.scalar(stmt):
 | 
						||
                return DeletePositionResponse(ok=False, message='Должность привязана к существующим сотрудникам')
 | 
						||
            delete_stmt = (
 | 
						||
                delete(
 | 
						||
                    Position
 | 
						||
                )
 | 
						||
                .where(
 | 
						||
                    Position.key == request.position_key
 | 
						||
                )
 | 
						||
            )
 | 
						||
            await self.session.execute(delete_stmt)
 | 
						||
            await self.session.commit()
 | 
						||
            return DeletePositionResponse(ok=True, message="Должность успешно удалена!")
 | 
						||
        except Exception as e:
 | 
						||
            return DeletePositionResponse(ok=False, message=str(e))
 |