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()