55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
import datetime
|
|
|
|
from sqlalchemy import select
|
|
|
|
from models import User
|
|
from models.deal import *
|
|
from schemas.deal import *
|
|
from services.base import BaseService
|
|
|
|
|
|
class DealService(BaseService):
|
|
|
|
async def _get_deal_by_id(self, deal_id) -> Deal:
|
|
return await self.session.get(Deal, deal_id)
|
|
|
|
async def create(self, request: DealCreateRequest, user: User) -> DealCreateResponse:
|
|
deal = Deal(
|
|
name=request.name,
|
|
created_at=datetime.datetime.now(),
|
|
current_status=DealStatus.CREATED
|
|
)
|
|
self.session.add(deal)
|
|
await self.session.flush()
|
|
|
|
# Append status history
|
|
status_change = DealStatusHistory(
|
|
deal_id=request.deal_id,
|
|
user_id=user.id,
|
|
changed_at=datetime.datetime.now(),
|
|
from_status=deal.current_status,
|
|
to_status=DealStatus.CREATED.AWAITING_ACCEPTANCE
|
|
)
|
|
self.session.add(status_change)
|
|
|
|
await self.session.commit()
|
|
return DealCreateResponse(ok=True)
|
|
|
|
async def change_status(self, request: DealChangeStatusRequest, user: User) -> DealChangeStatusResponse:
|
|
# Changing current status
|
|
deal = await self._get_deal_by_id(request.deal_id)
|
|
from_status = deal.current_status
|
|
deal.current_status = request.new_status
|
|
|
|
# Append status history
|
|
status_change = DealStatusHistory(
|
|
deal_id=request.deal_id,
|
|
user_id=user.id,
|
|
changed_at=datetime.datetime.now(),
|
|
from_status=from_status,
|
|
to_status=request.new_status
|
|
)
|
|
self.session.add(status_change)
|
|
await self.session.commit()
|
|
return DealChangeStatusResponse(ok=True)
|