From 04662d9b5f517add5fa544b4efc29969f010761a Mon Sep 17 00:00:00 2001 From: Sk_Akib_Ahammed Date: Sat, 17 Jan 2026 16:28:12 +0530 Subject: [PATCH] Fix: Add pickup_code generation to Razorpay webhook for offline reliability --- app/app.py | 4 ++-- app/auth.py | 4 ---- app/webhook.py | 44 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/app/app.py b/app/app.py index 743e02d..cb9d9da 100644 --- a/app/app.py +++ b/app/app.py @@ -54,8 +54,8 @@ allow_origins=[ "http://localhost:3000", "http://127.0.0.1:3000", - "http://localhost:5173", - "http://127.0.0.1:5173", + "http://localhost:5000", + "http://127.0.0.1:5000", ], allow_credentials=True, allow_methods=["*"], diff --git a/app/auth.py b/app/auth.py index cf2f364..1f07203 100644 --- a/app/auth.py +++ b/app/auth.py @@ -103,8 +103,6 @@ async def verify_staff_access(token: str): status.HTTP_200_OK, "Verified", role=data.get("role"), - stall_id=data.get("stall_id"), - college_id=data.get("college_id") ) college_id, _ = _get_college_by_domain(email) @@ -141,8 +139,6 @@ async def verify_staff_access(token: str): status.HTTP_200_OK, "Manager account initialized", role="manager", - stall_id=found_stall.id, - college_id=college_id ) return _create_response( diff --git a/app/webhook.py b/app/webhook.py index 457938c..934d61c 100644 --- a/app/webhook.py +++ b/app/webhook.py @@ -1,16 +1,15 @@ - # app/webhook.py import os import hmac import hashlib +import random from fastapi import APIRouter, Request, HTTPException from firebase_admin import firestore from .firebase_init import db router = APIRouter() - @router.post("/webhook/razorpay", tags=["webhook"]) async def razorpay_webhook(request: Request): signature = request.headers.get('X-Razorpay-Signature') @@ -41,14 +40,39 @@ async def razorpay_webhook(request: Request): if internal_order_id: order_ref = db.collection('orders').document(internal_order_id) - order_ref.update({ - "status": "PAID", - "payment_id": payment_id, - "razorpay_payment_data": payment, - "updated_at": firestore.SERVER_TIMESTAMP - }) - print(f"✅ Order {internal_order_id} marked as PAID") + + transaction = db.transaction() + + @firestore.transactional + def update_in_transaction(transaction, order_ref): + snapshot = order_ref.get(transaction=transaction) + if not snapshot.exists: + print(f"❌ Order {internal_order_id} not found!") + return + + current_data = snapshot.to_dict() + + if current_data.get("status") == "PAID": + print(f"ℹ️ Order {internal_order_id} was already PAID. Skipping update.") + return + + pickup_code = str(random.randint(1000, 9999)) + + transaction.update(order_ref, { + "status": "PAID", + "payment_id": payment_id, + "razorpay_payment_data": payment, + "pickup_code": pickup_code, + "updated_at": firestore.SERVER_TIMESTAMP + }) + print(f"✅ SUCCESS: Generated Pickup Code {pickup_code} for Order {internal_order_id}") + + try: + update_in_transaction(transaction, order_ref) + except Exception as e: + print(f"❌ Transaction failed: {e}") + else: print(f"⚠️ Payment received without internal_order_id: {payment['id']}") - return {"status": "ok"} + return {"status": "ok"} \ No newline at end of file