@neocleus/razorpay-firebase-functions 1.0.5 → 1.0.7
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.
- package/lib/admin.d.ts +1 -2
- package/lib/admin.js +29 -51
- package/lib/admin.js.map +1 -1
- package/lib/callables/subscriptions.js +2 -2
- package/lib/callables/subscriptions.js.map +1 -1
- package/lib/index.d.ts +1 -2
- package/lib/utils/index.d.ts +1 -10
- package/lib/utils/index.js +1 -48
- package/lib/utils/index.js.map +1 -1
- package/package.json +3 -3
package/lib/admin.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import Razorpay from 'razorpay';
|
|
2
2
|
import { RazorpaySyncConfig, ProductDoc } from './types';
|
|
3
|
-
export declare const buildCreatePlan: (config: RazorpaySyncConfig, rzp: Razorpay) => import("firebase-functions/v2/https").CallableFunction<any, Promise<
|
|
3
|
+
export declare const buildCreatePlan: (config: RazorpaySyncConfig, rzp: Razorpay) => import("firebase-functions/v2/https").CallableFunction<any, Promise<import("./types").SanitizedPlan>, unknown>;
|
|
4
4
|
export declare const buildSyncPlans: (config: RazorpaySyncConfig, rzp: Razorpay) => import("firebase-functions/v2/https").CallableFunction<any, Promise<{
|
|
5
5
|
status: string;
|
|
6
6
|
count: number;
|
|
7
|
-
productsCount: number;
|
|
8
7
|
}>, unknown>;
|
|
9
8
|
export declare const buildCreateProduct: (config: RazorpaySyncConfig) => import("firebase-functions/v2/https").CallableFunction<import("@neocleus/razorpay-firebase-types").CreateProductRequest, Promise<ProductDoc>, unknown>;
|
package/lib/admin.js
CHANGED
|
@@ -41,7 +41,7 @@ const logs_1 = require("./logs");
|
|
|
41
41
|
const utils_1 = require("./utils");
|
|
42
42
|
const typedFirestore_1 = require("./utils/typedFirestore");
|
|
43
43
|
const buildCreatePlan = (config, rzp) => {
|
|
44
|
-
return (0, https_1.onCall)(async (request) => {
|
|
44
|
+
return (0, https_1.onCall)({ cors: true }, async (request) => {
|
|
45
45
|
if (!request.auth || request.auth.token.admin !== true) {
|
|
46
46
|
throw new https_1.HttpsError('permission-denied', 'Must be an administrative user to initiate plan creation.');
|
|
47
47
|
}
|
|
@@ -57,9 +57,12 @@ const buildCreatePlan = (config, rzp) => {
|
|
|
57
57
|
notes
|
|
58
58
|
});
|
|
59
59
|
const db = admin.firestore();
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
const typedFs = new typedFirestore_1.TypedFirestore(db, config);
|
|
61
|
+
const planRef = typedFs.getPlanDoc(plan.id);
|
|
62
|
+
const planData = (0, utils_1.sanitizePlan)(plan);
|
|
63
|
+
await planRef.set(planData, { merge: true });
|
|
64
|
+
logs_1.logs.info(`Admin created plan: ${plan.id} and saved to plans collection.`);
|
|
65
|
+
return planData;
|
|
63
66
|
}
|
|
64
67
|
catch (err) {
|
|
65
68
|
logs_1.logs.error(err);
|
|
@@ -69,7 +72,7 @@ const buildCreatePlan = (config, rzp) => {
|
|
|
69
72
|
};
|
|
70
73
|
exports.buildCreatePlan = buildCreatePlan;
|
|
71
74
|
const buildSyncPlans = (config, rzp) => {
|
|
72
|
-
return (0, https_1.onCall)(async (request) => {
|
|
75
|
+
return (0, https_1.onCall)({ cors: true }, async (request) => {
|
|
73
76
|
if (!request.auth || request.auth.token.admin !== true) {
|
|
74
77
|
throw new https_1.HttpsError('permission-denied', 'Must be an administrative user to initiate plan sync.');
|
|
75
78
|
}
|
|
@@ -94,57 +97,20 @@ const buildSyncPlans = (config, rzp) => {
|
|
|
94
97
|
hasMore = false;
|
|
95
98
|
}
|
|
96
99
|
}
|
|
97
|
-
logs_1.logs.info(`Fetched ${allPlans.length} plans.
|
|
98
|
-
// Group plans by productId in memory
|
|
99
|
-
const productPlansMap = new Map();
|
|
100
|
-
for (const plan of allPlans) {
|
|
101
|
-
const productId = (0, utils_1.generateProductId)(plan);
|
|
102
|
-
if (!productPlansMap.has(productId)) {
|
|
103
|
-
productPlansMap.set(productId, []);
|
|
104
|
-
}
|
|
105
|
-
productPlansMap.get(productId).push(plan);
|
|
106
|
-
}
|
|
107
|
-
logs_1.logs.info(`Identified ${productPlansMap.size} distinct products. Reading existing products collection...`);
|
|
108
|
-
// Read all existing products to avoid per-document lookups
|
|
109
|
-
const productsCollection = typedFs.getProductsCollection();
|
|
110
|
-
const existingProductsSnap = await productsCollection.get();
|
|
111
|
-
const existingProducts = new Map();
|
|
112
|
-
for (const doc of existingProductsSnap.docs) {
|
|
113
|
-
existingProducts.set(doc.id, doc.data());
|
|
114
|
-
}
|
|
115
|
-
logs_1.logs.info('Writing synchronized product catalogs to Firestore via BulkWriter...');
|
|
100
|
+
logs_1.logs.info(`Fetched ${allPlans.length} plans. Writing to plans collection via BulkWriter...`);
|
|
116
101
|
const bulkWriter = db.bulkWriter();
|
|
117
102
|
bulkWriter.onWriteError((error) => {
|
|
118
103
|
logs_1.logs.error(new Error(`BulkWriter error: ${error.message}`));
|
|
119
104
|
return false; // Do not retry
|
|
120
105
|
});
|
|
121
|
-
for (const
|
|
122
|
-
const
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
id: productId,
|
|
126
|
-
name: plans[0].item?.name || 'Razorpay Product',
|
|
127
|
-
description: plans[0].item?.description || '',
|
|
128
|
-
active: true,
|
|
129
|
-
created_at: firestore_1.FieldValue.serverTimestamp(),
|
|
130
|
-
};
|
|
131
|
-
if (plans.length > 0) {
|
|
132
|
-
productData.planId = plans[0].id;
|
|
133
|
-
}
|
|
134
|
-
productData.type = 'subscription';
|
|
135
|
-
productData.updated_at = firestore_1.FieldValue.serverTimestamp();
|
|
136
|
-
productData._synced_via = 'admin_api';
|
|
137
|
-
bulkWriter.set(productDocRef, productData, { merge: true });
|
|
138
|
-
// Write each plan to root-level plans collection
|
|
139
|
-
for (const plan of plans) {
|
|
140
|
-
const planDocRef = typedFs.getPlanDoc(plan.id);
|
|
141
|
-
const planData = (0, utils_1.sanitizePlan)(plan);
|
|
142
|
-
bulkWriter.set(planDocRef, planData, { merge: true });
|
|
143
|
-
}
|
|
106
|
+
for (const plan of allPlans) {
|
|
107
|
+
const planDocRef = typedFs.getPlanDoc(plan.id);
|
|
108
|
+
const planData = (0, utils_1.sanitizePlan)(plan);
|
|
109
|
+
bulkWriter.set(planDocRef, planData, { merge: true });
|
|
144
110
|
}
|
|
145
111
|
await bulkWriter.close();
|
|
146
|
-
logs_1.logs.info(`Admin synced ${allPlans.length} plans successfully
|
|
147
|
-
return { status: 'SUCCESS', count: allPlans.length
|
|
112
|
+
logs_1.logs.info(`Admin synced ${allPlans.length} plans successfully.`);
|
|
113
|
+
return { status: 'SUCCESS', count: allPlans.length };
|
|
148
114
|
}
|
|
149
115
|
catch (err) {
|
|
150
116
|
logs_1.logs.error(err);
|
|
@@ -154,11 +120,11 @@ const buildSyncPlans = (config, rzp) => {
|
|
|
154
120
|
};
|
|
155
121
|
exports.buildSyncPlans = buildSyncPlans;
|
|
156
122
|
const buildCreateProduct = (config) => {
|
|
157
|
-
return (0, https_1.onCall)(async (request) => {
|
|
123
|
+
return (0, https_1.onCall)({ cors: true }, async (request) => {
|
|
158
124
|
if (!request.auth || request.auth.token.admin !== true) {
|
|
159
125
|
throw new https_1.HttpsError('permission-denied', 'Must be an administrative user to create products.');
|
|
160
126
|
}
|
|
161
|
-
const { id, name, description, type, amount, currency, planId } = request.data;
|
|
127
|
+
const { id, name, description, type, amount, currency, planId, metadata } = request.data;
|
|
162
128
|
if (!id || !name || !type) {
|
|
163
129
|
throw new https_1.HttpsError('invalid-argument', 'Missing required fields: id, name, type.');
|
|
164
130
|
}
|
|
@@ -183,6 +149,18 @@ const buildCreateProduct = (config) => {
|
|
|
183
149
|
productData.type = type;
|
|
184
150
|
productData.updated_at = firestore_1.FieldValue.serverTimestamp();
|
|
185
151
|
productData._synced_via = 'admin_sdk_api';
|
|
152
|
+
if (metadata !== undefined) {
|
|
153
|
+
if (metadata && typeof metadata === 'object') {
|
|
154
|
+
const sanitizedMetadata = {};
|
|
155
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
156
|
+
sanitizedMetadata[key] = String(value);
|
|
157
|
+
}
|
|
158
|
+
productData.metadata = sanitizedMetadata;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
delete productData.metadata;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
186
164
|
if (type === 'one-time') {
|
|
187
165
|
if (amount === undefined || amount <= 0 || !currency) {
|
|
188
166
|
throw new https_1.HttpsError('invalid-argument', 'One-time products require a valid positive amount and currency.');
|
package/lib/admin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAkF;AAClF,sDAAwC;AACxC,wDAAsD;AAEtD,iCAA8B;AAE9B,
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,7 @@ const firestore_1 = require("firebase-admin/firestore");
|
|
|
40
40
|
const logs_1 = require("../logs");
|
|
41
41
|
const typedFirestore_1 = require("../utils/typedFirestore");
|
|
42
42
|
const buildCancelSubscription = (config, rzp) => {
|
|
43
|
-
return (0, https_1.onCall)(async (request) => {
|
|
43
|
+
return (0, https_1.onCall)({ cors: true }, async (request) => {
|
|
44
44
|
const uid = request.auth?.uid;
|
|
45
45
|
if (!uid) {
|
|
46
46
|
throw new https_1.HttpsError('unauthenticated', 'User must be authenticated to cancel a subscription');
|
|
@@ -82,7 +82,7 @@ const buildCancelSubscription = (config, rzp) => {
|
|
|
82
82
|
};
|
|
83
83
|
exports.buildCancelSubscription = buildCancelSubscription;
|
|
84
84
|
const buildUpdateSubscriptionPlan = (config, rzp) => {
|
|
85
|
-
return (0, https_1.onCall)(async (request) => {
|
|
85
|
+
return (0, https_1.onCall)({ cors: true }, async (request) => {
|
|
86
86
|
const uid = request.auth?.uid;
|
|
87
87
|
if (!uid) {
|
|
88
88
|
throw new https_1.HttpsError('unauthenticated', 'User must be authenticated to update a subscription');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/callables/subscriptions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAiE;AACjE,sDAAwC;AACxC,wDAAsD;AAEtD,kCAA+B;AAE/B,4DAAyD;AAElD,MAAM,uBAAuB,GAAG,CAAC,MAA0B,EAAE,GAAa,EAAE,EAAE;IACjF,OAAO,IAAA,cAAM,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/callables/subscriptions.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -20,11 +20,10 @@ export declare function initializeRazorpay(userConfig: RazorpayUserConfig): {
|
|
|
20
20
|
plan_id: string;
|
|
21
21
|
status: "cancelled" | "active" | "pending" | "created" | "expired" | "authenticated" | "halted" | "completed";
|
|
22
22
|
}>, unknown>;
|
|
23
|
-
createPlan: import("firebase-functions/https").CallableFunction<any, Promise<import("./types").
|
|
23
|
+
createPlan: import("firebase-functions/https").CallableFunction<any, Promise<import("./types").SanitizedPlan>, unknown>;
|
|
24
24
|
syncPlans: import("firebase-functions/https").CallableFunction<any, Promise<{
|
|
25
25
|
status: string;
|
|
26
26
|
count: number;
|
|
27
|
-
productsCount: number;
|
|
28
27
|
}>, unknown>;
|
|
29
28
|
createProduct: import("firebase-functions/https").CallableFunction<import("@neocleus/razorpay-firebase-types").CreateProductRequest, Promise<import("./types").ProductDoc>, unknown>;
|
|
30
29
|
};
|
package/lib/utils/index.d.ts
CHANGED
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
import * as admin from 'firebase-admin';
|
|
2
1
|
import { Plans } from 'razorpay/dist/types/plans';
|
|
3
|
-
import {
|
|
2
|
+
import { SanitizedPlan } from '../types';
|
|
4
3
|
/**
|
|
5
4
|
* Helper to sanitize Razorpay plan data for Firestore storage.
|
|
6
5
|
*/
|
|
7
6
|
export declare const sanitizePlan: (plan: Plans.RazorPayPlans) => SanitizedPlan;
|
|
8
|
-
export declare const generateProductId: (plan: Plans.RazorPayPlans) => string;
|
|
9
|
-
export declare const generatePlanKey: (plan: Plans.RazorPayPlans) => string;
|
|
10
|
-
/**
|
|
11
|
-
* Syncs a Razorpay plan to a Firestore product document.
|
|
12
|
-
* Creates or updates the product document with the plan's details.
|
|
13
|
-
* Shared between buildCreatePlan and buildSyncPlans.
|
|
14
|
-
*/
|
|
15
|
-
export declare const syncPlanToProduct: (plan: Plans.RazorPayPlans, db: admin.firestore.Firestore, config: RazorpaySyncConfig) => Promise<ProductDoc>;
|
package/lib/utils/index.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.sanitizePlan = void 0;
|
|
4
4
|
const firestore_1 = require("firebase-admin/firestore");
|
|
5
|
-
const typedFirestore_1 = require("./typedFirestore");
|
|
6
5
|
/**
|
|
7
6
|
* Helper to sanitize Razorpay plan data for Firestore storage.
|
|
8
7
|
*/
|
|
@@ -25,50 +24,4 @@ const sanitizePlan = (plan) => {
|
|
|
25
24
|
return sanitizedPlan;
|
|
26
25
|
};
|
|
27
26
|
exports.sanitizePlan = sanitizePlan;
|
|
28
|
-
const generateProductId = (plan) => {
|
|
29
|
-
if (plan.notes && plan.notes.productId) {
|
|
30
|
-
return String(plan.notes.productId);
|
|
31
|
-
}
|
|
32
|
-
if (plan.item && plan.item.name) {
|
|
33
|
-
return plan.item.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-+)+/g, '');
|
|
34
|
-
}
|
|
35
|
-
return `prod_${plan.id}`;
|
|
36
|
-
};
|
|
37
|
-
exports.generateProductId = generateProductId;
|
|
38
|
-
const generatePlanKey = (plan) => {
|
|
39
|
-
if (plan.interval > 1) {
|
|
40
|
-
return `${plan.interval}_${plan.period}`;
|
|
41
|
-
}
|
|
42
|
-
return plan.period;
|
|
43
|
-
};
|
|
44
|
-
exports.generatePlanKey = generatePlanKey;
|
|
45
|
-
/**
|
|
46
|
-
* Syncs a Razorpay plan to a Firestore product document.
|
|
47
|
-
* Creates or updates the product document with the plan's details.
|
|
48
|
-
* Shared between buildCreatePlan and buildSyncPlans.
|
|
49
|
-
*/
|
|
50
|
-
const syncPlanToProduct = async (plan, db, config) => {
|
|
51
|
-
const productId = (0, exports.generateProductId)(plan);
|
|
52
|
-
const typedFs = new typedFirestore_1.TypedFirestore(db, config);
|
|
53
|
-
const docRef = typedFs.getProductDoc(productId);
|
|
54
|
-
const productSnap = await docRef.get();
|
|
55
|
-
const productData = productSnap.data() || {
|
|
56
|
-
id: productId,
|
|
57
|
-
name: plan.item?.name || 'Razorpay Product',
|
|
58
|
-
description: plan.item?.description || '',
|
|
59
|
-
active: true,
|
|
60
|
-
created_at: firestore_1.FieldValue.serverTimestamp(),
|
|
61
|
-
};
|
|
62
|
-
productData.planId = plan.id;
|
|
63
|
-
productData.type = 'subscription';
|
|
64
|
-
productData.updated_at = firestore_1.FieldValue.serverTimestamp();
|
|
65
|
-
productData._synced_via = 'admin_api';
|
|
66
|
-
await docRef.set(productData, { merge: true });
|
|
67
|
-
// Save plan to root-level plans collection
|
|
68
|
-
const planRef = typedFs.getPlanDoc(plan.id);
|
|
69
|
-
const planData = (0, exports.sanitizePlan)(plan);
|
|
70
|
-
await planRef.set(planData, { merge: true });
|
|
71
|
-
return productData;
|
|
72
|
-
};
|
|
73
|
-
exports.syncPlanToProduct = syncPlanToProduct;
|
|
74
27
|
//# sourceMappingURL=index.js.map
|
package/lib/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,wDAAsD;AAKtD;;GAEG;AACI,MAAM,YAAY,GAAG,CAAC,IAAyB,EAAiB,EAAE;IACrE,MAAM,aAAa,GAAkB;QACjC,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,IAA2B,CAAC,CAAC,CAAC,IAAI;QAC1D,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACvB,MAAM,EAAE,IAAI,EAAE,wDAAwD;QACtE,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,sBAAU,CAAC,eAAe,EAAE;QACxC,WAAW,EAAE,WAAW;KAC3B,CAAC;IAEF,IAAI,IAAI,CAAC,IAAI,IAAK,IAAI,CAAC,IAA2B,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACtE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,CAAC,IAA2B,CAAC,MAAM,CAAC;IACtE,CAAC;IAED,OAAO,aAAa,CAAC;AACzB,CAAC,CAAC;AAnBW,QAAA,YAAY,gBAmBvB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neocleus/razorpay-firebase-functions",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
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",
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"razorpay": "^2.9.6",
|
|
35
|
-
"@neocleus/razorpay-firebase-types": "^1.0.
|
|
35
|
+
"@neocleus/razorpay-firebase-types": "^1.0.3"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"typescript": "^6.0.3",
|
|
39
39
|
"@types/node": "^25.9.1"
|
|
40
40
|
}
|
|
41
|
-
}
|
|
41
|
+
}
|