"""Single relay, synthetic delivery; local SQL effects only.""" def place_order(db, order_id, amount, checkpoint=lambda stage: None): db.execute("BEGIN IMMEDIATE") try: db.execute("INSERT INTO orders VALUES (?, ?)", (order_id, amount)) changed = db.execute( "UPDATE wallet SET balance = balance - ? WHERE id = 'demo' AND balance >= ?", (amount, amount), ).rowcount if changed != 1: raise ValueError("insufficient balance") checkpoint("before_outbox") db.execute("INSERT INTO outbox(event_id, order_id, amount) VALUES (?, ?, ?)", ("order-created:" + order_id, order_id, amount)) db.execute("COMMIT") except BaseException: if db.in_transaction: db.execute("ROLLBACK") raise def relay_once(db, send, checkpoint=lambda stage: None): row = db.execute( "SELECT event_id, order_id, amount FROM outbox WHERE sent = 0 ORDER BY rowid LIMIT 1" ).fetchone() if row is None: return False event = dict(zip(("event_id", "order_id", "amount"), row)) send(event) checkpoint("after_send") db.execute("UPDATE outbox SET sent = 1 WHERE event_id = ?", (event["event_id"],)) return True def consume(db, event, checkpoint=lambda stage: None): if (not isinstance(event, dict) or set(event) != {"event_id", "order_id", "amount"} or any(not isinstance(event[key], str) or not 1 <= len(event[key]) <= 200 for key in ("event_id", "order_id")) or type(event["amount"]) is not int or not 1 <= event["amount"] <= 1_000_000): raise ValueError("invalid event") db.execute("BEGIN IMMEDIATE") try: inserted = db.execute( "INSERT INTO processed VALUES (?, ?, ?) ON CONFLICT(event_id) DO NOTHING", (event["event_id"], event["order_id"], event["amount"]), ).rowcount if inserted == 0: previous = db.execute( "SELECT order_id, amount FROM processed WHERE event_id = ?", (event["event_id"],), ).fetchone() if previous != (event["order_id"], event["amount"]): raise ValueError("event ID reused with different payload") db.execute("COMMIT") return False checkpoint("after_dedup") db.execute("INSERT INTO notifications(order_id, amount) VALUES (?, ?)", (event["order_id"], event["amount"])) db.execute("COMMIT") return True except BaseException: if db.in_transaction: db.execute("ROLLBACK") raise