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