feat: Semaine 8
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from uuid import uuid4
|
||||
from fastapi import FastAPI
|
||||
|
||||
from fastapi.responses import JSONResponse
|
||||
from pydantic import BaseModel
|
||||
from producer import OrderProducer
|
||||
|
||||
app = FastAPI()
|
||||
producer = OrderProducer()
|
||||
orders_db: list[dict] = []
|
||||
|
||||
class OrderItem(BaseModel):
|
||||
dish_id: int
|
||||
name: str
|
||||
price: float
|
||||
|
||||
class CreateOrderDto(BaseModel):
|
||||
customer_id: int
|
||||
restaurant_id: int
|
||||
items: list[OrderItem]
|
||||
|
||||
@app.post("/orders")
|
||||
async def place_order(payload: CreateOrderDto):
|
||||
order = {
|
||||
"order_id": uuid4().hex,
|
||||
"customer_id": payload.customer_id,
|
||||
"restaurant_id": payload.restaurant_id,
|
||||
"items": [ item.model_dump() for item in payload.items ],
|
||||
"total_amount": sum([ item.price for item in payload.items ])
|
||||
}
|
||||
|
||||
producer.publish_order_created(order)
|
||||
|
||||
return JSONResponse(
|
||||
status_code= 202,
|
||||
content= {"message": "Commande acceptee", "order_id": order["order_id"]}
|
||||
)
|
||||
@@ -0,0 +1,26 @@
|
||||
import json
|
||||
|
||||
from kafka import KafkaProducer
|
||||
from shared.events import BOOTSTRAP_SERVERS, make_event, TOPIC_ORDERS
|
||||
|
||||
class OrderProducer:
|
||||
def __init__(self):
|
||||
self.producer = KafkaProducer(
|
||||
bootstrap_servers=BOOTSTRAP_SERVERS,
|
||||
key_serializer= str.encode, # convertir en bytes "3" -> b"3"
|
||||
value_serializer=lambda v: json.dumps(v).encode(),
|
||||
acks= "all"
|
||||
)
|
||||
|
||||
def publish_order_created(self, order: dict):
|
||||
event = make_event(
|
||||
"order_created",
|
||||
order
|
||||
)
|
||||
|
||||
self.producer.send(
|
||||
TOPIC_ORDERS,
|
||||
value=event
|
||||
)
|
||||
|
||||
self.producer.flush()
|
||||
Reference in New Issue
Block a user