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))