@culturefy/shared 1.0.19 → 1.0.20

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.
@@ -4,8 +4,9 @@ exports.__esModule = true;
4
4
  exports.AzureSecretKeysEnum = void 0;
5
5
  // Enum for secret keys
6
6
  let AzureSecretKeysEnum = exports.AzureSecretKeysEnum = /*#__PURE__*/function (AzureSecretKeysEnum) {
7
- // STRIPE_PUBLISHABLE_KEY = "Stripe-Publishable-Key",
8
- AzureSecretKeysEnum["STRIPE_SECRET_KEY"] = "Stripe-secret-key";
7
+ AzureSecretKeysEnum["KEYCLOAK_ADMIN_CLIENT_SECRET"] = "KEYCLOAK-ADMIN-CLIENT-SECRET";
8
+ AzureSecretKeysEnum["KEYCLOAK_ADMIN_CLIENT_ID"] = "KEYCLOAK-ADMIN-CLIENT-ID";
9
+ AzureSecretKeysEnum["KEYCLOAK_BASE_URL"] = "KEYCLOAK-BASE-URL";
9
10
  AzureSecretKeysEnum["STRIPE_PAYMENT_WEBHOOK_SECRET_KEY"] = "Stripe-payment-webhook-secret-key";
10
11
  // in-use
11
12
  AzureSecretKeysEnum["STRIPE_PRODUCT_WEBHOOK_SECRET"] = "Stripe-product-webhook-secret-key";
@@ -14,15 +15,20 @@ let AzureSecretKeysEnum = exports.AzureSecretKeysEnum = /*#__PURE__*/function (A
14
15
  // in-use
15
16
  AzureSecretKeysEnum["EMAIL_SERVICE_URL"] = "Email-Service-Url";
16
17
  // in-use,
17
- AzureSecretKeysEnum["STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY"] = "Stripe-Webhook-Customer-Created-Secret-Key";
18
- // in-use
19
- AzureSecretKeysEnum["DB_CONNECTING_STRING_BILLING"] = "DB-Connecting-String-Billing";
20
- AzureSecretKeysEnum["STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET"] = "stripe-product-sync-webhook-secret-key";
21
- // in-use
18
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_AUTH"] = "DB-CONNECTION-STRING-AUTH";
19
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_USER"] = "DB-CONNECTION-STRING-USER";
20
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_TENANT_BRIDGE"] = "DB-Connecting-String-Tenant-Bridge";
21
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_PAYMENT"] = "DB-CONNECTION-STRING-PAYMENT";
22
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_CORE"] = "DB-CONNECTION-STRING-CORE";
23
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_BILLING"] = "DB-CONNECTION-STRING-BILLING";
24
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_STAGING"] = "DB-CONNECTION-STRING-STAGING";
25
+ AzureSecretKeysEnum["SERVICE_BUS_CONNECTION_STRING"] = "servicebus-connection-string";
22
26
  AzureSecretKeysEnum["STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET"] = "stripe-customer-sync-webhook-secret-key";
23
27
  AzureSecretKeysEnum["STRIPE_INVOICE_SYNC_WEBHOOK_SECRET"] = "stripe-invoice-sync-webhook-secret-key";
28
+ AzureSecretKeysEnum["STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET"] = "stripe-product-sync-webhook-secret-key";
29
+ AzureSecretKeysEnum["STRIPE_SECRET_KEY"] = "Stripe-secret-key";
30
+ AzureSecretKeysEnum["STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY"] = "Stripe-Webhook-Customer-Created-Secret-Key";
24
31
  AzureSecretKeysEnum["STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET"] = "stripe-subscription-sync-webhook-secret-key";
25
- AzureSecretKeysEnum["DB_CONNECTING_STRING_CORE"] = "DB-Connecting-String-Core";
26
32
  return AzureSecretKeysEnum;
27
33
  }({});
28
34
  //# sourceMappingURL=secretKeys.enum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"secretKeys.enum.js","names":["AzureSecretKeysEnum","exports"],"sources":["../../../src/enums/secretKeys.enum.ts"],"sourcesContent":["// Enum for secret keys\nexport enum AzureSecretKeysEnum {\n // STRIPE_PUBLISHABLE_KEY = \"Stripe-Publishable-Key\",\n STRIPE_SECRET_KEY = \"Stripe-secret-key\",\n STRIPE_PAYMENT_WEBHOOK_SECRET_KEY = \"Stripe-payment-webhook-secret-key\", // in-use\n STRIPE_PRODUCT_WEBHOOK_SECRET = \"Stripe-product-webhook-secret-key\", // in-use\n STRIPE_PRICE_WEBHOOK_SECRET = \"Stripe-price-webhook-secret-key\", // in-use\n EMAIL_SERVICE_URL = \"Email-Service-Url\", // in-use,\n STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY = \"Stripe-Webhook-Customer-Created-Secret-Key\",// in-use\n DB_CONNECTING_STRING_BILLING = \"DB-Connecting-String-Billing\",\n STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET = \"stripe-product-sync-webhook-secret-key\",// in-use\n STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET = \"stripe-customer-sync-webhook-secret-key\",\n STRIPE_INVOICE_SYNC_WEBHOOK_SECRET = \"stripe-invoice-sync-webhook-secret-key\",\n STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET = \"stripe-subscription-sync-webhook-secret-key\",\n DB_CONNECTING_STRING_CORE = \"DB-Connecting-String-Core\",\n}\n"],"mappings":";;;;AAAA;AAAA,IACYA,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,0BAAnBA,mBAAmB;EAC7B;EADUA,mBAAmB;EAAnBA,mBAAmB;EAG4C;EAH/DA,mBAAmB;EAIwC;EAJ3DA,mBAAmB;EAKoC;EALvDA,mBAAmB;EAMY;EAN/BA,mBAAmB;EAO6D;EAPhFA,mBAAmB;EAAnBA,mBAAmB;EASiD;EATpEA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"secretKeys.enum.js","names":["AzureSecretKeysEnum","exports"],"sources":["../../../src/enums/secretKeys.enum.ts"],"sourcesContent":["// Enum for secret keys\nexport enum AzureSecretKeysEnum {\n KEYCLOAK_ADMIN_CLIENT_SECRET = \"KEYCLOAK-ADMIN-CLIENT-SECRET\",\n KEYCLOAK_ADMIN_CLIENT_ID = \"KEYCLOAK-ADMIN-CLIENT-ID\",\n KEYCLOAK_BASE_URL = \"KEYCLOAK-BASE-URL\",\n STRIPE_PAYMENT_WEBHOOK_SECRET_KEY = \"Stripe-payment-webhook-secret-key\", // in-use\n STRIPE_PRODUCT_WEBHOOK_SECRET = \"Stripe-product-webhook-secret-key\", // in-use\n STRIPE_PRICE_WEBHOOK_SECRET = \"Stripe-price-webhook-secret-key\", // in-use\n EMAIL_SERVICE_URL = \"Email-Service-Url\", // in-use,\n DB_CONNECTING_STRING_AUTH = \"DB-CONNECTION-STRING-AUTH\",\n DB_CONNECTING_STRING_USER = \"DB-CONNECTION-STRING-USER\",\n DB_CONNECTING_STRING_TENANT_BRIDGE = \"DB-Connecting-String-Tenant-Bridge\",\n DB_CONNECTING_STRING_PAYMENT = \"DB-CONNECTION-STRING-PAYMENT\",\n DB_CONNECTING_STRING_CORE = \"DB-CONNECTION-STRING-CORE\",\n DB_CONNECTING_STRING_BILLING = \"DB-CONNECTION-STRING-BILLING\",\n DB_CONNECTING_STRING_STAGING = \"DB-CONNECTION-STRING-STAGING\",\n SERVICE_BUS_CONNECTION_STRING = \"servicebus-connection-string\",\n STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET = \"stripe-customer-sync-webhook-secret-key\",\n STRIPE_INVOICE_SYNC_WEBHOOK_SECRET = \"stripe-invoice-sync-webhook-secret-key\",\n STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET = \"stripe-product-sync-webhook-secret-key\",\n STRIPE_SECRET_KEY = \"Stripe-secret-key\",\n STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY = \"Stripe-Webhook-Customer-Created-Secret-Key\",\n STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET = \"stripe-subscription-sync-webhook-secret-key\",\n}\n"],"mappings":";;;;AAAA;AAAA,IACYA,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,0BAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAI4C;EAJ/DA,mBAAmB;EAKwC;EAL3DA,mBAAmB;EAMoC;EANvDA,mBAAmB;EAOY;EAP/BA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA","ignoreList":[]}
@@ -19,4 +19,10 @@ Object.keys(_initializers).forEach(function (key) {
19
19
  if (key in exports && exports[key] === _initializers[key]) return;
20
20
  exports[key] = _initializers[key];
21
21
  });
22
+ var _mapper = require("./mapper");
23
+ Object.keys(_mapper).forEach(function (key) {
24
+ if (key === "default" || key === "__esModule") return;
25
+ if (key in exports && exports[key] === _mapper[key]) return;
26
+ exports[key] = _mapper[key];
27
+ });
22
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_secrets","require","Object","keys","forEach","key","exports","_response","_initializers"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';"],"mappings":";;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,QAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,QAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,QAAA,CAAAK,GAAA;AAAA;AACA,IAAAE,SAAA,GAAAN,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAI,SAAA,EAAAH,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAE,SAAA,CAAAF,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAE,SAAA,CAAAF,GAAA;AAAA;AACA,IAAAG,aAAA,GAAAP,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAK,aAAA,EAAAJ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAG,aAAA,CAAAH,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAG,aAAA,CAAAH,GAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_secrets","require","Object","keys","forEach","key","exports","_response","_initializers","_mapper"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';\nexport * from './mapper';"],"mappings":";;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,QAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,QAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,QAAA,CAAAK,GAAA;AAAA;AACA,IAAAE,SAAA,GAAAN,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAI,SAAA,EAAAH,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAE,SAAA,CAAAF,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAE,SAAA,CAAAF,GAAA;AAAA;AACA,IAAAG,aAAA,GAAAP,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAK,aAAA,EAAAJ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAG,aAAA,CAAAH,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAG,aAAA,CAAAH,GAAA;AAAA;AACA,IAAAI,OAAA,GAAAR,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAM,OAAA,EAAAL,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAI,OAAA,CAAAJ,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAI,OAAA,CAAAJ,GAAA;AAAA","ignoreList":[]}
@@ -25,39 +25,67 @@ class Initializers {
25
25
  this.dbConnectionString = dbConnectionString;
26
26
  }
