@neocleus/razorpay-firebase-functions 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,6 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
10
10
  const webhookPaymentId = event.payload.payment?.entity?.id || event.payload.payment?.id;
11
11
  const webhookOrderId = event.payload.order?.entity?.id || event.payload.order?.id;
12
12
  if (!webhookPaymentId && !webhookOrderId) {
13
- logs_1.logs.error(new Error(`Missing both payment and order IDs in webhook payload: ${event.id}`));
14
13
  return;
15
14
  }
16
15
  let fetchedPayment = null;
@@ -33,21 +32,11 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
33
32
  }
34
33
  }
35
34
  catch (err) {
36
- logs_1.logs.error(new Error(`Failed to fetch entity from Razorpay API. Event: ${event.event}. Error: ${err.message}`));
37
- if ((0, retry_1.isTransientError)(err)) {
35
+ logs_1.logs.error(new Error(`API Fetch Failed. Event: ${event.event}. Error: ${err.message}`));
36
+ if ((0, retry_1.isTransientError)(err))
38
37
  throw err;
39
- }
40
38
  return;
41
39
  }
42
- // Fetch associated order if this is a payment event and we need fallback values
43
- if (isPayment && fetchedPayment && fetchedPayment.order_id) {
44
- try {
45
- fetchedOrder = await (0, retry_1.fetchWithBackoff)(() => razorpayClient.orders.fetch(fetchedPayment.order_id));
46
- }
47
- catch (orderErr) {
48
- logs_1.logs.error(new Error(`Failed to fetch associated order ${fetchedPayment.order_id} for payment: ${orderErr.message}`));
49
- }
50
- }
51
40
  const notes = fetchedPayment?.notes || fetchedOrder?.notes;
52
41
  const sessionId = notes?.sessionId ? String(notes.sessionId) : undefined;
53
42
  let uid;
@@ -59,20 +48,35 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
59
48
  if (mappedUid) {
60
49
  uid = mappedUid;
61
50
  }
62
- else {
63
- logs_1.logs.info(`Razorpay Customer ID ${customerId} not mapped to a Firebase UID. Will fall back to notes.`);
64
- }
65
51
  }
66
- // Fallback: use uid from payment/order notes if customerId mapping was not found or not present
67
52
  if (!uid && notes?.uid) {
68
- uid = String(notes.uid);
53
+ uid = String(notes.uid); // Fallback to notes
69
54
  }
70
55
  if (!uid) {
71
- logs_1.logs.error(new Error(`Cannot resolve UID for event ${event.event}. No customer_id mapping and no uid in notes.`));
56
+ logs_1.logs.error(new Error(`Cannot resolve UID for event ${event.event}.`));
72
57
  return;
73
58
  }
59
+ const typedFs = new typedFirestore_1.TypedFirestore(db, config);
60
+ // ========================================================================
61
+ // PART 1: THE STRIPE APPROACH ("Dumb" Mirroring)
62
+ // Always write the raw entity to a dedicated collection so Firestore
63
+ // exactly matches Razorpay, regardless of overlapping events.
64
+ // ========================================================================
65
+ const batch = db.batch();
66
+ if (fetchedPayment) {
67
+ const paymentRef = typedFs.getCustomerPaymentDoc(uid, fetchedPayment.id);
68
+ batch.set(paymentRef, fetchedPayment, { merge: true });
69
+ }
70
+ if (fetchedOrder) {
71
+ const orderRef = typedFs.getCustomerOrderDoc(uid, fetchedOrder.id);
72
+ batch.set(orderRef, fetchedOrder, { merge: true });
73
+ }
74
+ await batch.commit();
75
+ // --- SMART SEGREGATION ---
76
+ // If there is no sessionId, this is NOT a one-time checkout session.
77
+ // It is likely a subscription payment/order. We exit gracefully without throwing an error.
74
78
  if (!sessionId) {
75
- logs_1.logs.error(new Error(`Missing sessionId in notes for event ${event.event}.`));
79
+ logs_1.logs.info(`Skipping ${event.event} - No sessionId in notes. Likely a Subscription event.`);
76
80
  return;
77
81
  }
