feat: Semaine 8
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
import sys, os, random, json
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from kafka import KafkaConsumer, KafkaProducer
|
||||
from shared.events import BOOTSTRAP_SERVERS, TOPIC_ORDERS, TOPIC_PAYMENTS, make_event
|
||||
|
||||
def simulate_payment(amount: float) -> bool:
|
||||
return random.random() > 0.1
|
||||
|
||||
def run():
|
||||
consumer = KafkaConsumer(
|
||||
TOPIC_ORDERS,
|
||||
bootstrap_servers=BOOTSTRAP_SERVERS,
|
||||
group_id="payment_service",
|
||||
auto_offset_reset="latest",
|
||||
value_deserializer=lambda v: json.loads(v.decode("utf-8"))
|
||||
)
|
||||
|
||||
producer = KafkaProducer(
|
||||
bootstrap_servers=BOOTSTRAP_SERVERS,
|
||||
key_serializer=str.encode,
|
||||
value_serializer=lambda v: json.dumps(v).encode(),
|
||||
acks="all"
|
||||
)
|
||||
|
||||
print("[PAYMENT SERVICE] Service de paiement démarré, en attente d'évènements...")
|
||||
|
||||
for message in consumer:
|
||||
event = message.value
|
||||
|
||||
if event["type"] != "order_created":
|
||||
continue
|
||||
|
||||
payload = event["payload"]
|
||||
order_id = payload["order_id"]
|
||||
restaurant_id = payload["restaurant_id"]
|
||||
amount = payload["total_amount"]
|
||||
|
||||
print(f"[PAYMENT SERVICE] Traitement en cours : commande {order_id}, total {amount}€")
|
||||
|
||||
if simulate_payment(amount):
|
||||
result = make_event("payment.confirmed", {
|
||||
"order_id": order_id,
|
||||
"customer_id": payload["customer_id"],
|
||||
"restaurant_id": restaurant_id,
|
||||
"amount": amount
|
||||
})
|
||||
print(f"[PAYMENT SERVICE] Paiement confirmé pour la commande {order_id}")
|
||||
else:
|
||||
result = make_event("payment.failed", {
|
||||
"order_id": order_id,
|
||||
"customer_id": payload["customer_id"],
|
||||
"restaurant_id": restaurant_id,
|
||||
"amount": amount
|
||||
})
|
||||
print(f"[PAYMENT SERVICE] Paiement échoué pour la commande {order_id}")
|
||||
|
||||
producer.send(
|
||||
topic=TOPIC_PAYMENTS,
|
||||
key=str(restaurant_id),
|
||||
value=result
|
||||
)
|
||||
producer.flush()
|
||||
|
||||
if __name__ == "__main__":
|
||||
run()
|
||||
Reference in New Issue
Block a user