Initial commit from monorepo
This commit is contained in:
103
offers/services.py
Normal file
103
offers/services.py
Normal file
@@ -0,0 +1,103 @@
|
||||
"""
|
||||
Сервис для создания офферов через Temporal workflow.
|
||||
Используется в Django admin action и в seed командах.
|
||||
"""
|
||||
import uuid
|
||||
import logging
|
||||
from dataclasses import dataclass
|
||||
from decimal import Decimal
|
||||
from typing import Optional, Tuple
|
||||
|
||||
from exchange.temporal_client import start_offer_workflow
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@dataclass
|
||||
class OfferData:
|
||||
"""Данные для создания оффера"""
|
||||
team_uuid: str
|
||||
product_uuid: str
|
||||
product_name: str
|
||||
location_uuid: str
|
||||
location_name: str
|
||||
location_country: str
|
||||
location_country_code: str
|
||||
location_latitude: float
|
||||
location_longitude: float
|
||||
quantity: Decimal
|
||||
unit: str = "ton"
|
||||
price_per_unit: Optional[Decimal] = None
|
||||
currency: str = "USD"
|
||||
category_name: str = ""
|
||||
description: str = ""
|
||||
|
||||
|
||||
class OfferService:
|
||||
"""Сервис для создания офферов через workflow"""
|
||||
|
||||
@staticmethod
|
||||
def create_offer_via_workflow(data: OfferData) -> Tuple[str, str, str]:
|
||||
"""
|
||||
Создает оффер через Temporal workflow.
|
||||
|
||||
Returns:
|
||||
Tuple[offer_uuid, workflow_id, run_id]
|
||||
"""
|
||||
offer_uuid = str(uuid.uuid4())
|
||||
|
||||
workflow_id, run_id = start_offer_workflow(
|
||||
offer_uuid=offer_uuid,
|
||||
team_uuid=data.team_uuid,
|
||||
product_uuid=data.product_uuid,
|
||||
product_name=data.product_name,
|
||||
category_name=data.category_name,
|
||||
location_uuid=data.location_uuid,
|
||||
location_name=data.location_name,
|
||||
location_country=data.location_country,
|
||||
location_country_code=data.location_country_code,
|
||||
location_latitude=data.location_latitude,
|
||||
location_longitude=data.location_longitude,
|
||||
quantity=data.quantity,
|
||||
unit=data.unit,
|
||||
price_per_unit=data.price_per_unit,
|
||||
currency=data.currency,
|
||||
description=data.description,
|
||||
)
|
||||
|
||||
logger.info(f"Started offer workflow: {workflow_id} for offer {offer_uuid}")
|
||||
return offer_uuid, workflow_id, run_id
|
||||
|
||||
@staticmethod
|
||||
def resync_offer_via_workflow(offer) -> Tuple[str, str]:
|
||||
"""
|
||||
Пересоздает workflow для существующего оффера.
|
||||
Используется для пере-синхронизации в граф.
|
||||
|
||||
Args:
|
||||
offer: Offer model instance
|
||||
|
||||
Returns:
|
||||
Tuple[workflow_id, run_id]
|
||||
"""
|
||||
workflow_id, run_id = start_offer_workflow(
|
||||
offer_uuid=offer.uuid,
|
||||
team_uuid=offer.team_uuid,
|
||||
product_uuid=offer.product_uuid,
|
||||
product_name=offer.product_name,
|
||||
category_name=offer.category_name,
|
||||
location_uuid=offer.location_uuid,
|
||||
location_name=offer.location_name,
|
||||
location_country=offer.location_country,
|
||||
location_country_code=offer.location_country_code,
|
||||
location_latitude=offer.location_latitude,
|
||||
location_longitude=offer.location_longitude,
|
||||
quantity=offer.quantity,
|
||||
unit=offer.unit,
|
||||
price_per_unit=offer.price_per_unit,
|
||||
currency=offer.currency,
|
||||
description=offer.description,
|
||||
)
|
||||
|
||||
logger.info(f"Restarted offer workflow: {workflow_id} for offer {offer.uuid}")
|
||||
return workflow_id, run_id
|
||||
Reference in New Issue
Block a user