78
82
  let newStatus = 'processing';
@@ -81,37 +85,29 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
81
85
  newStatus = 'paid';
82
86
  else if (fetchedPayment.status === 'failed')
83
87
  newStatus = 'failed';
84
- else
85
- newStatus = 'processing';
86
88
  }
87
89
  else if (fetchedOrder) {
88
90
  if (fetchedOrder.status === 'paid')
89
91
  newStatus = 'paid';
90
- else
91
- newStatus = 'processing';
92
92
  }
93
- const typedFs = new typedFirestore_1.TypedFirestore(db, config);
94
93
  const docRef = typedFs.getCheckoutSessionDoc(uid, sessionId);
95
94
  const orderDocRef = typedFs.getCheckoutSessionOrderDoc(uid, sessionId);
96
95
  let existingData;
96
+ let hasStatusChanged = false; // Tracks if we actually moved forward
97
97
  try {
98
98
  await db.runTransaction(async (tx) => {
99
99
  const snap = await tx.get(docRef);
100
100
  if (!snap.exists) {
101
- logs_1.logs.error(new Error(`Checkout session ${sessionId} for user ${uid} does not exist. Possible notes injection attempt.`));
101
+ logs_1.logs.error(new Error(`Checkout session missing. Possible notes injection.`));
102
102
  return;
103
103
  }
104
104
  existingData = snap.data();
105
- // Secure validation: Fetch the server-written order document inside the transaction to verify order ID
105
+ hasStatusChanged = existingData?.status !== newStatus;
106
+ // --- TRUST BUT VERIFY (SECURITY) ---
106
107
  const orderSnap = await tx.get(orderDocRef);
107
- if (!orderSnap.exists) {
108
- logs_1.logs.error(new Error(`Order details missing for session ${sessionId}. Possible notes injection.`));
109
- return;
110
- }
111
- const orderData = orderSnap.data();
112
108
  const expectedOrderId = isPayment && fetchedPayment ? fetchedPayment.order_id : fetchedOrder.id;
113
- if (!orderData || orderData.id !== expectedOrderId) {
114
- logs_1.logs.error(new Error(`Order ID mismatch for session ${sessionId}. Expected: ${orderData?.id}, Got: ${expectedOrderId}. Possible notes injection.`));
109
+ if (!orderSnap.exists || orderSnap.data()?.id !== expectedOrderId) {
110
+ logs_1.logs.error(new Error(`Order ID Mismatch! Possible Notes Injection attempt.`));
115
111
  return;
116
112
  }
117
113
  const dataToWrite = {
@@ -121,29 +117,23 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
121
117
  if (existingData?.processing_at) {
122
118
  dataToWrite.processing_at = firestore_1.FieldValue.delete();
123
119
  }
124
- // Update status and timestamp on the main document
125
120
  tx.set(docRef, dataToWrite, { merge: true });
126
- // Store raw Razorpay responses in separate subcollection documents
127
121
  if (isPayment && fetchedPayment) {
128
- const paymentDocRef = typedFs.getCheckoutSessionPaymentDoc(uid, sessionId);
129
- tx.set(paymentDocRef, fetchedPayment);
122
+ tx.set(typedFs.getCheckoutSessionPaymentDoc(uid, sessionId), fetchedPayment);
130
123
  }
131
124
  else if (fetchedOrder) {
132
125
  tx.set(orderDocRef, fetchedOrder);
133
126
  }
134
127
  });
135
- // Execute user callback on webhook success
136
- if (config.onCheckoutSessionUpdate && existingData) {
128
+ // --- IDEMPOTENT CALLBACK ---
129
+ // Only trigger the user's custom logic if the database state ACTUALLY changed.
130
+ if (hasStatusChanged && config.onCheckoutSessionUpdate && existingData) {
137
131
  try {
138
- const updatedSession = {
139
- ...existingData,
140
- status: newStatus,
141
- updated_at: firestore_1.FieldValue.serverTimestamp(),
142
- };
132
+ const updatedSession = { ...existingData, status: newStatus, updated_at: firestore_1.FieldValue.serverTimestamp() };
143
133
  await config.onCheckoutSessionUpdate(uid, updatedSession, fetchedPayment || undefined);
144
134
  }
145
- catch (callbackErr) {
146
- logs_1.logs.error(new Error(`Error in onCheckoutSessionUpdate callback: ${callbackErr.message}`));
135
+ catch (err) {
136
+ logs_1.logs.error(new Error(`onCheckoutSessionUpdate error: ${err.message}`));
147
137
  }
148
138
  }
149
139
  logs_1.logs.webhookProcessed(event.event, fetchedPayment?.id || fetchedOrder?.id || '');
@@ -1 +1 @@
1
- {"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/handlers/payments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/handlers/payments.ts"],"names":[],"mappings":";;;AAAA,wDAAsD;AAKtD,kCAA+B;AAE/B,0CAAoE;AACpE,8DAA8D;AAC9D,4DAAyD;AAElD,MAAM,kBAAkB,GAAG,KAAK,EACnC,KAAmB,EACnB,EAA6B,EAC7B,cAA6C,EAC7C,MAA0B,EAC5B,EAAE;IACA,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACxF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAElF,IAAI,CAAC,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,OAAO;IACX,CAAC;IAED,IAAI,cAAc,GAAoC,IAAI,CAAC;IAC3D,IAAI,YAAY,GAAgC,IAAI,CAAC;IACrD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,IAAI,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACzD,cAAc,GAAG,MAAM,IAAA,wBAAgB,EAAC,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC/F,SAAS,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,cAAc,EAAE,CAAC;YAC5D,YAAY,GAAG,MAAM,IAAA,wBAAgB,EAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QAC7F,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YACxB,YAAY,GAAG,MAAM,IAAA,wBAAgB,EAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QAC7F,CAAC;aAAM,IAAI,gBAAgB,EAAE,CAAC;YAC1B,cAAc,GAAG,MAAM,IAAA,wBAAgB,EAAC,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC/F,SAAS,GAAG,IAAI,CAAC;QACrB,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,WAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,IAAA,wBAAgB,EAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QACrC,OAAO;IACX,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,EAAE,KAAK,IAAI,YAAY,EAAE,KAAK,CAAC;IAC3D,MAAM,SAAS,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzE,IAAI,GAAuB,CAAC;IAC5B,MAAM,UAAU,GAAG,CAAC,SAAS,IAAI,cAAc,CAAC;QAC5C,CAAC,CAAC,cAAc,CAAC,WAAW;QAC5B,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAE,YAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAErE,IAAI,UAAU,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,MAAM,IAAA,oCAAkB,EAAC,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACnF,IAAI,SAAS,EAAE,CAAC;YACZ,GAAG,GAAG,SAAS,CAAC;QACpB,CAAC;IACL,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,KAAK,EAAE,GAAG,EAAE,CAAC;QACrB,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB;IACjD,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,WAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACtE,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,+BAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAE/C,2EAA2E;IAC3E,iDAAiD;IACjD,sEAAsE;IACtE,8DAA8D;IAC9D,2EAA2E;IAC3E,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACzB,IAAI,cAAc,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;QACzE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;IAErB,4BAA4B;IAC5B,sEAAsE;IACtE,2FAA2F;IAC3F,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,WAAI,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,KAAK,wDAAwD,CAAC,CAAC;QAC3F,OAAO;IACX,CAAC;IAED,IAAI,SAAS,GAAqC,YAAY,CAAC;IAC/D,IAAI,SAAS,IAAI,cAAc,EAAE,CAAC;QAC9B,IAAI,cAAc,CAAC,MAAM,KAAK,UAAU;YAAE,SAAS,GAAG,MAAM,CAAC;aACxD,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ;YAAE,SAAS,GAAG,QAAQ,CAAC;IACtE,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACtB,IAAI,YAAY,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS,GAAG,MAAM,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,0BAA0B,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAEvE,IAAI,YAA4C,CAAC;IACjD,IAAI,gBAAgB,GAAG,KAAK,CAAC,CAAC,sCAAsC;IAEpE,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACf,WAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC;gBAC7E,OAAO;YACX,CAAC;YAED,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,gBAAgB,GAAG,YAAY,EAAE,MAAM,KAAK,SAAS,CAAC;YAEtD,sCAAsC;YACtC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,eAAe,GAAG,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAa,CAAC,EAAE,CAAC;YAEjG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,eAAe,EAAE,CAAC;gBAChE,WAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;gBAC9E,OAAO;YACX,CAAC;YAED,MAAM,WAAW,GAAgC;gBAC7C,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,sBAAU,CAAC,eAAe,EAAE;aAC3C,CAAC;YAEF,IAAI,YAAY,EAAE,aAAa,EAAE,CAAC;gBAC9B,WAAW,CAAC,aAAa,GAAG,sBAAU,CAAC,MAAM,EAAS,CAAC;YAC3D,CAAC;YAED,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,WAAiC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAEnE,IAAI,SAAS,IAAI,cAAc,EAAE,CAAC;gBAC9B,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,4BAA4B,CAAC,GAAI,EAAE,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;YAClF,CAAC;iBAAM,IAAI,YAAY,EAAE,CAAC;gBACtB,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACtC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,+EAA+E;QAC/E,IAAI,gBAAgB,IAAI,MAAM,CAAC,uBAAuB,IAAI,YAAY,EAAE,CAAC;YACrE,IAAI,CAAC;gBACD,MAAM,cAAc,GAAG,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAU,CAAC,eAAe,EAAS,EAAE,CAAC;gBAC/G,MAAM,MAAM,CAAC,uBAAuB,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,IAAI,SAAS,CAAC,CAAC;YAC3F,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,WAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC;QACL,CAAC;QAED,WAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,IAAI,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,WAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAzJW,QAAA,kBAAkB,sBAyJ7B"}
@@ -8,57 +8,48 @@ const customerMapping_1 = require("../utils/customerMapping");
8
8
  const typedFirestore_1 = require("../utils/typedFirestore");
9
9
  const handleSubscriptionEvent = async (event, db, razorpayClient, config) => {
10
10
  const webhookSubscription = event.payload.subscription?.entity;
11
- if (!webhookSubscription?.id) {
12
- logs_1.logs.error(new Error(`Missing subscription entity or ID in webhook payload: ${event.id}`));
11
+ if (!webhookSubscription?.id)
13
12
  return;
14
- }
15
13
  let subscriptionEntity;
16
14
  try {
17
15
  subscriptionEntity = await (0, retry_1.fetchWithBackoff)(() => razorpayClient.subscriptions.fetch(webhookSubscription.id));
18
16
  }
19
17
  catch (err) {
20
- logs_1.logs.error(new Error(`Failed to fetch subscription from Razorpay API: ${webhookSubscription.id}. Error: ${err.message}`));
21
- if ((0, retry_1.isTransientError)(err)) {
18
+ if ((0, retry_1.isTransientError)(err))
22
19
  throw err;
23
- }
24
20
  return;
25
21
  }
26
22
  const customerId = subscriptionEntity.customer_id;
27
- if (!customerId) {
28
- logs_1.logs.error(new Error(`No customer_id found on subscription ${subscriptionEntity.id}. Cannot resolve UID.`));
23
+ if (!customerId)
29
24
  return;
30
- }
31
25
  const uid = await (0, customerMapping_1.getUidByCustomerId)(customerId, config.customersCollection);
32
- if (!uid) {
33
- logs_1.logs.error(new Error(`No Firebase UID found mapped to Razorpay Customer ID ${customerId} for subscription ${subscriptionEntity.id}`));
26
+ if (!uid)
34
27
  return;
35
- }
36
28
  const newStatus = String(subscriptionEntity.status);
37
29
  const subscriptionId = subscriptionEntity.id;
38
30
  const typedFs = new typedFirestore_1.TypedFirestore(db, config);
39
31
  const docRef = typedFs.getSubscriptionDoc(uid, subscriptionId);
40
32
  let paymentEntity = null;
41
- const webhookPayment = event.payload.payment?.entity || (event.payload.payment?.id ? event.payload.payment : null);
33
+ const webhookPayment = event.payload.payment?.entity || event.payload.payment;
42
34
  if (webhookPayment?.id) {
43
35
  try {
44
36
  paymentEntity = await (0, retry_1.fetchWithBackoff)(() => razorpayClient.payments.fetch(webhookPayment.id));
45
37
  }
46
38
  catch (err) {
47
- logs_1.logs.error(new Error(`Failed to fetch payment from Razorpay API: ${webhookPayment.id}. Error: ${err.message}`));
48
- if ((0, retry_1.isTransientError)(err)) {
39
+ if ((0, retry_1.isTransientError)(err))
49
40
  throw err;
50
- }
51
41
  }
52
42
  }
53
43
  let existingData;
44
+ let hasStatusChanged = false; // Tracks if we actually moved forward
54
45
  try {
55
46
  await db.runTransaction(async (tx) => {
56
47
  const existingDoc = await tx.get(docRef);
57
- if (!existingDoc.exists) {
58
- logs_1.logs.error(new Error(`Subscription document does not exist in Firestore for ID: ${subscriptionId}. Rejecting webhook event.`));
48
+ if (!existingDoc.exists)
59
49
  return;
60
- }
61
50
  existingData = existingDoc.data();
51
+ // --- IDEMPOTENCY CHECK ---
52
+ hasStatusChanged = existingData?.status !== newStatus;
62
53
  const dataToWrite = {
63
54
  status: newStatus,
64
55
  updated_at: firestore_1.FieldValue.serverTimestamp(),
@@ -66,29 +57,22 @@ const handleSubscriptionEvent = async (event, db, razorpayClient, config) => {
66
57
  if (existingData?.processing_at) {
67
58
  dataToWrite.processing_at = firestore_1.FieldValue.delete();
68
59
  }
69
- // Update status and timestamp on the main document
70
60
  tx.set(docRef, dataToWrite, { merge: true });
71
- // Store the raw subscription object in the canonical subcollection
72
- const detailsDocRef = typedFs.getSubscriptionDetailsDoc(uid, subscriptionId);
73
- tx.set(detailsDocRef, subscriptionEntity);
74
- // Store the raw payment entity directly in the payments subcollection
61
+ tx.set(typedFs.getSubscriptionDetailsDoc(uid, subscriptionId), subscriptionEntity);
75
62
  if (paymentEntity) {
76
- const paymentRef = typedFs.getSubscriptionPaymentDoc(uid, subscriptionId, paymentEntity.id);
77
- tx.set(paymentRef, paymentEntity);
63
+ tx.set(typedFs.getSubscriptionPaymentDoc(uid, subscriptionId, paymentEntity.id), paymentEntity);
64
+ // Dumb Sync to global customer payments collection
65
+ tx.set(typedFs.getCustomerPaymentDoc(uid, paymentEntity.id), paymentEntity, { merge: true });
78
66
  }
79
67
  });
80
- // Execute user callback on webhook success
81
- if (config.onSubscriptionUpdate && existingData) {
68
+ // --- IDEMPOTENT CALLBACK ---
69
+ if (hasStatusChanged && config.onSubscriptionUpdate && existingData) {
82
70
  try {
83
- const updatedSubscription = {
84
- ...existingData,
85
- status: newStatus,
86
- updated_at: firestore_1.FieldValue.serverTimestamp(),
87
- };
71
+ const updatedSubscription = { ...existingData, status: newStatus, updated_at: firestore_1.FieldValue.serverTimestamp() };
88
72
  await config.onSubscriptionUpdate(uid, updatedSubscription, subscriptionEntity);
89
73
  }
90
- catch (callbackErr) {
91
- logs_1.logs.error(new Error(`Error in onSubscriptionUpdate callback: ${callbackErr.message}`));
74
+ catch (err) {
75
+ logs_1.logs.error(new Error(`onSubscriptionUpdate error: ${err.message}`));
92
76
  }
93
77
  }
94
78
  logs_1.logs.webhookProcessed(event.event, subscriptionEntity.id);
@@ -1 +1 @@
1
- {"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/handlers/subscriptions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/handlers/subscriptions.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,10 @@ export declare class TypedFirestore {
22
22
  getSubscriptionDetailsDoc(uid: string, subscriptionId: string): admin.firestore.DocumentReference<Subscriptions.RazorpaySubscription, admin.firestore.DocumentData>;
23
23
  getSubscriptionPaymentsCollection(uid: string, subscriptionId: string): admin.firestore.CollectionReference<Payments.RazorpayPayment, admin.firestore.DocumentData>;
24
24
  getSubscriptionPaymentDoc(uid: string, subscriptionId: string, paymentId: string): admin.firestore.DocumentReference<Payments.RazorpayPayment, admin.firestore.DocumentData>;
25
+ getCustomerPaymentsCollection(uid: string): admin.firestore.CollectionReference<Payments.RazorpayPayment, admin.firestore.DocumentData>;
26
+ getCustomerPaymentDoc(uid: string, paymentId: string): admin.firestore.DocumentReference<Payments.RazorpayPayment, admin.firestore.DocumentData>;
27
+ getCustomerOrdersCollection(uid: string): admin.firestore.CollectionReference<Orders.RazorpayOrder, admin.firestore.DocumentData>;
28
+ getCustomerOrderDoc(uid: string, orderId: string): admin.firestore.DocumentReference<Orders.RazorpayOrder, admin.firestore.DocumentData>;
25
29
  getWebhookEventsCollection(): admin.firestore.CollectionReference<WebhookEventDoc, admin.firestore.DocumentData>;
26
30
  getWebhookEventDoc(eventId: string): admin.firestore.DocumentReference<WebhookEventDoc, admin.firestore.DocumentData>;
27
31
  }
@@ -72,6 +72,18 @@ class TypedFirestore {
72
72
  getSubscriptionPaymentDoc(uid, subscriptionId, paymentId) {
73
73
  return this.getSubscriptionPaymentsCollection(uid, subscriptionId).doc(paymentId);
74
74
  }
75
+ getCustomerPaymentsCollection(uid) {
76
+ return this.getCustomerDoc(uid).collection('payments').withConverter(converter());
77
+ }
78
+ getCustomerPaymentDoc(uid, paymentId) {
79
+ return this.getCustomerPaymentsCollection(uid).doc(paymentId);
80
+ }
81
+ getCustomerOrdersCollection(uid) {
82
+ return this.getCustomerDoc(uid).collection('orders').withConverter(converter());
83
+ }
84
+ getCustomerOrderDoc(uid, orderId) {
85
+ return this.getCustomerOrdersCollection(uid).doc(orderId);
86
+ }
75
87
  getWebhookEventsCollection() {
76
88
  return this.db.collection('webhook_events').withConverter(converter());
77
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"typedFirestore.js","sourceRoot":"","sources":["../../src/utils/typedFirestore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typedFirestore.js","sourceRoot":"","sources":["../../src/utils/typedFirestore.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocleus/razorpay-firebase-functions",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Consumable Firebase Cloud Functions for Razorpay payments and subscriptions integration using the Factory pattern",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",