27
27
  async ensureConnection() {
28
- if (_mongoose.default.connection.readyState === 1) {
29
- return _mongoose.default;
28
+ // Check if we already have a connection for this specific connection string
29
+ const existingConnection = Initializers.connections.get(this.dbConnectionString);
30
+ if (existingConnection && existingConnection.connection.readyState === 1) {
31
+ return existingConnection;
30
32
  }
31
- if (!Initializers.connectionPromise) {
32
- this.context.info('Initializing database connection...');
33
- Initializers.connectionPromise = _mongoose.default.connect(this.dbConnectionString, {
33
+
34
+ // Create a new Mongoose instance for this connection string
35
+ this.context.info(`Initializing database connection... ${this.dbConnectionString}`);
36
+ const newMongoose = new _mongoose.default.Mongoose();
37
+ try {
38
+ await newMongoose.connect(this.dbConnectionString, {
34
39
  serverSelectionTimeoutMS: 10000,
35
40
  connectTimeoutMS: 10000,
36
41
  socketTimeoutMS: 45000
37
- }).then(conn => {
38
- this.context.info('✅ MongoDB connected successfully');
39
- this.connectionInitialized = true;
40
- return _mongoose.default;
41
- }).catch(err => {
42
- this.context.error('❌ MongoDB connection error:', {
43
- message: err.message,
44
- name: err.name,
45
- code: err.code,
46
- stack: err.stack
47
- });
48
- Initializers.connectionPromise = null;
49
- this.connectionInitialized = false;
50
- throw new Error(`Failed to connect to MongoDB: ${err.message}`);
51
42
  });
52
- }
53
- try {
54
- return await Initializers.connectionPromise;
55
- } catch (error) {
43
+ this.context.info(`✅ MongoDB connected successfully ${this.dbConnectionString}`);
44
+ this.connectionInitialized = true;
45
+
46
+ // Store the connection for this connection string
47
+ Initializers.connections.set(this.dbConnectionString, newMongoose);
48
+ return newMongoose;
49
+ } catch (err) {
50
+ this.context.error(`❌ MongoDB connection error for ${this.dbConnectionString}`, {
51
+ message: err.message,
52
+ name: err.name,
53
+ code: err.code,
54
+ stack: err.stack
55
+ });
56
56
  this.connectionInitialized = false;
57
- throw error;
57
+ throw new Error(`Failed to connect to MongoDB: ${err.message}`);
58
+ }
59
+ }
60
+ getConnection() {
61
+ return Initializers.connections.get(this.dbConnectionString);
62
+ }
63
+ async forceNewConnection() {
64
+ // Disconnect existing connection if any
65
+ await this.disconnect();
66
+
67
+ // Reset connection state
68
+ this.connectionInitialized = false;
69
+
70
+ // Create a new connection
71
+ return this.ensureConnection();
72
+ }
73
+ async disconnect() {
74
+ const connection = Initializers.connections.get(this.dbConnectionString);
75
+ if (connection) {
76
+ try {
77
+ // Properly close the connection
78
+ await connection.disconnect();
79
+ this.context.info(`✅ Disconnected from database: ${this.dbConnectionString}`);
80
+ } catch (error) {
81
+ this.context.error(`❌ Error disconnecting from database: ${this.dbConnectionString}`, error);
82
+ } finally {
83
+ // Always remove from the connections map
84
+ Initializers.connections.delete(this.dbConnectionString);
85
+ }
58
86
  }
59
87
  }
60
88
  }
61
89
  exports.Initializers = Initializers;
62
- Initializers.connectionPromise = null;
90
+ Initializers.connections = new Map();
63
91
  //# sourceMappingURL=initializers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"initializers.js","names":["_mongoose","_interopRequireDefault","require","e","__esModule","default","WithDb","_target","_propertyKey","descriptor","value","originalMethod","args","ensureConnection","apply","Initializers","constructor","context","dbConnectionString","connectionInitialized","mongoose","connection","readyState","connectionPromise","info","connect","serverSelectionTimeoutMS","connectTimeoutMS","socketTimeoutMS","then","conn","catch","err","error","message","name","code","stack","Error","exports"],"sources":["../../../src/utils/initializers.ts"],"sourcesContent":["import mongoose from \"mongoose\";\nimport { InvocationContext } from \"@azure/functions\";\n\n/**\n * Decorator that ensures MongoDB is connected before the method runs.\n */\nexport function WithDb(\n _target: any,\n _propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<any>>\n): void {\n if (!descriptor.value) return;\n const originalMethod = descriptor.value;\n descriptor.value = async function (this: Initializers, ...args: any[]) {\n await this.ensureConnection();\n return originalMethod.apply(this, args);\n };\n}\n\nexport abstract class Initializers {\n private static connectionPromise: Promise<typeof mongoose> | null = null;\n protected context: InvocationContext;\n protected dbConnectionString: string;\n private connectionInitialized: boolean = false;\n\n constructor(context: InvocationContext, dbConnectionString: string) {\n this.context = context;\n this.dbConnectionString = dbConnectionString;\n }\n\n protected async ensureConnection(): Promise<typeof mongoose> {\n if (mongoose.connection.readyState === 1) {\n return mongoose;\n }\n\n if (!Initializers.connectionPromise) {\n this.context.info('Initializing database connection...');\n Initializers.connectionPromise = mongoose\n .connect(this.dbConnectionString, {\n serverSelectionTimeoutMS: 10000,\n connectTimeoutMS: 10000,\n socketTimeoutMS: 45000,\n })\n .then(conn => {\n this.context.info('✅ MongoDB connected successfully');\n this.connectionInitialized = true;\n return mongoose;\n })\n .catch(err => {\n this.context.error('❌ MongoDB connection error:', {\n message: err.message,\n name: err.name,\n code: err.code,\n stack: err.stack\n });\n Initializers.connectionPromise = null;\n this.connectionInitialized = false;\n throw new Error(`Failed to connect to MongoDB: ${err.message}`);\n });\n }\n\n try {\n return await Initializers.connectionPromise;\n } catch (error) {\n this.connectionInitialized = false;\n throw error;\n }\n }\n}\n"],"mappings":";;;;;AAAA,IAAAA,SAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAgC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGhC;AACA;AACA;AACO,SAASG,MAAMA,CACpBC,OAAY,EACZC,YAA6B,EAC7BC,UAAqE,EAC/D;EACN,IAAI,CAACA,UAAU,CAACC,KAAK,EAAE;EACvB,MAAMC,cAAc,GAAGF,UAAU,CAACC,KAAK;EACvCD,UAAU,CAACC,KAAK,GAAG,gBAAoC,GAAGE,IAAW,EAAE;IACrE,MAAM,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC7B,OAAOF,cAAc,CAACG,KAAK,CAAC,IAAI,EAAEF,IAAI,CAAC;EACzC,CAAC;AACH;AAEO,MAAeG,YAAY,CAAC;EAMjCC,WAAWA,CAACC,OAA0B,EAAEC,kBAA0B,EAAE;IAAA,KAJ1DD,OAAO;IAAA,KACPC,kBAAkB;IAAA,KACpBC,qBAAqB,GAAY,KAAK;IAG5C,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,kBAAkB,GAAGA,kBAAkB;EAC9C;EAEA,MAAgBL,gBAAgBA,CAAA,EAA6B;IAC3D,IAAIO,iBAAQ,CAACC,UAAU,CAACC,UAAU,KAAK,CAAC,EAAE;MACxC,OAAOF,iBAAQ;IACjB;IAEA,IAAI,CAACL,YAAY,CAACQ,iBAAiB,EAAE;MACnC,IAAI,CAACN,OAAO,CAACO,IAAI,CAAC,qCAAqC,CAAC;MACxDT,YAAY,CAACQ,iBAAiB,GAAGH,iBAAQ,CACtCK,OAAO,CAAC,IAAI,CAACP,kBAAkB,EAAE;QAChCQ,wBAAwB,EAAE,KAAK;QAC/BC,gBAAgB,EAAE,KAAK;QACvBC,eAAe,EAAE;MACnB,CAAC,CAAC,CACDC,IAAI,CAACC,IAAI,IAAI;QACZ,IAAI,CAACb,OAAO,CAACO,IAAI,CAAC,kCAAkC,CAAC;QACrD,IAAI,CAACL,qBAAqB,GAAG,IAAI;QACjC,OAAOC,iBAAQ;MACjB,CAAC,CAAC,CACDW,KAAK,CAACC,GAAG,IAAI;QACZ,IAAI,CAACf,OAAO,CAACgB,KAAK,CAAC,6BAA6B,EAAE;UAChDC,OAAO,EAAEF,GAAG,CAACE,OAAO;UACpBC,IAAI,EAAEH,GAAG,CAACG,IAAI;UACdC,IAAI,EAAEJ,GAAG,CAACI,IAAI;UACdC,KAAK,EAAEL,GAAG,CAACK;QACb,CAAC,CAAC;QACFtB,YAAY,CAACQ,iBAAiB,GAAG,IAAI;QACrC,IAAI,CAACJ,qBAAqB,GAAG,KAAK;QAClC,MAAM,IAAImB,KAAK,CAAC,iCAAiCN,GAAG,CAACE,OAAO,EAAE,CAAC;MACjE,CAAC,CAAC;IACN;IAEA,IAAI;MACF,OAAO,MAAMnB,YAAY,CAACQ,iBAAiB;IAC7C,CAAC,CAAC,OAAOU,KAAK,EAAE;MACd,IAAI,CAACd,qBAAqB,GAAG,KAAK;MAClC,MAAMc,KAAK;IACb;EACF;AACF;AAACM,OAAA,CAAAxB,YAAA,GAAAA,YAAA;AAjDqBA,YAAY,CACjBQ,iBAAiB,GAAoC,IAAI","ignoreList":[]}
1
+ {"version":3,"file":"initializers.js","names":["_mongoose","_interopRequireDefault","require","e","__esModule","default","WithDb","_target","_propertyKey","descriptor","value","originalMethod","args","ensureConnection","apply","Initializers","constructor","context","dbConnectionString","connectionInitialized","existingConnection","connections","get","connection","readyState","info","newMongoose","mongoose","Mongoose","connect","serverSelectionTimeoutMS","connectTimeoutMS","socketTimeoutMS","set","err","error","message","name","code","stack","Error","getConnection","forceNewConnection","disconnect","delete","exports","Map"],"sources":["../../../src/utils/initializers.ts"],"sourcesContent":["import mongoose from \"mongoose\";\nimport { InvocationContext } from \"@azure/functions\";\n\n/**\n * Decorator that ensures MongoDB is connected before the method runs.\n */\nexport function WithDb(\n _target: any,\n _propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<any>>\n): void {\n if (!descriptor.value) return;\n const originalMethod = descriptor.value;\n descriptor.value = async function (this: Initializers, ...args: any[]) {\n await this.ensureConnection();\n return originalMethod.apply(this, args);\n };\n}\n\nexport abstract class Initializers {\n protected static connections: Map<string, mongoose.Mongoose> = new Map();\n protected context: InvocationContext;\n protected dbConnectionString: string;\n private connectionInitialized: boolean = false;\n\n constructor(context: InvocationContext, dbConnectionString: string) {\n this.context = context;\n this.dbConnectionString = dbConnectionString;\n }\n\n protected async ensureConnection(): Promise<mongoose.Mongoose> {\n // Check if we already have a connection for this specific connection string\n const existingConnection = Initializers.connections.get(this.dbConnectionString);\n if (existingConnection && existingConnection.connection.readyState === 1) {\n return existingConnection;\n }\n\n // Create a new Mongoose instance for this connection string\n this.context.info(`Initializing database connection... ${this.dbConnectionString}`);\n const newMongoose = new mongoose.Mongoose();\n \n try {\n await newMongoose.connect(this.dbConnectionString, {\n serverSelectionTimeoutMS: 10000,\n connectTimeoutMS: 10000,\n socketTimeoutMS: 45000,\n });\n \n this.context.info(`✅ MongoDB connected successfully ${this.dbConnectionString}`);\n this.connectionInitialized = true;\n \n // Store the connection for this connection string\n Initializers.connections.set(this.dbConnectionString, newMongoose);\n \n return newMongoose;\n } catch (err: any) {\n this.context.error(`❌ MongoDB connection error for ${this.dbConnectionString}`, {\n message: err.message,\n name: err.name,\n code: err.code,\n stack: err.stack\n });\n this.connectionInitialized = false;\n throw new Error(`Failed to connect to MongoDB: ${err.message}`);\n }\n }\n\n protected getConnection(): mongoose.Mongoose | undefined {\n return Initializers.connections.get(this.dbConnectionString);\n }\n\n async forceNewConnection(): Promise<mongoose.Mongoose> {\n // Disconnect existing connection if any\n await this.disconnect();\n \n // Reset connection state\n this.connectionInitialized = false;\n \n // Create a new connection\n return this.ensureConnection();\n }\n \n async disconnect(): Promise<void> {\n const connection = Initializers.connections.get(this.dbConnectionString);\n if (connection) {\n try {\n // Properly close the connection\n await connection.disconnect();\n this.context.info(`✅ Disconnected from database: ${this.dbConnectionString}`);\n } catch (error) {\n this.context.error(`❌ Error disconnecting from database: ${this.dbConnectionString}`, error);\n } finally {\n // Always remove from the connections map\n Initializers.connections.delete(this.dbConnectionString);\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,8 @@
1
1
  // Enum for secret keys
2
2
  export let AzureSecretKeysEnum = /*#__PURE__*/function (AzureSecretKeysEnum) {
3
- // STRIPE_PUBLISHABLE_KEY = "Stripe-Publishable-Key",
4
- AzureSecretKeysEnum["STRIPE_SECRET_KEY"] = "Stripe-secret-key";
3
+ AzureSecretKeysEnum["KEYCLOAK_ADMIN_CLIENT_SECRET"] = "KEYCLOAK-ADMIN-CLIENT-SECRET";
4
+ AzureSecretKeysEnum["KEYCLOAK_ADMIN_CLIENT_ID"] = "KEYCLOAK-ADMIN-CLIENT-ID";
5
+ AzureSecretKeysEnum["KEYCLOAK_BASE_URL"] = "KEYCLOAK-BASE-URL";
5
6
  AzureSecretKeysEnum["STRIPE_PAYMENT_WEBHOOK_SECRET_KEY"] = "Stripe-payment-webhook-secret-key";
6
7
  // in-use
7
8
  AzureSecretKeysEnum["STRIPE_PRODUCT_WEBHOOK_SECRET"] = "Stripe-product-webhook-secret-key";
@@ -10,15 +11,20 @@ export let AzureSecretKeysEnum = /*#__PURE__*/function (AzureSecretKeysEnum) {
10
11
  // in-use
11
12
  AzureSecretKeysEnum["EMAIL_SERVICE_URL"] = "Email-Service-Url";
12
13
  // in-use,
13
- AzureSecretKeysEnum["STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY"] = "Stripe-Webhook-Customer-Created-Secret-Key";
14
- // in-use
15
- AzureSecretKeysEnum["DB_CONNECTING_STRING_BILLING"] = "DB-Connecting-String-Billing";
16
- AzureSecretKeysEnum["STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET"] = "stripe-product-sync-webhook-secret-key";
17
- // in-use
14
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_AUTH"] = "DB-CONNECTION-STRING-AUTH";
15
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_USER"] = "DB-CONNECTION-STRING-USER";
16
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_TENANT_BRIDGE"] = "DB-Connecting-String-Tenant-Bridge";
17
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_PAYMENT"] = "DB-CONNECTION-STRING-PAYMENT";
18
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_CORE"] = "DB-CONNECTION-STRING-CORE";
19
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_BILLING"] = "DB-CONNECTION-STRING-BILLING";
20
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_STAGING"] = "DB-CONNECTION-STRING-STAGING";
21
+ AzureSecretKeysEnum["SERVICE_BUS_CONNECTION_STRING"] = "servicebus-connection-string";
18
22
  AzureSecretKeysEnum["STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET"] = "stripe-customer-sync-webhook-secret-key";
19
23
  AzureSecretKeysEnum["STRIPE_INVOICE_SYNC_WEBHOOK_SECRET"] = "stripe-invoice-sync-webhook-secret-key";
24
+ AzureSecretKeysEnum["STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET"] = "stripe-product-sync-webhook-secret-key";
25
+ AzureSecretKeysEnum["STRIPE_SECRET_KEY"] = "Stripe-secret-key";
26
+ AzureSecretKeysEnum["STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY"] = "Stripe-Webhook-Customer-Created-Secret-Key";
20
27
  AzureSecretKeysEnum["STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET"] = "stripe-subscription-sync-webhook-secret-key";
21
- AzureSecretKeysEnum["DB_CONNECTING_STRING_CORE"] = "DB-Connecting-String-Core";
22
28
  return AzureSecretKeysEnum;
23
29
  }({});
24
30
  //# sourceMappingURL=secretKeys.enum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"secretKeys.enum.js","names":["AzureSecretKeysEnum"],"sources":["../../../src/enums/secretKeys.enum.ts"],"sourcesContent":["// Enum for secret keys\nexport enum AzureSecretKeysEnum {\n // STRIPE_PUBLISHABLE_KEY = \"Stripe-Publishable-Key\",\n STRIPE_SECRET_KEY = \"Stripe-secret-key\",\n STRIPE_PAYMENT_WEBHOOK_SECRET_KEY = \"Stripe-payment-webhook-secret-key\", // in-use\n STRIPE_PRODUCT_WEBHOOK_SECRET = \"Stripe-product-webhook-secret-key\", // in-use\n STRIPE_PRICE_WEBHOOK_SECRET = \"Stripe-price-webhook-secret-key\", // in-use\n EMAIL_SERVICE_URL = \"Email-Service-Url\", // in-use,\n STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY = \"Stripe-Webhook-Customer-Created-Secret-Key\",// in-use\n DB_CONNECTING_STRING_BILLING = \"DB-Connecting-String-Billing\",\n STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET = \"stripe-product-sync-webhook-secret-key\",// in-use\n STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET = \"stripe-customer-sync-webhook-secret-key\",\n STRIPE_INVOICE_SYNC_WEBHOOK_SECRET = \"stripe-invoice-sync-webhook-secret-key\",\n STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET = \"stripe-subscription-sync-webhook-secret-key\",\n DB_CONNECTING_STRING_CORE = \"DB-Connecting-String-Core\",\n}\n"],"mappings":"AAAA;AACA,WAAYA,mBAAmB,0BAAnBA,mBAAmB;EAC7B;EADUA,mBAAmB;EAAnBA,mBAAmB;EAG4C;EAH/DA,mBAAmB;EAIwC;EAJ3DA,mBAAmB;EAKoC;EALvDA,mBAAmB;EAMY;EAN/BA,mBAAmB;EAO6D;EAPhFA,mBAAmB;EAAnBA,mBAAmB;EASiD;EATpEA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"secretKeys.enum.js","names":["AzureSecretKeysEnum"],"sources":["../../../src/enums/secretKeys.enum.ts"],"sourcesContent":["// Enum for secret keys\nexport enum AzureSecretKeysEnum {\n KEYCLOAK_ADMIN_CLIENT_SECRET = \"KEYCLOAK-ADMIN-CLIENT-SECRET\",\n KEYCLOAK_ADMIN_CLIENT_ID = \"KEYCLOAK-ADMIN-CLIENT-ID\",\n KEYCLOAK_BASE_URL = \"KEYCLOAK-BASE-URL\",\n STRIPE_PAYMENT_WEBHOOK_SECRET_KEY = \"Stripe-payment-webhook-secret-key\", // in-use\n STRIPE_PRODUCT_WEBHOOK_SECRET = \"Stripe-product-webhook-secret-key\", // in-use\n STRIPE_PRICE_WEBHOOK_SECRET = \"Stripe-price-webhook-secret-key\", // in-use\n EMAIL_SERVICE_URL = \"Email-Service-Url\", // in-use,\n DB_CONNECTING_STRING_AUTH = \"DB-CONNECTION-STRING-AUTH\",\n DB_CONNECTING_STRING_USER = \"DB-CONNECTION-STRING-USER\",\n DB_CONNECTING_STRING_TENANT_BRIDGE = \"DB-Connecting-String-Tenant-Bridge\",\n DB_CONNECTING_STRING_PAYMENT = \"DB-CONNECTION-STRING-PAYMENT\",\n DB_CONNECTING_STRING_CORE = \"DB-CONNECTION-STRING-CORE\",\n DB_CONNECTING_STRING_BILLING = \"DB-CONNECTION-STRING-BILLING\",\n DB_CONNECTING_STRING_STAGING = \"DB-CONNECTION-STRING-STAGING\",\n SERVICE_BUS_CONNECTION_STRING = \"servicebus-connection-string\",\n STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET = \"stripe-customer-sync-webhook-secret-key\",\n STRIPE_INVOICE_SYNC_WEBHOOK_SECRET = \"stripe-invoice-sync-webhook-secret-key\",\n STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET = \"stripe-product-sync-webhook-secret-key\",\n STRIPE_SECRET_KEY = \"Stripe-secret-key\",\n STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY = \"Stripe-Webhook-Customer-Created-Secret-Key\",\n STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET = \"stripe-subscription-sync-webhook-secret-key\",\n}\n"],"mappings":"AAAA;AACA,WAAYA,mBAAmB,0BAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAI4C;EAJ/DA,mBAAmB;EAKwC;EAL3DA,mBAAmB;EAMoC;EANvDA,mBAAmB;EAOY;EAP/BA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  export * from './secrets';
2
2
  export * from './response';
3
3
  export * from './initializers';
4
+ export * from './mapper';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,gBAAgB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';\nexport * from './mapper';"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,gBAAgB;AAC9B,cAAc,UAAU","ignoreList":[]}
@@ -19,38 +19,66 @@ export class Initializers {
19
19
  this.dbConnectionString = dbConnectionString;
20
20
  }
21
21
  async ensureConnection() {
22
- if (mongoose.connection.readyState === 1) {
23
- return mongoose;
22
+ // Check if we already have a connection for this specific connection string
23
+ const existingConnection = Initializers.connections.get(this.dbConnectionString);
24
+ if (existingConnection && existingConnection.connection.readyState === 1) {
25
+ return existingConnection;
24
26
  }
25
- if (!Initializers.connectionPromise) {
26
- this.context.info('Initializing database connection...');
27
- Initializers.connectionPromise = mongoose.connect(this.dbConnectionString, {
27
+
28
+ // Create a new Mongoose instance for this connection string
29
+ this.context.info(`Initializing database connection... ${this.dbConnectionString}`);
30
+ const newMongoose = new mongoose.Mongoose();
31
+ try {
32
+ await newMongoose.connect(this.dbConnectionString, {
28
33
  serverSelectionTimeoutMS: 10000,
29
34
  connectTimeoutMS: 10000,
30
35
  socketTimeoutMS: 45000
31
- }).then(conn => {
32
- this.context.info('✅ MongoDB connected successfully');
33
- this.connectionInitialized = true;
34
- return mongoose;
35
- }).catch(err => {
36
- this.context.error('❌ MongoDB connection error:', {
37
- message: err.message,
38
- name: err.name,
39
- code: err.code,
40
- stack: err.stack
41
- });
42
- Initializers.connectionPromise = null;
43
- this.connectionInitialized = false;
44
- throw new Error(`Failed to connect to MongoDB: ${err.message}`);
45
36
  });
46
- }
47
- try {
48
- return await Initializers.connectionPromise;
49
- } catch (error) {
37
+ this.context.info(`✅ MongoDB connected successfully ${this.dbConnectionString}`);
38
+ this.connectionInitialized = true;
39
+
40
+ // Store the connection for this connection string
41
+ Initializers.connections.set(this.dbConnectionString, newMongoose);
42
+ return newMongoose;
43
+ } catch (err) {
44
+ this.context.error(`❌ MongoDB connection error for ${this.dbConnectionString}`, {
45
+ message: err.message,
46
+ name: err.name,
47
+ code: err.code,
48
+ stack: err.stack
49
+ });
50
50
  this.connectionInitialized = false;
51
- throw error;
51
+ throw new Error(`Failed to connect to MongoDB: ${err.message}`);
52
+ }
53
+ }
54
+ getConnection() {
55
+ return Initializers.connections.get(this.dbConnectionString);
56
+ }
57
+ async forceNewConnection() {
58
+ // Disconnect existing connection if any
59
+ await this.disconnect();
60
+
61
+ // Reset connection state
62
+ this.connectionInitialized = false;
63
+
64
+ // Create a new connection
65
+ return this.ensureConnection();
66
+ }
67
+ async disconnect() {
68
+ const connection = Initializers.connections.get(this.dbConnectionString);
69
+ if (connection) {
70
+ try {
71
+ // Properly close the connection
72
+ await connection.disconnect();
73
+ this.context.info(`✅ Disconnected from database: ${this.dbConnectionString}`);
74
+ } catch (error) {
75
+ this.context.error(`❌ Error disconnecting from database: ${this.dbConnectionString}`, error);
76
+ } finally {
77
+ // Always remove from the connections map
78
+ Initializers.connections.delete(this.dbConnectionString);
79
+ }
52
80
  }
53
81
  }
54
82
  }
55
- Initializers.connectionPromise = null;
83
+ Initializers.connections = new Map();
56
84
  //# sourceMappingURL=initializers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"initializers.js","names":["mongoose","WithDb","_target","_propertyKey","descriptor","value","originalMethod","args","ensureConnection","apply","Initializers","constructor","context","dbConnectionString","connectionInitialized","connection","readyState","connectionPromise","info","connect","serverSelectionTimeoutMS","connectTimeoutMS","socketTimeoutMS","then","conn","catch","err","error","message","name","code","stack","Error"],"sources":["../../../src/utils/initializers.ts"],"sourcesContent":["import mongoose from \"mongoose\";\nimport { InvocationContext } from \"@azure/functions\";\n\n/**\n * Decorator that ensures MongoDB is connected before the method runs.\n */\nexport function WithDb(\n _target: any,\n _propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<any>>\n): void {\n if (!descriptor.value) return;\n const originalMethod = descriptor.value;\n descriptor.value = async function (this: Initializers, ...args: any[]) {\n await this.ensureConnection();\n return originalMethod.apply(this, args);\n };\n}\n\nexport abstract class Initializers {\n private static connectionPromise: Promise<typeof mongoose> | null = null;\n protected context: InvocationContext;\n protected dbConnectionString: string;\n private connectionInitialized: boolean = false;\n\n constructor(context: InvocationContext, dbConnectionString: string) {\n this.context = context;\n this.dbConnectionString = dbConnectionString;\n }\n\n protected async ensureConnection(): Promise<typeof mongoose> {\n if (mongoose.connection.readyState === 1) {\n return mongoose;\n }\n\n if (!Initializers.connectionPromise) {\n this.context.info('Initializing database connection...');\n Initializers.connectionPromise = mongoose\n .connect(this.dbConnectionString, {\n serverSelectionTimeoutMS: 10000,\n connectTimeoutMS: 10000,\n socketTimeoutMS: 45000,\n })\n .then(conn => {\n this.context.info('✅ MongoDB connected successfully');\n this.connectionInitialized = true;\n return mongoose;\n })\n .catch(err => {\n this.context.error('❌ MongoDB connection error:', {\n message: err.message,\n name: err.name,\n code: err.code,\n stack: err.stack\n });\n Initializers.connectionPromise = null;\n this.connectionInitialized = false;\n throw new Error(`Failed to connect to MongoDB: ${err.message}`);\n });\n }\n\n try {\n return await Initializers.connectionPromise;\n } catch (error) {\n this.connectionInitialized = false;\n throw error;\n }\n }\n}\n"],"mappings":"AAAA,OAAOA,QAAQ,MAAM,UAAU;AAG/B;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CACpBC,OAAY,EACZC,YAA6B,EAC7BC,UAAqE,EAC/D;EACN,IAAI,CAACA,UAAU,CAACC,KAAK,EAAE;EACvB,MAAMC,cAAc,GAAGF,UAAU,CAACC,KAAK;EACvCD,UAAU,CAACC,KAAK,GAAG,gBAAoC,GAAGE,IAAW,EAAE;IACrE,MAAM,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC7B,OAAOF,cAAc,CAACG,KAAK,CAAC,IAAI,EAAEF,IAAI,CAAC;EACzC,CAAC;AACH;AAEA,OAAO,MAAeG,YAAY,CAAC;EAMjCC,WAAWA,CAACC,OAA0B,EAAEC,kBAA0B,EAAE;IAAA,KAJ1DD,OAAO;IAAA,KACPC,kBAAkB;IAAA,KACpBC,qBAAqB,GAAY,KAAK;IAG5C,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,kBAAkB,GAAGA,kBAAkB;EAC9C;EAEA,MAAgBL,gBAAgBA,CAAA,EAA6B;IAC3D,IAAIR,QAAQ,CAACe,UAAU,CAACC,UAAU,KAAK,CAAC,EAAE;MACxC,OAAOhB,QAAQ;IACjB;IAEA,IAAI,CAACU,YAAY,CAACO,iBAAiB,EAAE;MACnC,IAAI,CAACL,OAAO,CAACM,IAAI,CAAC,qCAAqC,CAAC;MACxDR,YAAY,CAACO,iBAAiB,GAAGjB,QAAQ,CACtCmB,OAAO,CAAC,IAAI,CAACN,kBAAkB,EAAE;QAChCO,wBAAwB,EAAE,KAAK;QAC/BC,gBAAgB,EAAE,KAAK;QACvBC,eAAe,EAAE;MACnB,CAAC,CAAC,CACDC,IAAI,CAACC,IAAI,IAAI;QACZ,IAAI,CAACZ,OAAO,CAACM,IAAI,CAAC,kCAAkC,CAAC;QACrD,IAAI,CAACJ,qBAAqB,GAAG,IAAI;QACjC,OAAOd,QAAQ;MACjB,CAAC,CAAC,CACDyB,KAAK,CAACC,GAAG,IAAI;QACZ,IAAI,CAACd,OAAO,CAACe,KAAK,CAAC,6BAA6B,EAAE;UAChDC,OAAO,EAAEF,GAAG,CAACE,OAAO;UACpBC,IAAI,EAAEH,GAAG,CAACG,IAAI;UACdC,IAAI,EAAEJ,GAAG,CAACI,IAAI;UACdC,KAAK,EAAEL,GAAG,CAACK;QACb,CAAC,CAAC;QACFrB,YAAY,CAACO,iBAAiB,GAAG,IAAI;QACrC,IAAI,CAACH,qBAAqB,GAAG,KAAK;QAClC,MAAM,IAAIkB,KAAK,CAAC,iCAAiCN,GAAG,CAACE,OAAO,EAAE,CAAC;MACjE,CAAC,CAAC;IACN;IAEA,IAAI;MACF,OAAO,MAAMlB,YAAY,CAACO,iBAAiB;IAC7C,CAAC,CAAC,OAAOU,KAAK,EAAE;MACd,IAAI,CAACb,qBAAqB,GAAG,KAAK;MAClC,MAAMa,KAAK;IACb;EACF;AACF;AAjDsBjB,YAAY,CACjBO,iBAAiB,GAAoC,IAAI","ignoreList":[]}
1
+ {"version":3,"file":"initializers.js","names":["mongoose","WithDb","_target","_propertyKey","descriptor","value","originalMethod","args","ensureConnection","apply","Initializers","constructor","context","dbConnectionString","connectionInitialized","existingConnection","connections","get","connection","readyState","info","newMongoose","Mongoose","connect","serverSelectionTimeoutMS","connectTimeoutMS","socketTimeoutMS","set","err","error","message","name","code","stack","Error","getConnection","forceNewConnection","disconnect","delete","Map"],"sources":["../../../src/utils/initializers.ts"],"sourcesContent":["import mongoose from \"mongoose\";\nimport { InvocationContext } from \"@azure/functions\";\n\n/**\n * Decorator that ensures MongoDB is connected before the method runs.\n */\nexport function WithDb(\n _target: any,\n _propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<any>>\n): void {\n if (!descriptor.value) return;\n const originalMethod = descriptor.value;\n descriptor.value = async function (this: Initializers, ...args: any[]) {\n await this.ensureConnection();\n return originalMethod.apply(this, args);\n };\n}\n\nexport abstract class Initializers {\n protected static connections: Map<string, mongoose.Mongoose> = new Map();\n protected context: InvocationContext;\n protected dbConnectionString: string;\n private connectionInitialized: boolean = false;\n\n constructor(context: InvocationContext, dbConnectionString: string) {\n this.context = context;\n this.dbConnectionString = dbConnectionString;\n }\n\n protected async ensureConnection(): Promise<mongoose.Mongoose> {\n // Check if we already have a connection for this specific connection string\n const existingConnection = Initializers.connections.get(this.dbConnectionString);\n if (existingConnection && existingConnection.connection.readyState === 1) {\n return existingConnection;\n }\n\n // Create a new Mongoose instance for this connection string\n this.context.info(`Initializing database connection... ${this.dbConnectionString}`);\n const newMongoose = new mongoose.Mongoose();\n \n try {\n await newMongoose.connect(this.dbConnectionString, {\n serverSelectionTimeoutMS: 10000,\n connectTimeoutMS: 10000,\n socketTimeoutMS: 45000,\n });\n \n this.context.info(`✅ MongoDB connected successfully ${this.dbConnectionString}`);\n this.connectionInitialized = true;\n \n // Store the connection for this connection string\n Initializers.connections.set(this.dbConnectionString, newMongoose);\n \n return newMongoose;\n } catch (err: any) {\n this.context.error(`❌ MongoDB connection error for ${this.dbConnectionString}`, {\n message: err.message,\n name: err.name,\n code: err.code,\n stack: err.stack\n });\n this.connectionInitialized = false;\n throw new Error(`Failed to connect to MongoDB: ${err.message}`);\n }\n }\n\n protected getConnection(): mongoose.Mongoose | undefined {\n return Initializers.connections.get(this.dbConnectionString);\n }\n\n async forceNewConnection(): Promise<mongoose.Mongoose> {\n // Disconnect existing connection if any\n await this.disconnect();\n \n // Reset connection state\n this.connectionInitialized = false;\n \n // Create a new connection\n return this.ensureConnection();\n }\n \n async disconnect(): Promise<void> {\n const connection = Initializers.connections.get(this.dbConnectionString);\n if (connection) {\n try {\n // Properly close the connection\n await connection.disconnect();\n this.context.info(`✅ Disconnected from database: ${this.dbConnectionString}`);\n } catch (error) {\n this.context.error(`❌ Error disconnecting from database: ${this.dbConnectionString}`, error);\n } finally {\n // Always remove from the connections map\n Initializers.connections.delete(this.dbConnectionString);\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@culturefy/shared",
3
3
  "description": "Shared utilities for culturefy serverless services",
4
- "version": "1.0.19",
4
+ "version": "1.0.20",
5
5
  "main": "build/cjs/index.js",
6
6
  "module": "build/esm/index.js",
7
7
  "types": "build/src/index.d.ts",
@@ -1,14 +1,23 @@
1
1
  export declare enum AzureSecretKeysEnum {
2
- STRIPE_SECRET_KEY = "Stripe-secret-key",
2
+ KEYCLOAK_ADMIN_CLIENT_SECRET = "KEYCLOAK-ADMIN-CLIENT-SECRET",
3
+ KEYCLOAK_ADMIN_CLIENT_ID = "KEYCLOAK-ADMIN-CLIENT-ID",
4
+ KEYCLOAK_BASE_URL = "KEYCLOAK-BASE-URL",
3
5
  STRIPE_PAYMENT_WEBHOOK_SECRET_KEY = "Stripe-payment-webhook-secret-key",// in-use
4
6
  STRIPE_PRODUCT_WEBHOOK_SECRET = "Stripe-product-webhook-secret-key",// in-use
5
7
  STRIPE_PRICE_WEBHOOK_SECRET = "Stripe-price-webhook-secret-key",// in-use
6
8
  EMAIL_SERVICE_URL = "Email-Service-Url",// in-use,
7
- STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY = "Stripe-Webhook-Customer-Created-Secret-Key",// in-use
8
- DB_CONNECTING_STRING_BILLING = "DB-Connecting-String-Billing",
9
- STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET = "stripe-product-sync-webhook-secret-key",// in-use
9
+ DB_CONNECTING_STRING_AUTH = "DB-CONNECTION-STRING-AUTH",
10
+ DB_CONNECTING_STRING_USER = "DB-CONNECTION-STRING-USER",
11
+ DB_CONNECTING_STRING_TENANT_BRIDGE = "DB-Connecting-String-Tenant-Bridge",
12
+ DB_CONNECTING_STRING_PAYMENT = "DB-CONNECTION-STRING-PAYMENT",
13
+ DB_CONNECTING_STRING_CORE = "DB-CONNECTION-STRING-CORE",
14
+ DB_CONNECTING_STRING_BILLING = "DB-CONNECTION-STRING-BILLING",
15
+ DB_CONNECTING_STRING_STAGING = "DB-CONNECTION-STRING-STAGING",
16
+ SERVICE_BUS_CONNECTION_STRING = "servicebus-connection-string",
10
17
  STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET = "stripe-customer-sync-webhook-secret-key",
11
18
  STRIPE_INVOICE_SYNC_WEBHOOK_SECRET = "stripe-invoice-sync-webhook-secret-key",
12
- STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET = "stripe-subscription-sync-webhook-secret-key",
13
- DB_CONNECTING_STRING_CORE = "DB-Connecting-String-Core"
19
+ STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET = "stripe-product-sync-webhook-secret-key",
20
+ STRIPE_SECRET_KEY = "Stripe-secret-key",
21
+ STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY = "Stripe-Webhook-Customer-Created-Secret-Key",
22
+ STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET = "stripe-subscription-sync-webhook-secret-key"
14
23
  }
@@ -4,18 +4,26 @@ exports.AzureSecretKeysEnum = void 0;
4
4
  // Enum for secret keys
5
5
  var AzureSecretKeysEnum;
6
6
  (function (AzureSecretKeysEnum) {
7
- // STRIPE_PUBLISHABLE_KEY = "Stripe-Publishable-Key",
8
- AzureSecretKeysEnum["STRIPE_SECRET_KEY"] = "Stripe-secret-key";
7
+ AzureSecretKeysEnum["KEYCLOAK_ADMIN_CLIENT_SECRET"] = "KEYCLOAK-ADMIN-CLIENT-SECRET";
8
+ AzureSecretKeysEnum["KEYCLOAK_ADMIN_CLIENT_ID"] = "KEYCLOAK-ADMIN-CLIENT-ID";
9
+ AzureSecretKeysEnum["KEYCLOAK_BASE_URL"] = "KEYCLOAK-BASE-URL";
9
10
  AzureSecretKeysEnum["STRIPE_PAYMENT_WEBHOOK_SECRET_KEY"] = "Stripe-payment-webhook-secret-key";
10
11
  AzureSecretKeysEnum["STRIPE_PRODUCT_WEBHOOK_SECRET"] = "Stripe-product-webhook-secret-key";
11
12
  AzureSecretKeysEnum["STRIPE_PRICE_WEBHOOK_SECRET"] = "Stripe-price-webhook-secret-key";
12
13
  AzureSecretKeysEnum["EMAIL_SERVICE_URL"] = "Email-Service-Url";
13
- AzureSecretKeysEnum["STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY"] = "Stripe-Webhook-Customer-Created-Secret-Key";
14
- AzureSecretKeysEnum["DB_CONNECTING_STRING_BILLING"] = "DB-Connecting-String-Billing";
15
- AzureSecretKeysEnum["STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET"] = "stripe-product-sync-webhook-secret-key";
14
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_AUTH"] = "DB-CONNECTION-STRING-AUTH";
15
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_USER"] = "DB-CONNECTION-STRING-USER";
16
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_TENANT_BRIDGE"] = "DB-Connecting-String-Tenant-Bridge";
17
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_PAYMENT"] = "DB-CONNECTION-STRING-PAYMENT";
18
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_CORE"] = "DB-CONNECTION-STRING-CORE";
19
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_BILLING"] = "DB-CONNECTION-STRING-BILLING";
20
+ AzureSecretKeysEnum["DB_CONNECTING_STRING_STAGING"] = "DB-CONNECTION-STRING-STAGING";
21
+ AzureSecretKeysEnum["SERVICE_BUS_CONNECTION_STRING"] = "servicebus-connection-string";
16
22
  AzureSecretKeysEnum["STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET"] = "stripe-customer-sync-webhook-secret-key";
17
23
  AzureSecretKeysEnum["STRIPE_INVOICE_SYNC_WEBHOOK_SECRET"] = "stripe-invoice-sync-webhook-secret-key";
24
+ AzureSecretKeysEnum["STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET"] = "stripe-product-sync-webhook-secret-key";
25
+ AzureSecretKeysEnum["STRIPE_SECRET_KEY"] = "Stripe-secret-key";
26
+ AzureSecretKeysEnum["STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY"] = "Stripe-Webhook-Customer-Created-Secret-Key";
18
27
  AzureSecretKeysEnum["STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET"] = "stripe-subscription-sync-webhook-secret-key";
19
- AzureSecretKeysEnum["DB_CONNECTING_STRING_CORE"] = "DB-Connecting-String-Core";
20
28
  })(AzureSecretKeysEnum || (exports.AzureSecretKeysEnum = AzureSecretKeysEnum = {}));
21
29
  //# sourceMappingURL=secretKeys.enum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"secretKeys.enum.js","sourceRoot":"","sources":["../../../src/enums/secretKeys.enum.ts"],"names":[],"mappings":";;;AAAA,uBAAuB;AACvB,IAAY,mBAcX;AAdD,WAAY,mBAAmB;IAC7B,qDAAqD;IACrD,8DAAuC,CAAA;IACvC,8FAAuE,CAAA;IACvE,0FAAmE,CAAA;IACnE,sFAA+D,CAAA;IAC/D,8DAAuC,CAAA;IACvC,gHAAyF,CAAA;IACzF,oFAA6D,CAAA;IAC7D,oGAA6E,CAAA;IAC7E,sGAA+E,CAAA;IAC/E,oGAA6E,CAAA;IAC7E,8GAAuF,CAAA;IACvF,8EAAuD,CAAA;AACzD,CAAC,EAdW,mBAAmB,mCAAnB,mBAAmB,QAc9B"}
1
+ {"version":3,"file":"secretKeys.enum.js","sourceRoot":"","sources":["../../../src/enums/secretKeys.enum.ts"],"names":[],"mappings":";;;AAAA,uBAAuB;AACvB,IAAY,mBAsBX;AAtBD,WAAY,mBAAmB;IAC7B,oFAA6D,CAAA;IAC7D,4EAAqD,CAAA;IACrD,8DAAuC,CAAA;IACvC,8FAAuE,CAAA;IACvE,0FAAmE,CAAA;IACnE,sFAA+D,CAAA;IAC/D,8DAAuC,CAAA;IACvC,8EAAuD,CAAA;IACvD,8EAAuD,CAAA;IACvD,gGAAyE,CAAA;IACzE,oFAA6D,CAAA;IAC7D,8EAAuD,CAAA;IACvD,oFAA6D,CAAA;IAC7D,oFAA8D,CAAA;IAC9D,qFAA8D,CAAA;IAC9D,sGAA+E,CAAA;IAC/E,oGAA6E,CAAA;IAC7E,oGAA6E,CAAA;IAC7E,8DAAuC,CAAA;IACvC,gHAAyF,CAAA;IACzF,8GAAuF,CAAA;AACzF,CAAC,EAtBW,mBAAmB,mCAAnB,mBAAmB,QAsB9B"}
@@ -1,3 +1,4 @@
1
1
  export * from './secrets';
2
2
  export * from './response';
3
3
  export * from './initializers';
4
+ export * from './mapper';
@@ -4,4 +4,5 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./secrets"), exports);
5
5
  tslib_1.__exportStar(require("./response"), exports);
6
6
  tslib_1.__exportStar(require("./initializers"), exports);
7
+ tslib_1.__exportStar(require("./mapper"), exports);
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,qDAA2B;AAC3B,yDAA+B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,qDAA2B;AAC3B,yDAA+B;AAC/B,mDAAyB"}
@@ -5,10 +5,13 @@ import { InvocationContext } from "@azure/functions";
5
5
  */
6
6
  export declare function WithDb(_target: any, _propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<any>>): void;
7
7
  export declare abstract class Initializers {
8
- private static connectionPromise;
8
+ protected static connections: Map<string, mongoose.Mongoose>;
9
9
  protected context: InvocationContext;
10
10
  protected dbConnectionString: string;
11
11
  private connectionInitialized;
12
12
  constructor(context: InvocationContext, dbConnectionString: string);
13
- protected ensureConnection(): Promise<typeof mongoose>;
13
+ protected ensureConnection(): Promise<mongoose.Mongoose>;
14
+ protected getConnection(): mongoose.Mongoose | undefined;
15
+ forceNewConnection(): Promise<mongoose.Mongoose>;
16
+ disconnect(): Promise<void>;
14
17
  }
@@ -26,44 +26,71 @@ class Initializers {
26
26
  }
27
27
  ensureConnection() {
28
28
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
29
- if (mongoose_1.default.connection.readyState === 1) {
30
- return mongoose_1.default;
29
+ // Check if we already have a connection for this specific connection string
30
+ const existingConnection = Initializers.connections.get(this.dbConnectionString);
31
+ if (existingConnection && existingConnection.connection.readyState === 1) {
32
+ return existingConnection;
31
33
  }
32
- if (!Initializers.connectionPromise) {
33
- this.context.info('Initializing database connection...');
34
- Initializers.connectionPromise = mongoose_1.default
35
- .connect(this.dbConnectionString, {
34
+ // Create a new Mongoose instance for this connection string
35
+ this.context.info(`Initializing database connection... ${this.dbConnectionString}`);
36
+ const newMongoose = new mongoose_1.default.Mongoose();
37
+ try {
38
+ yield newMongoose.connect(this.dbConnectionString, {
36
39
  serverSelectionTimeoutMS: 10000,
37
40
  connectTimeoutMS: 10000,
38
41
  socketTimeoutMS: 45000,
39
- })
40
- .then(conn => {
41
- this.context.info('✅ MongoDB connected successfully');
42
- this.connectionInitialized = true;
43
- return mongoose_1.default;
44
- })
45
- .catch(err => {
46
- this.context.error('❌ MongoDB connection error:', {
47
- message: err.message,
48
- name: err.name,
49
- code: err.code,
50
- stack: err.stack
51
- });
52
- Initializers.connectionPromise = null;
53
- this.connectionInitialized = false;
54
- throw new Error(`Failed to connect to MongoDB: ${err.message}`);
55
42
  });
43
+ this.context.info(`✅ MongoDB connected successfully ${this.dbConnectionString}`);
44
+ this.connectionInitialized = true;
45
+ // Store the connection for this connection string
46
+ Initializers.connections.set(this.dbConnectionString, newMongoose);
47
+ return newMongoose;
56
48
  }
57
- try {
58
- return yield Initializers.connectionPromise;
59
- }
60
- catch (error) {
49
+ catch (err) {
50
+ this.context.error(`❌ MongoDB connection error for ${this.dbConnectionString}`, {
51
+ message: err.message,
52
+ name: err.name,
53
+ code: err.code,
54
+ stack: err.stack
55
+ });
61
56
  this.connectionInitialized = false;
62
- throw error;
57
+ throw new Error(`Failed to connect to MongoDB: ${err.message}`);
58
+ }
59
+ });
60
+ }
61
+ getConnection() {
62
+ return Initializers.connections.get(this.dbConnectionString);
63
+ }
64
+ forceNewConnection() {
65
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
66
+ // Disconnect existing connection if any
67
+ yield this.disconnect();
68
+ // Reset connection state
69
+ this.connectionInitialized = false;
70
+ // Create a new connection
71
+ return this.ensureConnection();
72
+ });
73
+ }
74
+ disconnect() {
75
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
76
+ const connection = Initializers.connections.get(this.dbConnectionString);
77
+ if (connection) {
78
+ try {
79
+ // Properly close the connection
80
+ yield connection.disconnect();
81
+ this.context.info(`✅ Disconnected from database: ${this.dbConnectionString}`);
82
+ }
83
+ catch (error) {
84
+ this.context.error(`❌ Error disconnecting from database: ${this.dbConnectionString}`, error);
85
+ }
86
+ finally {
87
+ // Always remove from the connections map
88
+ Initializers.connections.delete(this.dbConnectionString);
89
+ }
63
90
  }
64
91
  });
65
92
  }
66
93
  }
67
94
  exports.Initializers = Initializers;
68
- Initializers.connectionPromise = null;
95
+ Initializers.connections = new Map();
69
96
  //# sourceMappingURL=initializers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"initializers.js","sourceRoot":"","sources":["../../../src/utils/initializers.ts"],"names":[],"mappings":";;;AAMA,wBAWC;;AAjBD,gEAAgC;AAGhC;;GAEG;AACH,SAAgB,MAAM,CACpB,OAAY,EACZ,YAA6B,EAC7B,UAAqE;IAErE,IAAI,CAAC,UAAU,CAAC,KAAK;QAAE,OAAO;IAC9B,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;IACxC,UAAU,CAAC,KAAK,GAAG,UAAoC,GAAG,IAAW;;YACnE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9B,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;KAAA,CAAC;AACJ,CAAC;AAED,MAAsB,YAAY;IAMhC,YAAY,OAA0B,EAAE,kBAA0B;QAF1D,0BAAqB,GAAY,KAAK,CAAC;QAG7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAEe,gBAAgB;;YAC9B,IAAI,kBAAQ,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,kBAAQ,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;gBACzD,YAAY,CAAC,iBAAiB,GAAG,kBAAQ;qBACtC,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAChC,wBAAwB,EAAE,KAAK;oBAC/B,gBAAgB,EAAE,KAAK;oBACvB,eAAe,EAAE,KAAK;iBACvB,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC,EAAE;oBACX,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;oBACtD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;oBAClC,OAAO,kBAAQ,CAAC;gBAClB,CAAC,CAAC;qBACD,KAAK,CAAC,GAAG,CAAC,EAAE;oBACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE;wBAChD,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,KAAK,EAAE,GAAG,CAAC,KAAK;qBACjB,CAAC,CAAC;oBACH,YAAY,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBACtC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;YACP,CAAC;YAED,IAAI,CAAC;gBACH,OAAO,MAAM,YAAY,CAAC,iBAAiB,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;gBACnC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KAAA;;AAhDH,oCAiDC;AAhDgB,8BAAiB,GAAoC,IAAI,AAAxC,CAAyC"}
1
+ {"version":3,"file":"initializers.js","sourceRoot":"","sources":["../../../src/utils/initializers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@culturefy/shared",
3
3
  "description": "Shared utilities for culturefy serverless services",
4
- "version": "1.0.19",
4
+ "version": "1.0.20",
5
5
  "main": "build/cjs/index.js",
6
6
  "module": "build/esm/index.js",
7
7
  "types": "build/src/index.d.ts",
@@ -1,16 +1,24 @@
1
1
  // Enum for secret keys
2
2
  export enum AzureSecretKeysEnum {
3
- // STRIPE_PUBLISHABLE_KEY = "Stripe-Publishable-Key",
4
- STRIPE_SECRET_KEY = "Stripe-secret-key",
3
+ KEYCLOAK_ADMIN_CLIENT_SECRET = "KEYCLOAK-ADMIN-CLIENT-SECRET",
4
+ KEYCLOAK_ADMIN_CLIENT_ID = "KEYCLOAK-ADMIN-CLIENT-ID",
5
+ KEYCLOAK_BASE_URL = "KEYCLOAK-BASE-URL",
5
6
  STRIPE_PAYMENT_WEBHOOK_SECRET_KEY = "Stripe-payment-webhook-secret-key", // in-use
6
7
  STRIPE_PRODUCT_WEBHOOK_SECRET = "Stripe-product-webhook-secret-key", // in-use
7
8
  STRIPE_PRICE_WEBHOOK_SECRET = "Stripe-price-webhook-secret-key", // in-use
8
9
  EMAIL_SERVICE_URL = "Email-Service-Url", // in-use,
9
- STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY = "Stripe-Webhook-Customer-Created-Secret-Key",// in-use
10
- DB_CONNECTING_STRING_BILLING = "DB-Connecting-String-Billing",
11
- STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET = "stripe-product-sync-webhook-secret-key",// in-use
10
+ DB_CONNECTING_STRING_AUTH = "DB-CONNECTION-STRING-AUTH",
11
+ DB_CONNECTING_STRING_USER = "DB-CONNECTION-STRING-USER",
12
+ DB_CONNECTING_STRING_TENANT_BRIDGE = "DB-Connecting-String-Tenant-Bridge",
13
+ DB_CONNECTING_STRING_PAYMENT = "DB-CONNECTION-STRING-PAYMENT",
14
+ DB_CONNECTING_STRING_CORE = "DB-CONNECTION-STRING-CORE",
15
+ DB_CONNECTING_STRING_BILLING = "DB-CONNECTION-STRING-BILLING",
16
+ DB_CONNECTING_STRING_STAGING = "DB-CONNECTION-STRING-STAGING",
17
+ SERVICE_BUS_CONNECTION_STRING = "servicebus-connection-string",
12
18
  STRIPE_CUSTOMER_SYNC_WEBHOOK_SECRET = "stripe-customer-sync-webhook-secret-key",
13
19
  STRIPE_INVOICE_SYNC_WEBHOOK_SECRET = "stripe-invoice-sync-webhook-secret-key",
20
+ STRIPE_PRODUCT_SYNC_WEBHOOK_SECRET = "stripe-product-sync-webhook-secret-key",
21
+ STRIPE_SECRET_KEY = "Stripe-secret-key",
22
+ STRIPE_WEBHOOK_CUSTOMER_CREATED_SECRET_KEY = "Stripe-Webhook-Customer-Created-Secret-Key",
14
23
  STRIPE_SUBSCRIPTION_SYNC_WEBHOOK_SECRET = "stripe-subscription-sync-webhook-secret-key",
15
- DB_CONNECTING_STRING_CORE = "DB-Connecting-String-Core",
16
24
  }
@@ -1,3 +1,4 @@
1
1
  export * from './secrets';
2
2
  export * from './response';
3
- export * from './initializers';
3
+ export * from './initializers';
4
+ export * from './mapper';
@@ -18,7 +18,7 @@ export function WithDb(
18
18
  }
19
19
 
20
20
  export abstract class Initializers {
21
- private static connectionPromise: Promise<typeof mongoose> | null = null;
21
+ protected static connections: Map<string, mongoose.Mongoose> = new Map();
22
22
  protected context: InvocationContext;
23
23
  protected dbConnectionString: string;
24
24
  private connectionInitialized: boolean = false;
@@ -28,42 +28,71 @@ export abstract class Initializers {
28
28
  this.dbConnectionString = dbConnectionString;
29
29
  }
30
30
 
31
- protected async ensureConnection(): Promise<typeof mongoose> {
32
- if (mongoose.connection.readyState === 1) {
33
- return mongoose;
34
- }
35
-
36
- if (!Initializers.connectionPromise) {
37
- this.context.info('Initializing database connection...');
38
- Initializers.connectionPromise = mongoose
39
- .connect(this.dbConnectionString, {
40
- serverSelectionTimeoutMS: 10000,
41
- connectTimeoutMS: 10000,
42
- socketTimeoutMS: 45000,
43
- })
44
- .then(conn => {
45
- this.context.info('✅ MongoDB connected successfully');
46
- this.connectionInitialized = true;
47
- return mongoose;
48
- })
49
- .catch(err => {
50
- this.context.error('❌ MongoDB connection error:', {
51
- message: err.message,
52
- name: err.name,
53
- code: err.code,
54
- stack: err.stack
55
- });
56
- Initializers.connectionPromise = null;
57
- this.connectionInitialized = false;
58
- throw new Error(`Failed to connect to MongoDB: ${err.message}`);
59
- });
31
+ protected async ensureConnection(): Promise<mongoose.Mongoose> {
32
+ // Check if we already have a connection for this specific connection string
33
+ const existingConnection = Initializers.connections.get(this.dbConnectionString);
34
+ if (existingConnection && existingConnection.connection.readyState === 1) {
35
+ return existingConnection;
60
36
  }
61
37
 
38
+ // Create a new Mongoose instance for this connection string
39
+ this.context.info(`Initializing database connection... ${this.dbConnectionString}`);
40
+ const newMongoose = new mongoose.Mongoose();
41
+
62
42
  try {
63
- return await Initializers.connectionPromise;
64
- } catch (error) {
43
+ await newMongoose.connect(this.dbConnectionString, {
44
+ serverSelectionTimeoutMS: 10000,
45
+ connectTimeoutMS: 10000,
46
+ socketTimeoutMS: 45000,
47
+ });
48
+
49
+ this.context.info(`✅ MongoDB connected successfully ${this.dbConnectionString}`);
50
+ this.connectionInitialized = true;
51
+
52
+ // Store the connection for this connection string
53
+ Initializers.connections.set(this.dbConnectionString, newMongoose);
54
+
55
+ return newMongoose;
56
+ } catch (err: any) {
57
+ this.context.error(`❌ MongoDB connection error for ${this.dbConnectionString}`, {
58
+ message: err.message,
59
+ name: err.name,
60
+ code: err.code,
61
+ stack: err.stack
62
+ });
65
63
  this.connectionInitialized = false;
66
- throw error;
64
+ throw new Error(`Failed to connect to MongoDB: ${err.message}`);
65
+ }
66
+ }
67
+
68
+ protected getConnection(): mongoose.Mongoose | undefined {
69
+ return Initializers.connections.get(this.dbConnectionString);
70
+ }
71
+
72
+ async forceNewConnection(): Promise<mongoose.Mongoose> {
73
+ // Disconnect existing connection if any
74
+ await this.disconnect();
75
+
76
+ // Reset connection state
77
+ this.connectionInitialized = false;
78
+
79
+ // Create a new connection
80
+ return this.ensureConnection();
81
+ }
82
+
83
+ async disconnect(): Promise<void> {
84
+ const connection = Initializers.connections.get(this.dbConnectionString);
85
+ if (connection) {
86
+ try {
87
+ // Properly close the connection
88
+ await connection.disconnect();
89
+ this.context.info(`✅ Disconnected from database: ${this.dbConnectionString}`);
90
+ } catch (error) {
91
+ this.context.error(`❌ Error disconnecting from database: ${this.dbConnectionString}`, error);
92
+ } finally {
93
+ // Always remove from the connections map
94
+ Initializers.connections.delete(this.dbConnectionString);
95
+ }
67
96
  }
68
97
  }
69
98
  }