51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
from pydantic import BaseModel
|
||
from datetime import datetime
|
||
from src.services.pet_store import pet_store_service
|
||
|
||
class InputSchema(BaseModel):
|
||
id: str
|
||
email: str
|
||
quantity: int
|
||
pet_id: int
|
||
|
||
config = {
|
||
"type": "event",
|
||
"name": "ProcessFoodOrder",
|
||
"description": "basic-tutorial event step, demonstrates how to consume an event from a topic and persist data in state",
|
||
"flows": ["basic-tutorial"],
|
||
"subscribes": ["process-food-order"],
|
||
"emits": ["notification"],
|
||
"input": InputSchema.model_json_schema(),
|
||
}
|
||
|
||
async def handler(input_data, context):
|
||
context.logger.info("Step 02 – Process food order", {"input": input_data})
|
||
|
||
order = await pet_store_service.create_order({
|
||
"id": input_data.get("id"),
|
||
"quantity": input_data.get("quantity"),
|
||
"pet_id": input_data.get("pet_id"),
|
||
"email": input_data.get("email"),
|
||
"ship_date": datetime.now().isoformat(),
|
||
"status": "placed",
|
||
})
|
||
|
||
context.logger.info("Order created", {"order": order})
|
||
|
||
await context.state.set("orders_python", order.get("id"), order)
|
||
|
||
await context.emit({
|
||
"topic": "notification",
|
||
"data": {
|
||
"email": input_data["email"],
|
||
"template_id": "new-order",
|
||
"template_data": {
|
||
"status": order.get("status"),
|
||
"ship_date": order.get("shipDate"),
|
||
"id": order.get("id"),
|
||
"pet_id": order.get("petId"),
|
||
"quantity": order.get("quantity"),
|
||
},
|
||
},
|
||
})
|