Files
Fulfillment-Backend/services/position.py
2024-07-21 10:56:59 +03:00

59 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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