@lyxa.ai/core 1.0.15-debug-0.12 → 1.0.16
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/dist/index.d.ts +4 -4
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/libraries/auth/index.d.ts +3 -3
- package/dist/libraries/auth/index.js +26 -26
- package/dist/libraries/auth/index.js.map +1 -1
- package/dist/libraries/auth/refreshtoken.d.ts +1 -1
- package/dist/libraries/auth/refreshtoken.js +6 -10
- package/dist/libraries/auth/refreshtoken.js.map +1 -1
- package/dist/libraries/auth/repository.d.ts +3 -3
- package/dist/libraries/auth/repository.js +1 -5
- package/dist/libraries/auth/repository.js.map +1 -1
- package/dist/libraries/configuration/index.d.ts +2 -2
- package/dist/libraries/configuration/index.js +20 -20
- package/dist/libraries/configuration/index.js.map +1 -1
- package/dist/libraries/configuration/types/EnvironmentConfigurationType.js.map +1 -1
- package/dist/libraries/dispatcher/index.d.ts +2 -2
- package/dist/libraries/dispatcher/index.js +2 -2
- package/dist/libraries/dispatcher/index.js.map +1 -1
- package/dist/libraries/event/BaseEvent.js.map +1 -1
- package/dist/libraries/event/decorators/metadata.d.ts +1 -1
- package/dist/libraries/event/decorators/metadata.js.map +1 -1
- package/dist/libraries/event/decorators/subscribe.js.map +1 -1
- package/dist/libraries/event/index.d.ts +1 -1
- package/dist/libraries/event/index.js +6 -6
- package/dist/libraries/event/index.js.map +1 -1
- package/dist/libraries/event/registry/SubscriptionRegistry.js.map +1 -1
- package/dist/libraries/event/test/OrderCreationEvent.d.ts +1 -1
- package/dist/libraries/event/test/OrderCreationEvent.js +9 -6
- package/dist/libraries/event/test/OrderCreationEvent.js.map +1 -1
- package/dist/libraries/firebase/index.d.ts +1 -1
- package/dist/libraries/firebase/index.js.map +1 -1
- package/dist/libraries/index.d.ts +9 -9
- package/dist/libraries/index.js +1 -1
- package/dist/libraries/index.js.map +1 -1
- package/dist/libraries/logger/index.d.ts +1 -1
- package/dist/libraries/logger/index.js +9 -9
- package/dist/libraries/logger/index.js.map +1 -1
- package/dist/libraries/mongo/index.d.ts +1 -1
- package/dist/libraries/mongo/index.js +11 -11
- package/dist/libraries/mongo/index.js.map +1 -1
- package/dist/libraries/mongo/models/activity-log.model.d.ts +1 -2
- package/dist/libraries/mongo/models/activity-log.model.js +1 -2
- package/dist/libraries/mongo/models/activity-log.model.js.map +1 -1
- package/dist/libraries/mongo/models/admin-access-control.model.js.map +1 -1
- package/dist/libraries/mongo/models/admin.model.d.ts +3 -3
- package/dist/libraries/mongo/models/admin.model.js +4 -3
- package/dist/libraries/mongo/models/admin.model.js.map +1 -1
- package/dist/libraries/mongo/models/app-screen-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/app-screen-setting.model.js +1 -2
- package/dist/libraries/mongo/models/app-screen-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/attribute.model.d.ts +1 -2
- package/dist/libraries/mongo/models/attribute.model.js +1 -2
- package/dist/libraries/mongo/models/attribute.model.js.map +1 -1
- package/dist/libraries/mongo/models/banner.model.d.ts +1 -2
- package/dist/libraries/mongo/models/banner.model.js +1 -2
- package/dist/libraries/mongo/models/banner.model.js.map +1 -1
- package/dist/libraries/mongo/models/base/base-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/base/base-review.model.js.map +1 -1
- package/dist/libraries/mongo/models/bob-finance.model.d.ts +2 -3
- package/dist/libraries/mongo/models/bob-finance.model.js +2 -3
- package/dist/libraries/mongo/models/bob-finance.model.js.map +1 -1
- package/dist/libraries/mongo/models/brand.model.d.ts +0 -2
- package/dist/libraries/mongo/models/brand.model.js +1 -2
- package/dist/libraries/mongo/models/brand.model.js.map +1 -1
- package/dist/libraries/mongo/models/category.model.d.ts +1 -2
- package/dist/libraries/mongo/models/category.model.js +1 -2
- package/dist/libraries/mongo/models/category.model.js.map +1 -1
- package/dist/libraries/mongo/models/core-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/core-user.model.js.map +1 -1
- package/dist/libraries/mongo/models/counter.model.d.ts +0 -2
- package/dist/libraries/mongo/models/counter.model.js +1 -2
- package/dist/libraries/mongo/models/counter.model.js.map +1 -1
- package/dist/libraries/mongo/models/coupon.model.d.ts +0 -2
- package/dist/libraries/mongo/models/coupon.model.js +4 -3
- package/dist/libraries/mongo/models/coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/deal-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/deal-setting.model.js +1 -2
- package/dist/libraries/mongo/models/deal-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/dish.model.d.ts +1 -2
- package/dist/libraries/mongo/models/dish.model.js +1 -2
- package/dist/libraries/mongo/models/dish.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/attribute-item.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/attribute-map.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/business-development-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/charge-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/charge.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/courier-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/currency-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/currency.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/featured-item.mode.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/otp-fields.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/package.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/parent-document.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/payout-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/price.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/product-nutrition.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/referral-discount-config.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/rider-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/service-fee-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/shop-document.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/subscription-summary.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/zone-geometry.mode.js.map +1 -1
- package/dist/libraries/mongo/models/faq.model.d.ts +0 -2
- package/dist/libraries/mongo/models/faq.model.js +1 -2
- package/dist/libraries/mongo/models/faq.model.js.map +1 -1
- package/dist/libraries/mongo/models/favourite.model.d.ts +3 -4
- package/dist/libraries/mongo/models/favourite.model.js +3 -4
- package/dist/libraries/mongo/models/favourite.model.js.map +1 -1
- package/dist/libraries/mongo/models/featured-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/featured-setting.model.js +1 -2
- package/dist/libraries/mongo/models/featured-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/filter-container.model.d.ts +0 -1
- package/dist/libraries/mongo/models/filter-container.model.js +1 -2
- package/dist/libraries/mongo/models/filter-container.model.js.map +1 -1
- package/dist/libraries/mongo/models/index.d.ts +170 -63
- package/dist/libraries/mongo/models/index.js +113 -3
- package/dist/libraries/mongo/models/index.js.map +1 -1
- package/dist/libraries/mongo/models/list-container.model.d.ts +2 -3
- package/dist/libraries/mongo/models/list-container.model.js +2 -3
- package/dist/libraries/mongo/models/list-container.model.js.map +1 -1
- package/dist/libraries/mongo/models/loyalty-point-category.model.d.ts +0 -2
- package/dist/libraries/mongo/models/loyalty-point-category.model.js +1 -2
- package/dist/libraries/mongo/models/loyalty-point-category.model.js.map +1 -1
- package/dist/libraries/mongo/models/loyalty-point-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/loyalty-point-setting.model.js +1 -2
- package/dist/libraries/mongo/models/loyalty-point-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/marketing.model.d.ts +2 -3
- package/dist/libraries/mongo/models/marketing.model.js +13 -5
- package/dist/libraries/mongo/models/marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/meal-plan.model.d.ts +0 -2
- package/dist/libraries/mongo/models/meal-plan.model.js +1 -2
- package/dist/libraries/mongo/models/meal-plan.model.js.map +1 -1
- package/dist/libraries/mongo/models/notification.model.d.ts +8 -9
- package/dist/libraries/mongo/models/notification.model.js +8 -9
- package/dist/libraries/mongo/models/notification.model.js.map +1 -1
- package/dist/libraries/mongo/models/nutrition.model.d.ts +0 -2
- package/dist/libraries/mongo/models/nutrition.model.js +1 -2
- package/dist/libraries/mongo/models/nutrition.model.js.map +1 -1
- package/dist/libraries/mongo/models/order.model.js.map +1 -1
- package/dist/libraries/mongo/models/parent.model.d.ts +3 -4
- package/dist/libraries/mongo/models/parent.model.js +8 -5
- package/dist/libraries/mongo/models/parent.model.js.map +1 -1
- package/dist/libraries/mongo/models/payout.model.js.map +1 -1
- package/dist/libraries/mongo/models/product-marketing.model.d.ts +3 -4
- package/dist/libraries/mongo/models/product-marketing.model.js +3 -4
- package/dist/libraries/mongo/models/product-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/product.model.d.ts +1 -3
- package/dist/libraries/mongo/models/product.model.js +8 -4
- package/dist/libraries/mongo/models/product.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/buy1-get1-marketing.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/buy1-get1-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/buy1-get1-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/core-apple-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/core-email-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/core-google-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/core-phone-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/custom-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/custom-coupon.model.js +1 -3
- package/dist/libraries/mongo/models/providers/custom-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/discount-marketing.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/discount-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/discount-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/featured-marketing.model.d.ts +0 -2
- package/dist/libraries/mongo/models/providers/featured-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/featured-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/free-delivery-marketing.model.d.ts +0 -2
- package/dist/libraries/mongo/models/providers/free-delivery-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/free-delivery-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/global-coupon.model.d.ts +0 -2
- package/dist/libraries/mongo/models/providers/global-coupon.model.js +1 -4
- package/dist/libraries/mongo/models/providers/global-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/individual-store-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/individual-store-coupon.model.js +1 -3
- package/dist/libraries/mongo/models/providers/individual-store-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/individual-user-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/individual-user-coupon.model.js +1 -3
- package/dist/libraries/mongo/models/providers/individual-user-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/loyalty-point-marketing.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/loyalty-point-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/loyalty-point-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/punch-marketing.model.d.ts +0 -2
- package/dist/libraries/mongo/models/providers/punch-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/punch-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/referral-code-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/referral-code-coupon.model.js +1 -2
- package/dist/libraries/mongo/models/providers/referral-code-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.js +1 -3
- package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/punch-marketing-history.model.d.ts +1 -2
- package/dist/libraries/mongo/models/punch-marketing-history.model.js +1 -2
- package/dist/libraries/mongo/models/punch-marketing-history.model.js.map +1 -1
- package/dist/libraries/mongo/models/rating-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/rating-setting.model.js +1 -2
- package/dist/libraries/mongo/models/rating-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/referral-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/referral-setting.model.js +1 -2
- package/dist/libraries/mongo/models/referral-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/request-area.model.d.ts +1 -2
- package/dist/libraries/mongo/models/request-area.model.js +1 -2
- package/dist/libraries/mongo/models/request-area.model.js.map +1 -1
- package/dist/libraries/mongo/models/rider-review.model.d.ts +1 -2
- package/dist/libraries/mongo/models/rider-review.model.js +1 -2
- package/dist/libraries/mongo/models/rider-review.model.js.map +1 -1
- package/dist/libraries/mongo/models/rider.model.js.map +1 -1
- package/dist/libraries/mongo/models/role.model.d.ts +0 -2
- package/dist/libraries/mongo/models/role.model.js +1 -3
- package/dist/libraries/mongo/models/role.model.js.map +1 -1
- package/dist/libraries/mongo/models/setting.model.d.ts +6 -8
- package/dist/libraries/mongo/models/setting.model.js +7 -8
- package/dist/libraries/mongo/models/setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/shared/address.model.d.ts +1 -1
- package/dist/libraries/mongo/models/shared/address.model.js.map +1 -1
- package/dist/libraries/mongo/models/shared/duration.model.js.map +1 -1
- package/dist/libraries/mongo/models/shared/work-hour.model.d.ts +1 -1
- package/dist/libraries/mongo/models/shared/work-hour.model.js +1 -1
- package/dist/libraries/mongo/models/shared/work-hour.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-access-control.model.d.ts +1 -2
- package/dist/libraries/mongo/models/shop-access-control.model.js +1 -2
- package/dist/libraries/mongo/models/shop-access-control.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-category.model.d.ts +2 -3
- package/dist/libraries/mongo/models/shop-category.model.js +2 -3
- package/dist/libraries/mongo/models/shop-category.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-meal-plan.model.d.ts +2 -3
- package/dist/libraries/mongo/models/shop-meal-plan.model.js +2 -3
- package/dist/libraries/mongo/models/shop-meal-plan.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-product.model.d.ts +4 -5
- package/dist/libraries/mongo/models/shop-product.model.js +4 -5
- package/dist/libraries/mongo/models/shop-product.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-review.model.d.ts +1 -2
- package/dist/libraries/mongo/models/shop-review.model.js +1 -2
- package/dist/libraries/mongo/models/shop-review.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop.model.d.ts +3 -4
- package/dist/libraries/mongo/models/shop.model.js +12 -6
- package/dist/libraries/mongo/models/shop.model.js.map +1 -1
- package/dist/libraries/mongo/models/subscription-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/subscription-setting.model.js +7 -3
- package/dist/libraries/mongo/models/subscription-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/subscription.model.d.ts +3 -4
- package/dist/libraries/mongo/models/subscription.model.js +13 -6
- package/dist/libraries/mongo/models/subscription.model.js.map +1 -1
- package/dist/libraries/mongo/models/tag.model.d.ts +0 -2
- package/dist/libraries/mongo/models/tag.model.js +1 -2
- package/dist/libraries/mongo/models/tag.model.js.map +1 -1
- package/dist/libraries/mongo/models/transaction.model.js.map +1 -1
- package/dist/libraries/mongo/models/zone.model.d.ts +0 -2
- package/dist/libraries/mongo/models/zone.model.js +1 -2
- package/dist/libraries/mongo/models/zone.model.js.map +1 -1
- package/dist/libraries/mongo/plugins/soft-delete-plugin.d.ts +4 -4
- package/dist/libraries/mongo/plugins/soft-delete-plugin.js +11 -11
- package/dist/libraries/mongo/plugins/soft-delete-plugin.js.map +1 -1
- package/dist/libraries/redis/index.d.ts +1 -1
- package/dist/libraries/redis/index.js +4 -1
- package/dist/libraries/redis/index.js.map +1 -1
- package/dist/libraries/secrets/index.d.ts +2 -2
- package/dist/libraries/secrets/index.js +13 -13
- package/dist/libraries/secrets/index.js.map +1 -1
- package/dist/libraries/trpc/context.d.ts +4 -4
- package/dist/libraries/trpc/context.js +1 -1
- package/dist/libraries/trpc/context.js.map +1 -1
- package/dist/libraries/trpc/index.js.map +1 -1
- package/dist/libraries/trpc/middlewares/auth.d.ts +1 -1
- package/dist/libraries/trpc/middlewares/auth.js +12 -13
- package/dist/libraries/trpc/middlewares/auth.js.map +1 -1
- package/dist/libraries/trpc/middlewares/cors.js +7 -3
- package/dist/libraries/trpc/middlewares/cors.js.map +1 -1
- package/dist/libraries/twilio/index.d.ts +1 -1
- package/dist/libraries/twilio/index.js +2 -3
- package/dist/libraries/twilio/index.js.map +1 -1
- package/dist/libraries/upload/index.js +3 -3
- package/dist/libraries/upload/index.js.map +1 -1
- package/dist/utilities/enum.js.map +1 -1
- package/dist/utilities/error-handler.js.map +1 -1
- package/dist/utilities/error-middleware.js.map +1 -1
- package/dist/utilities/pagination.d.ts +4 -4
- package/dist/utilities/pagination.js +3 -8
- package/dist/utilities/pagination.js.map +1 -1
- package/dist/utilities/transformers.d.ts +2 -2
- package/dist/utilities/transformers.js +6 -6
- package/dist/utilities/transformers.js.map +1 -1
- package/dist/utilities/validation/common-validation.js.map +1 -1
- package/dist/utilities/validation/global-validation.js.map +1 -1
- package/dist/utilities/validation/index.js.map +1 -1
- package/package.json +44 -41
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { LibraryManager } from
|
|
2
|
-
import { ConfigurationOptions } from
|
|
3
|
-
export { ConfigurationOptions } from
|
|
4
|
-
export { EnvironmentConfigurationType } from
|
|
1
|
+
import { LibraryManager } from './libraries';
|
|
2
|
+
import { ConfigurationOptions } from './libraries/configuration';
|
|
3
|
+
export { ConfigurationOptions } from './libraries/configuration';
|
|
4
|
+
export { EnvironmentConfigurationType } from './libraries/configuration/types/EnvironmentConfigurationType';
|
|
5
5
|
export { initGlobalConnection, createGlobalModel, createGlobalDiscriminatorModel } from './libraries/mongo';
|
|
6
6
|
export declare function bootstrapCore(options?: ConfigurationOptions): Promise<void>;
|
|
7
7
|
export declare function registerLibraries(options?: ConfigurationOptions): Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -30,17 +30,17 @@ Object.defineProperty(exports, "createGlobalDiscriminatorModel", { enumerable: t
|
|
|
30
30
|
async function bootstrapCore(options) {
|
|
31
31
|
try {
|
|
32
32
|
await registerLibraries(options);
|
|
33
|
-
getLibraries().getLogger().logger.info(
|
|
33
|
+
getLibraries().getLogger().logger.info('Successfully bootstrapped lyxa-core.');
|
|
34
34
|
const gracefulShutdown = async () => {
|
|
35
35
|
getLibraries().getLogger().logger.info('Received shutdown signal, shutting down gracefully...');
|
|
36
36
|
};
|
|
37
37
|
process.on('SIGTERM', gracefulShutdown);
|
|
38
38
|
process.on('SIGINT', gracefulShutdown);
|
|
39
|
-
process.on('uncaughtException',
|
|
39
|
+
process.on('uncaughtException', err => {
|
|
40
40
|
getLibraries().getLogger().logger.error('Uncaught exception, shutting down...', err);
|
|
41
41
|
gracefulShutdown();
|
|
42
42
|
});
|
|
43
|
-
console.log(
|
|
43
|
+
console.log('Created hooks.');
|
|
44
44
|
}
|
|
45
45
|
catch (e) {
|
|
46
46
|
console.error(e);
|
|
@@ -53,8 +53,7 @@ async function registerLibraries(options) {
|
|
|
53
53
|
typedi_1.Container.set(redis_1.RedisService, redisInstance);
|
|
54
54
|
const secretInstance = new secrets_1.SecretManagerService(configurationInstance, redisInstance);
|
|
55
55
|
typedi_1.Container.set(secrets_1.SecretManagerService, secretInstance);
|
|
56
|
-
const mongoUrl = await getLibraries().getSecretsService()
|
|
57
|
-
.getKey("MONGO_URL");
|
|
56
|
+
const mongoUrl = await getLibraries().getSecretsService().getKey('MONGO_URL');
|
|
58
57
|
await mongoose_1.default.connect(mongoUrl, { dbName: `lyxa-${options.environment}-${options.tenet}` });
|
|
59
58
|
mongoose_1.default.set('debug', getLibraries().getConfigurationService().options.environment == EnvironmentConfigurationType_1.EnvironmentConfigurationType.DEV);
|
|
60
59
|
await (0, mongo_1.initGlobalConnection)(mongoUrl, options.environment);
|
|
@@ -66,8 +65,8 @@ async function registerLibraries(options) {
|
|
|
66
65
|
typedi_1.Container.set(dispatcher_1.MicroServiceDispatcher, microserviceDispatcherInstance);
|
|
67
66
|
const twilioServiceInstance = new twilio_1.TwilioService();
|
|
68
67
|
typedi_1.Container.set(twilio_1.TwilioService, twilioServiceInstance);
|
|
69
|
-
console.log(
|
|
70
|
-
await (0, event_1.initEventBus)(
|
|
68
|
+
console.log('Initialized everything');
|
|
69
|
+
await (0, event_1.initEventBus)('amqps://vgyuplrd:wto6vUYnb4zeBI5lntKT4gj7rT8n1vwg@dog.lmq.cloudamqp.com/vgyuplrd');
|
|
71
70
|
const allSubscriptions = SubscriptionRegistry_1.SubscriptionRegistry.getAllSubscriptions();
|
|
72
71
|
const instantiatedServices = new Map();
|
|
73
72
|
for (const { eventId, targetConstructor, methodName } of allSubscriptions) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import { LibraryManager } from './libraries';\r\nimport { Container } from 'typedi';\r\nimport mongoose from 'mongoose';\r\nimport { ConfigurationOptions, ConfigurationService } from './libraries/configuration';\r\nimport { EnvironmentConfigurationType } from './libraries/configuration/types/EnvironmentConfigurationType';\r\nimport { LyxaLogger } from './libraries/logger';\r\nimport { RedisService } from './libraries/redis';\r\nimport { initGlobalConnection } from './libraries/mongo';\r\nimport { SecretManagerService } from './libraries/secrets';\r\nimport { MicroServiceDispatcher } from './libraries/dispatcher';\r\nimport { TwilioService } from './libraries/twilio';\r\nimport { FirebaseService } from './libraries/firebase';\r\nimport { initEventBus, subscribeToEvent } from './libraries/event';\r\nimport { SubscriptionRegistry } from './libraries/event/registry/SubscriptionRegistry';\r\nimport { AuthEntityType, signTokenPair } from './libraries/auth';\r\n\r\nexport { ConfigurationOptions } from './libraries/configuration';\r\nexport { EnvironmentConfigurationType } from './libraries/configuration/types/EnvironmentConfigurationType';\r\nexport { initGlobalConnection, createGlobalModel, createGlobalDiscriminatorModel } from './libraries/mongo';\r\n\r\nexport async function bootstrapCore(options?: ConfigurationOptions) {\r\n\ttry {\r\n\t\tawait registerLibraries(options);\r\n\r\n\t\tgetLibraries().getLogger().logger.info('Successfully bootstrapped lyxa-core.');\r\n\r\n\t\tconst gracefulShutdown = async () => {\r\n\t\t\tgetLibraries().getLogger().logger.info('Received shutdown signal, shutting down gracefully...');\r\n\t\t};\r\n\r\n\t\tprocess.on('SIGTERM', gracefulShutdown);\r\n\t\tprocess.on('SIGINT', gracefulShutdown);\r\n\t\tprocess.on('uncaughtException', err => {\r\n\t\t\tgetLibraries().getLogger().logger.error('Uncaught exception, shutting down...', err);\r\n\t\t\tgracefulShutdown();\r\n\t\t});\r\n\r\n\t\tconsole.log('Created hooks.');\r\n\t} catch (e) {\r\n\t\tconsole.error(e);\r\n\t}\r\n}\r\n\r\nexport async function registerLibraries(options?: ConfigurationOptions) {\r\n\t// Setup configuration.\r\n\tconst configurationInstance = new ConfigurationService(options);\r\n\tContainer.set(ConfigurationService, configurationInstance);\r\n\r\n\t// Setup redis.\r\n\tconst redisInstance = new RedisService(configurationInstance.options.redisURL!);\r\n\tContainer.set(RedisService, redisInstance);\r\n\r\n\t// Setup secret\r\n\tconst secretInstance = new SecretManagerService(configurationInstance, redisInstance);\r\n\tContainer.set(SecretManagerService, secretInstance);\r\n\r\n\tconst mongoUrl = await getLibraries().getSecretsService().getKey('MONGO_URL');\r\n\r\n\tawait mongoose.connect(mongoUrl!, { dbName: `lyxa-${options!.environment}-${options!.tenet}` });\r\n\tmongoose.set(\r\n\t\t'debug',\r\n\t\tgetLibraries().getConfigurationService().options.environment == EnvironmentConfigurationType.DEV\r\n\t);\r\n\r\n\tawait initGlobalConnection(mongoUrl!, options!.environment);\r\n\r\n\t// Setup logger\r\n\tconst loggerInstance = new LyxaLogger(options!.instanceType!, mongoUrl!);\r\n\tContainer.set(LyxaLogger, loggerInstance);\r\n\r\n\t// Setup firebase\r\n\tconst firebaseInstance = new FirebaseService(configurationInstance!);\r\n\tContainer.set(FirebaseService, firebaseInstance);\r\n\r\n\t// Setup microservice dispatcher\r\n\tconst microserviceDispatcherInstance = new MicroServiceDispatcher(secretInstance);\r\n\tContainer.set(MicroServiceDispatcher, microserviceDispatcherInstance);\r\n\r\n\t// Setup twilio\r\n\tconst twilioServiceInstance = new TwilioService();\r\n\tContainer.set(TwilioService, twilioServiceInstance);\r\n\r\n\tconsole.log('Initialized everything');\r\n\r\n\tawait initEventBus('amqps://vgyuplrd:wto6vUYnb4zeBI5lntKT4gj7rT8n1vwg@dog.lmq.cloudamqp.com/vgyuplrd');\r\n\tconst allSubscriptions = SubscriptionRegistry.getAllSubscriptions();\r\n\r\n\tconst instantiatedServices = new Map<Function, any>();\r\n\r\n\tfor (const { eventId, targetConstructor, methodName } of allSubscriptions) {\r\n\t\tlet instance = instantiatedServices.get(targetConstructor);\r\n\t\tif (!instance) {\r\n\t\t\tinstance = Container.get(targetConstructor as any);\r\n\t\t\tinstantiatedServices.set(targetConstructor, instance);\r\n\t\t}\r\n\r\n\t\tawait subscribeToEvent(eventId, async payload => {\r\n\t\t\treturn instance[methodName](payload);\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport function getLibraries(): LibraryManager {\r\n\treturn Container.get(LibraryManager);\r\n}\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { SignOptions } from
|
|
2
|
-
import { EntityContext } from
|
|
3
|
-
import { RefreshToken } from
|
|
1
|
+
import { SignOptions } from 'jsonwebtoken';
|
|
2
|
+
import { EntityContext } from '../trpc/context';
|
|
3
|
+
import { RefreshToken } from './refreshtoken';
|
|
4
4
|
export declare enum AuthEntityType {
|
|
5
5
|
USER = "USER",
|
|
6
6
|
SELLER = "SELLER",
|
|
@@ -34,9 +34,7 @@ async function signAccessToken(entity, options) {
|
|
|
34
34
|
if (!entity?.type) {
|
|
35
35
|
throw new Error('Entity type is required to sign token');
|
|
36
36
|
}
|
|
37
|
-
const secret = await (0, index_1.getLibraries)()
|
|
38
|
-
.getSecretsService()
|
|
39
|
-
.getKey(`${entity.type.toUpperCase()}_JWT_TOKEN`);
|
|
37
|
+
const secret = await (0, index_1.getLibraries)().getSecretsService().getKey(`${entity.type.toUpperCase()}_JWT_TOKEN`);
|
|
40
38
|
if (!secret) {
|
|
41
39
|
throw new Error(`No secret found for entity type ${entity.type}`);
|
|
42
40
|
}
|
|
@@ -44,11 +42,11 @@ async function signAccessToken(entity, options) {
|
|
|
44
42
|
id: entity.id,
|
|
45
43
|
type: entity.type,
|
|
46
44
|
parameters: entity.parameters,
|
|
47
|
-
tokenType: TokenType.ACCESS
|
|
45
|
+
tokenType: TokenType.ACCESS,
|
|
48
46
|
};
|
|
49
47
|
const tokenOptions = {
|
|
50
48
|
...options,
|
|
51
|
-
expiresIn: options?.expiresIn || '1d'
|
|
49
|
+
expiresIn: options?.expiresIn || '1d',
|
|
52
50
|
};
|
|
53
51
|
return jsonwebtoken_1.default.sign(payload, secret, tokenOptions);
|
|
54
52
|
}
|
|
@@ -75,7 +73,7 @@ async function generateRefreshToken(entity, options) {
|
|
|
75
73
|
expiresAt.setDate(expiresAt.getDate() + value);
|
|
76
74
|
break;
|
|
77
75
|
case 'w':
|
|
78
|
-
expiresAt.setDate(expiresAt.getDate() +
|
|
76
|
+
expiresAt.setDate(expiresAt.getDate() + value * 7);
|
|
79
77
|
break;
|
|
80
78
|
case 'y':
|
|
81
79
|
expiresAt.setFullYear(expiresAt.getFullYear() + value);
|
|
@@ -95,7 +93,7 @@ async function generateRefreshToken(entity, options) {
|
|
|
95
93
|
entityType: entity.type,
|
|
96
94
|
expiresAt,
|
|
97
95
|
isRevoked: false,
|
|
98
|
-
metadata: entity.parameters
|
|
96
|
+
metadata: entity.parameters,
|
|
99
97
|
});
|
|
100
98
|
return tokenValue;
|
|
101
99
|
}
|
|
@@ -105,7 +103,9 @@ async function storeRefreshToken(tokenRecord) {
|
|
|
105
103
|
}
|
|
106
104
|
async function verifyAccessToken(entityTypes, token) {
|
|
107
105
|
for (const entityType of entityTypes) {
|
|
108
|
-
const secret = await (0, index_1.getLibraries)()
|
|
106
|
+
const secret = await (0, index_1.getLibraries)()
|
|
107
|
+
.getSecretsService()
|
|
108
|
+
.getKey(entityType.toUpperCase() + '_JWT_TOKEN');
|
|
109
109
|
try {
|
|
110
110
|
const decoded = jsonwebtoken_1.default.verify(token, secret);
|
|
111
111
|
if (decoded.tokenType !== TokenType.ACCESS) {
|
|
@@ -135,8 +135,8 @@ async function validateRefreshToken(token) {
|
|
|
135
135
|
entity: {
|
|
136
136
|
id: storedToken.entityId,
|
|
137
137
|
type: storedToken.entityType,
|
|
138
|
-
parameters: storedToken.metadata
|
|
139
|
-
}
|
|
138
|
+
parameters: storedToken.metadata,
|
|
139
|
+
},
|
|
140
140
|
};
|
|
141
141
|
}
|
|
142
142
|
async function refreshTokens(refreshToken) {
|
|
@@ -149,20 +149,20 @@ async function refreshTokens(refreshToken) {
|
|
|
149
149
|
const newAccessToken = await signAccessToken({
|
|
150
150
|
id: entity.id,
|
|
151
151
|
type: entity.type,
|
|
152
|
-
parameters: entity.parameters || {}
|
|
152
|
+
parameters: entity.parameters || {},
|
|
153
153
|
});
|
|
154
154
|
const newRefreshToken = await generateRefreshToken({
|
|
155
155
|
id: entity.id,
|
|
156
156
|
type: entity.type,
|
|
157
|
-
parameters: entity.parameters
|
|
157
|
+
parameters: entity.parameters,
|
|
158
158
|
});
|
|
159
159
|
return {
|
|
160
160
|
accessToken: newAccessToken,
|
|
161
161
|
refreshToken: newRefreshToken,
|
|
162
162
|
entity: {
|
|
163
163
|
id: entity.id,
|
|
164
|
-
type: entity.type
|
|
165
|
-
}
|
|
164
|
+
type: entity.type,
|
|
165
|
+
},
|
|
166
166
|
};
|
|
167
167
|
}
|
|
168
168
|
async function revokeRefreshToken(token) {
|
|
@@ -177,16 +177,16 @@ async function signTokenPair(entity, options) {
|
|
|
177
177
|
const accessToken = await signAccessToken({
|
|
178
178
|
id: entity.id,
|
|
179
179
|
type: entity.type,
|
|
180
|
-
parameters: entity.parameters || {}
|
|
180
|
+
parameters: entity.parameters || {},
|
|
181
181
|
}, options?.accessTokenOptions);
|
|
182
182
|
const refreshToken = await generateRefreshToken({
|
|
183
183
|
id: entity.id,
|
|
184
184
|
type: entity.type,
|
|
185
|
-
parameters: entity.parameters
|
|
185
|
+
parameters: entity.parameters,
|
|
186
186
|
}, { expiresIn: options?.refreshTokenExpiresIn });
|
|
187
187
|
return {
|
|
188
188
|
accessToken,
|
|
189
|
-
refreshToken
|
|
189
|
+
refreshToken,
|
|
190
190
|
};
|
|
191
191
|
}
|
|
192
192
|
async function handleTokenRenewal(refreshToken) {
|
|
@@ -195,27 +195,27 @@ async function handleTokenRenewal(refreshToken) {
|
|
|
195
195
|
if (!storedToken) {
|
|
196
196
|
return {
|
|
197
197
|
success: false,
|
|
198
|
-
tokenStatus: 'invalid'
|
|
198
|
+
tokenStatus: 'invalid',
|
|
199
199
|
};
|
|
200
200
|
}
|
|
201
201
|
const isRevoked = storedToken.isRevoked;
|
|
202
202
|
if (isRevoked) {
|
|
203
203
|
return {
|
|
204
204
|
success: false,
|
|
205
|
-
tokenStatus: 'revoked'
|
|
205
|
+
tokenStatus: 'revoked',
|
|
206
206
|
};
|
|
207
207
|
}
|
|
208
208
|
const isExpired = storedToken.isExpired();
|
|
209
209
|
const entityData = {
|
|
210
210
|
id: storedToken.entityId,
|
|
211
211
|
type: storedToken.entityType,
|
|
212
|
-
parameters: storedToken.metadata || {}
|
|
212
|
+
parameters: storedToken.metadata || {},
|
|
213
213
|
};
|
|
214
214
|
if (isExpired) {
|
|
215
215
|
const newTokens = await signTokenPair({
|
|
216
216
|
id: storedToken.entityId,
|
|
217
217
|
type: storedToken.entityType,
|
|
218
|
-
parameters: storedToken.metadata || {}
|
|
218
|
+
parameters: storedToken.metadata || {},
|
|
219
219
|
});
|
|
220
220
|
await tokenRepository.revokeRefreshToken(refreshToken);
|
|
221
221
|
return {
|
|
@@ -224,14 +224,14 @@ async function handleTokenRenewal(refreshToken) {
|
|
|
224
224
|
tokenStatus: 'expired',
|
|
225
225
|
newTokens: {
|
|
226
226
|
accessToken: newTokens.accessToken,
|
|
227
|
-
refreshToken: newTokens.refreshToken
|
|
228
|
-
}
|
|
227
|
+
refreshToken: newTokens.refreshToken,
|
|
228
|
+
},
|
|
229
229
|
};
|
|
230
230
|
}
|
|
231
231
|
const newAccessToken = await signAccessToken({
|
|
232
232
|
id: storedToken.entityId,
|
|
233
233
|
type: storedToken.entityType,
|
|
234
|
-
parameters: storedToken.metadata || {}
|
|
234
|
+
parameters: storedToken.metadata || {},
|
|
235
235
|
});
|
|
236
236
|
return {
|
|
237
237
|
success: true,
|
|
@@ -239,8 +239,8 @@ async function handleTokenRenewal(refreshToken) {
|
|
|
239
239
|
tokenStatus: 'valid',
|
|
240
240
|
newTokens: {
|
|
241
241
|
accessToken: newAccessToken,
|
|
242
|
-
refreshToken: null
|
|
243
|
-
}
|
|
242
|
+
refreshToken: null,
|
|
243
|
+
},
|
|
244
244
|
};
|
|
245
245
|
}
|
|
246
246
|
exports.RefreshTokenModel = (0, mongo_1.createGlobalModel)(refreshtoken_1.RefreshToken);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/auth/index.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt, { SignOptions, JwtPayload } from \"jsonwebtoken\";\r\nimport { EntityContext } from \"../trpc/context\";\r\nimport { randomBytes } from \"crypto\";\r\nimport {RefreshToken} from \"./refreshtoken\";\r\nimport {getLibraries} from \"../../index\";\r\nimport { createGlobalModel } from \"../mongo\";\r\n\r\nexport enum AuthEntityType {\r\n USER = \"USER\",\r\n SELLER = \"SELLER\",\r\n DELIVERY_BOY = \"DELIVERY_BOY\",\r\n CRM = \"CRM\"\r\n}\r\n\r\nexport enum TokenType {\r\n ACCESS = \"ACCESS\",\r\n REFRESH = \"REFRESH\"\r\n}\r\n\r\nexport interface RefreshTokenRecord {\r\n token: string;\r\n entityId: string;\r\n entityType: AuthEntityType;\r\n expiresAt: Date;\r\n isRevoked: boolean;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Sign a JWT access token for the given entity (id + type).\r\n * It will fetch the secret for that entity type and create a token.\r\n */\r\nexport async function signAccessToken(\r\n entity: { id: string; type: AuthEntityType, parameters: Record<string, unknown> },\r\n options?: SignOptions\r\n): Promise<string> {\r\n if (!entity?.type) {\r\n throw new Error('Entity type is required to sign token');\r\n }\r\n\r\n const secret = await getLibraries()\r\n .getSecretsService()\r\n .getKey(`${entity.type.toUpperCase()}_JWT_TOKEN`);\r\n\r\n if (!secret) {\r\n throw new Error(`No secret found for entity type ${entity.type}`);\r\n }\r\n\r\n const payload = {\r\n id: entity.id,\r\n type: entity.type,\r\n parameters: entity.parameters,\r\n tokenType: TokenType.ACCESS\r\n };\r\n\r\n const tokenOptions: SignOptions = {\r\n ...options,\r\n expiresIn: options?.expiresIn || '1d'\r\n };\r\n\r\n return jwt.sign(payload, secret, tokenOptions);\r\n}\r\n\r\n/**\r\n * Generate a refresh token for the given entity\r\n */\r\nexport async function generateRefreshToken(\r\n entity: { id: string; type: AuthEntityType, parameters?: Record<string, unknown> },\r\n options?: { expiresIn?: string | number }\r\n): Promise<string> {\r\n const tokenValue = randomBytes(40).toString('hex');\r\n\r\n const expiresIn = options?.expiresIn || '7d';\r\n const expiresAt = new Date();\r\n\r\n if (typeof expiresIn === 'string') {\r\n // Parse duration strings like '7d', '30d', etc.\r\n const match = expiresIn.match(/^(\\d+)([smhdwy])$/);\r\n if (match) {\r\n const value = parseInt(match[1]);\r\n const unit = match[2];\r\n\r\n switch (unit) {\r\n case 's': expiresAt.setSeconds(expiresAt.getSeconds() + value); break;\r\n case 'm': expiresAt.setMinutes(expiresAt.getMinutes() + value); break;\r\n case 'h': expiresAt.setHours(expiresAt.getHours() + value); break;\r\n case 'd': expiresAt.setDate(expiresAt.getDate() + value); break;\r\n case 'w': expiresAt.setDate(expiresAt.getDate() + (value * 7)); break;\r\n case 'y': expiresAt.setFullYear(expiresAt.getFullYear() + value); break;\r\n }\r\n } else {\r\n // Default to 7 days if format is invalid\r\n expiresAt.setDate(expiresAt.getDate() + 7);\r\n }\r\n } else if (typeof expiresIn === 'number') {\r\n // Interpret number as seconds\r\n expiresAt.setSeconds(expiresAt.getSeconds() + expiresIn);\r\n }\r\n\r\n await storeRefreshToken({\r\n token: tokenValue,\r\n entityId: entity.id,\r\n entityType: entity.type,\r\n expiresAt,\r\n isRevoked: false,\r\n metadata: entity.parameters\r\n });\r\n\r\n return tokenValue;\r\n}\r\n\r\n/**\r\n * Store a refresh token in the database\r\n */\r\nasync function storeRefreshToken(tokenRecord: RefreshTokenRecord): Promise<void> {\r\n const tokenRepository = getLibraries().getAuthTokenRepository();\r\n await tokenRepository.saveRefreshToken(tokenRecord);\r\n}\r\n\r\n/**\r\n * Verify an access token for the given entity types\r\n */\r\nexport async function verifyAccessToken(entityTypes: AuthEntityType[], token: string): Promise<EntityContext | undefined> {\r\n for(const entityType of entityTypes) {\r\n const secret = await getLibraries().getSecretsService().getKey(entityType.toUpperCase() + \"_JWT_TOKEN\");\r\n\r\n try {\r\n const decoded = jwt.verify(token, secret!) as EntityContext & { tokenType?: TokenType };\r\n\r\n // Verify this is an access token\r\n if (decoded.tokenType !== TokenType.ACCESS) {\r\n continue;\r\n }\r\n\r\n return decoded;\r\n } catch(err) {\r\n // Continue to the next entity type\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Validate a refresh token and return the associated entity\r\n */\r\nexport async function validateRefreshToken(token: string): Promise<{\r\n valid: boolean;\r\n entity?: { id: string; type: AuthEntityType; parameters?: Record<string, unknown> };\r\n}> {\r\n const tokenRepository = getLibraries().getAuthTokenRepository();\r\n const storedToken = await tokenRepository.findRefreshToken(token);\r\n\r\n if (!storedToken) {\r\n return { valid: false };\r\n }\r\n\r\n if (storedToken.expiresAt && new Date() > storedToken.expiresAt) {\r\n return { valid: false };\r\n }\r\n\r\n if (storedToken.isRevoked) {\r\n return { valid: false };\r\n }\r\n\r\n return {\r\n valid: true,\r\n entity: {\r\n id: storedToken.entityId,\r\n type: storedToken.entityType,\r\n parameters: storedToken.metadata\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Refresh authentication tokens\r\n * Returns new access and refresh tokens\r\n */\r\nexport async function refreshTokens(refreshToken: string): Promise<{\r\n accessToken: string;\r\n refreshToken: string;\r\n entity: { id: string; type: AuthEntityType };\r\n} | null> {\r\n // Validate the refresh token\r\n const validation = await validateRefreshToken(refreshToken);\r\n\r\n if (!validation.valid || !validation.entity) {\r\n return null;\r\n }\r\n\r\n await revokeRefreshToken(refreshToken);\r\n\r\n // Create new tokens\r\n const entity = validation.entity;\r\n const newAccessToken = await signAccessToken({\r\n id: entity.id,\r\n type: entity.type,\r\n parameters: entity.parameters || {}\r\n });\r\n\r\n const newRefreshToken = await generateRefreshToken({\r\n id: entity.id,\r\n type: entity.type,\r\n parameters: entity.parameters\r\n });\r\n\r\n return {\r\n accessToken: newAccessToken,\r\n refreshToken: newRefreshToken,\r\n entity: {\r\n id: entity.id,\r\n type: entity.type\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Revoke a refresh token\r\n */\r\nexport async function revokeRefreshToken(token: string): Promise<boolean> {\r\n const tokenRepository = getLibraries().getAuthTokenRepository();\r\n return tokenRepository.revokeRefreshToken(token);\r\n}\r\n\r\n/**\r\n * Revoke all refresh tokens for a specific entity\r\n */\r\nexport async function revokeAllRefreshTokens(entityId: string, entityType: AuthEntityType): Promise<boolean> {\r\n const tokenRepository = getLibraries().getAuthTokenRepository();\r\n return tokenRepository.revokeAllRefreshTokensForEntity(entityId, entityType);\r\n}\r\n\r\n/**\r\n * Sign both access and refresh tokens - utility for initial login/authentication\r\n */\r\nexport async function signTokenPair(\r\n entity: { id: string; type: AuthEntityType; parameters?: Record<string, unknown> },\r\n options?: { accessTokenOptions?: SignOptions; refreshTokenExpiresIn?: string | number }\r\n): Promise<{\r\n accessToken: string;\r\n refreshToken: string;\r\n}> {\r\n const accessToken = await signAccessToken({\r\n id: entity.id,\r\n type: entity.type,\r\n parameters: entity.parameters || {}\r\n }, options?.accessTokenOptions);\r\n\r\n const refreshToken = await generateRefreshToken({\r\n id: entity.id,\r\n type: entity.type,\r\n parameters: entity.parameters\r\n }, { expiresIn: options?.refreshTokenExpiresIn });\r\n\r\n return {\r\n accessToken,\r\n refreshToken\r\n };\r\n}\r\n\r\n/**\r\n * Handle the refresh token validation and renewal logic\r\n * @param refreshToken The refresh token to validate or renew\r\n * @returns Result object with token status and renewal information\r\n */\r\nexport async function handleTokenRenewal(\r\n refreshToken: string,\r\n): Promise<{\r\n success: boolean;\r\n entity?: {\r\n id: string;\r\n type: AuthEntityType;\r\n parameters: Record<string, unknown>;\r\n };\r\n tokenStatus: 'valid' | 'expired' | 'revoked' | 'invalid';\r\n newTokens?: {\r\n accessToken: string;\r\n refreshToken?: string | null;\r\n };\r\n}> {\r\n const tokenRepository = getLibraries().getAuthTokenRepository();\r\n\r\n const storedToken = await tokenRepository.findRefreshToken(refreshToken);\r\n\r\n if (!storedToken) {\r\n return {\r\n success: false,\r\n tokenStatus: 'invalid'\r\n };\r\n }\r\n\r\n const isRevoked = storedToken.isRevoked;\r\n if (isRevoked) {\r\n return {\r\n success: false,\r\n tokenStatus: 'revoked'\r\n };\r\n }\r\n\r\n const isExpired = storedToken.isExpired();\r\n\r\n const entityData = {\r\n id: storedToken.entityId,\r\n type: storedToken.entityType,\r\n parameters: storedToken.metadata || {}\r\n };\r\n\r\n if (isExpired) {\r\n const newTokens = await signTokenPair({\r\n id: storedToken.entityId,\r\n type: storedToken.entityType,\r\n parameters: storedToken.metadata || {}\r\n });\r\n\r\n await tokenRepository.revokeRefreshToken(refreshToken);\r\n\r\n return {\r\n success: true,\r\n entity: entityData,\r\n tokenStatus: 'expired',\r\n newTokens: {\r\n accessToken: newTokens.accessToken,\r\n refreshToken: newTokens.refreshToken\r\n }\r\n };\r\n }\r\n\r\n const newAccessToken = await signAccessToken({\r\n id: storedToken.entityId,\r\n type: storedToken.entityType,\r\n parameters: storedToken.metadata || {}\r\n });\r\n\r\n return {\r\n success: true,\r\n entity: entityData,\r\n tokenStatus: 'valid',\r\n newTokens: {\r\n accessToken: newAccessToken,\r\n refreshToken: null\r\n }\r\n };\r\n}\r\n\r\nexport const RefreshTokenModel = createGlobalModel(RefreshToken);\r\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/auth/index.ts"],"names":[],"mappings":";;;;;;AAgCA,0CA2BC;AAKD,oDAuDC;AAaD,8CAwBC;AAKD,oDA2BC;AAMD,sCAoCC;AAKD,gDAGC;AAKD,wDAGC;AAKD,sCA6BC;AAOD,gDA2EC;AA1WD,gEAA4D;AAE5D,mCAAqC;AACrC,iDAA8C;AAC9C,uCAA2C;AAC3C,oCAA6C;AAE7C,IAAY,cAKX;AALD,WAAY,cAAc;IACzB,+BAAa,CAAA;IACb,mCAAiB,CAAA;IACjB,+CAA6B,CAAA;IAC7B,6BAAW,CAAA;AACZ,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AAED,IAAY,SAGX;AAHD,WAAY,SAAS;IACpB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;AACpB,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAeM,KAAK,UAAU,eAAe,CACpC,MAAiF,EACjF,OAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAY,GAAE,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEzG,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAG;QACf,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,SAAS,CAAC,MAAM;KAC3B,CAAC;IAEF,MAAM,YAAY,GAAgB;QACjC,GAAG,OAAO;QACV,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;KACrC,CAAC;IAEF,OAAO,sBAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AAKM,KAAK,UAAU,oBAAoB,CACzC,MAAkF,EAClF,OAAyC;IAEzC,MAAM,UAAU,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAE7B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAEnC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,QAAQ,IAAI,EAAE,CAAC;gBACd,KAAK,GAAG;oBACP,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC;oBACrD,MAAM;gBACP,KAAK,GAAG;oBACP,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC;oBACrD,MAAM;gBACP,KAAK,GAAG;oBACP,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC;oBACjD,MAAM;gBACP,KAAK,GAAG;oBACP,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC;oBAC/C,MAAM;gBACP,KAAK,GAAG;oBACP,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;oBACnD,MAAM;gBACP,KAAK,GAAG;oBACP,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;oBACvD,MAAM;YACR,CAAC;QACF,CAAC;aAAM,CAAC;YAEP,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;IACF,CAAC;SAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAE1C,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,iBAAiB,CAAC;QACvB,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,SAAS;QACT,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,MAAM,CAAC,UAAU;KAC3B,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACnB,CAAC;AAKD,KAAK,UAAU,iBAAiB,CAAC,WAA+B;IAC/D,MAAM,eAAe,GAAG,IAAA,oBAAY,GAAE,CAAC,sBAAsB,EAAE,CAAC;IAChE,MAAM,eAAe,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;AACrD,CAAC;AAKM,KAAK,UAAU,iBAAiB,CACtC,WAA6B,EAC7B,KAAa;IAEb,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAY,GAAE;aACjC,iBAAiB,EAAE;aACnB,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,CAAC;QAElD,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAO,CAA8C,CAAC;YAGxF,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC5C,SAAS;YACV,CAAC;YAED,OAAO,OAAO,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;QAEf,CAAC;IACF,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAKM,KAAK,UAAU,oBAAoB,CAAC,KAAa;IAIvD,MAAM,eAAe,GAAG,IAAA,oBAAY,GAAE,CAAC,sBAAsB,EAAE,CAAC;IAChE,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAElE,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,WAAW,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,OAAO;QACN,KAAK,EAAE,IAAI;QACX,MAAM,EAAE;YACP,EAAE,EAAE,WAAW,CAAC,QAAQ;YACxB,IAAI,EAAE,WAAW,CAAC,UAAU;YAC5B,UAAU,EAAE,WAAW,CAAC,QAAQ;SAChC;KACD,CAAC;AACH,CAAC;AAMM,KAAK,UAAU,aAAa,CAAC,YAAoB;IAMvD,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAE5D,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAGvC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACjC,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC;QAC5C,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;KACnC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC;QAClD,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC7B,CAAC,CAAC;IAEH,OAAO;QACN,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,eAAe;QAC7B,MAAM,EAAE;YACP,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;SACjB;KACD,CAAC;AACH,CAAC;AAKM,KAAK,UAAU,kBAAkB,CAAC,KAAa;IACrD,MAAM,eAAe,GAAG,IAAA,oBAAY,GAAE,CAAC,sBAAsB,EAAE,CAAC;IAChE,OAAO,eAAe,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAKM,KAAK,UAAU,sBAAsB,CAAC,QAAgB,EAAE,UAA0B;IACxF,MAAM,eAAe,GAAG,IAAA,oBAAY,GAAE,CAAC,sBAAsB,EAAE,CAAC;IAChE,OAAO,eAAe,CAAC,+BAA+B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC9E,CAAC;AAKM,KAAK,UAAU,aAAa,CAClC,MAAkF,EAClF,OAAuF;IAKvF,MAAM,WAAW,GAAG,MAAM,eAAe,CACxC;QACC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;KACnC,EACD,OAAO,EAAE,kBAAkB,CAC3B,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAC9C;QACC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC7B,EACD,EAAE,SAAS,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAC7C,CAAC;IAEF,OAAO;QACN,WAAW;QACX,YAAY;KACZ,CAAC;AACH,CAAC;AAOM,KAAK,UAAU,kBAAkB,CAAC,YAAoB;IAa5D,MAAM,eAAe,GAAG,IAAA,oBAAY,GAAE,CAAC,sBAAsB,EAAE,CAAC;IAEhE,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAEzE,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO;YACN,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,SAAS;SACtB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;IACxC,IAAI,SAAS,EAAE,CAAC;QACf,OAAO;YACN,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,SAAS;SACtB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;IAE1C,MAAM,UAAU,GAAG;QAClB,EAAE,EAAE,WAAW,CAAC,QAAQ;QACxB,IAAI,EAAE,WAAW,CAAC,UAAU;QAC5B,UAAU,EAAE,WAAW,CAAC,QAAQ,IAAI,EAAE;KACtC,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;YACrC,EAAE,EAAE,WAAW,CAAC,QAAQ;YACxB,IAAI,EAAE,WAAW,CAAC,UAAU;YAC5B,UAAU,EAAE,WAAW,CAAC,QAAQ,IAAI,EAAE;SACtC,CAAC,CAAC;QAEH,MAAM,eAAe,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAEvD,OAAO;YACN,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,UAAU;YAClB,WAAW,EAAE,SAAS;YACtB,SAAS,EAAE;gBACV,WAAW,EAAE,SAAS,CAAC,WAAW;gBAClC,YAAY,EAAE,SAAS,CAAC,YAAY;aACpC;SACD,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC;QAC5C,EAAE,EAAE,WAAW,CAAC,QAAQ;QACxB,IAAI,EAAE,WAAW,CAAC,UAAU;QAC5B,UAAU,EAAE,WAAW,CAAC,QAAQ,IAAI,EAAE;KACtC,CAAC,CAAC;IAEH,OAAO;QACN,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE;YACV,WAAW,EAAE,cAAc;YAC3B,YAAY,EAAE,IAAI;SAClB;KACD,CAAC;AACH,CAAC;AAEY,QAAA,iBAAiB,GAAG,IAAA,yBAAiB,EAAC,2BAAY,CAAC,CAAC","sourcesContent":["import jwt, { SignOptions, JwtPayload } from 'jsonwebtoken';\r\nimport { EntityContext } from '../trpc/context';\r\nimport { randomBytes } from 'crypto';\r\nimport { RefreshToken } from './refreshtoken';\r\nimport { getLibraries } from '../../index';\r\nimport { createGlobalModel } from '../mongo';\r\n\r\nexport enum AuthEntityType {\r\n\tUSER = 'USER',\r\n\tSELLER = 'SELLER',\r\n\tDELIVERY_BOY = 'DELIVERY_BOY',\r\n\tCRM = 'CRM',\r\n}\r\n\r\nexport enum TokenType {\r\n\tACCESS = 'ACCESS',\r\n\tREFRESH = 'REFRESH',\r\n}\r\n\r\nexport interface RefreshTokenRecord {\r\n\ttoken: string;\r\n\tentityId: string;\r\n\tentityType: AuthEntityType;\r\n\texpiresAt: Date;\r\n\tisRevoked: boolean;\r\n\tmetadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Sign a JWT access token for the given entity (id + type).\r\n * It will fetch the secret for that entity type and create a token.\r\n */\r\nexport async function signAccessToken(\r\n\tentity: { id: string; type: AuthEntityType; parameters: Record<string, unknown> },\r\n\toptions?: SignOptions\r\n): Promise<string> {\r\n\tif (!entity?.type) {\r\n\t\tthrow new Error('Entity type is required to sign token');\r\n\t}\r\n\r\n\tconst secret = await getLibraries().getSecretsService().getKey(`${entity.type.toUpperCase()}_JWT_TOKEN`);\r\n\r\n\tif (!secret) {\r\n\t\tthrow new Error(`No secret found for entity type ${entity.type}`);\r\n\t}\r\n\r\n\tconst payload = {\r\n\t\tid: entity.id,\r\n\t\ttype: entity.type,\r\n\t\tparameters: entity.parameters,\r\n\t\ttokenType: TokenType.ACCESS,\r\n\t};\r\n\r\n\tconst tokenOptions: SignOptions = {\r\n\t\t...options,\r\n\t\texpiresIn: options?.expiresIn || '1d',\r\n\t};\r\n\r\n\treturn jwt.sign(payload, secret, tokenOptions);\r\n}\r\n\r\n/**\r\n * Generate a refresh token for the given entity\r\n */\r\nexport async function generateRefreshToken(\r\n\tentity: { id: string; type: AuthEntityType; parameters?: Record<string, unknown> },\r\n\toptions?: { expiresIn?: string | number }\r\n): Promise<string> {\r\n\tconst tokenValue = randomBytes(40).toString('hex');\r\n\r\n\tconst expiresIn = options?.expiresIn || '7d';\r\n\tconst expiresAt = new Date();\r\n\r\n\tif (typeof expiresIn === 'string') {\r\n\t\t// Parse duration strings like '7d', '30d', etc.\r\n\t\tconst match = expiresIn.match(/^(\\d+)([smhdwy])$/);\r\n\t\tif (match) {\r\n\t\t\tconst value = parseInt(match[1]);\r\n\t\t\tconst unit = match[2];\r\n\r\n\t\t\tswitch (unit) {\r\n\t\t\t\tcase 's':\r\n\t\t\t\t\texpiresAt.setSeconds(expiresAt.getSeconds() + value);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'm':\r\n\t\t\t\t\texpiresAt.setMinutes(expiresAt.getMinutes() + value);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'h':\r\n\t\t\t\t\texpiresAt.setHours(expiresAt.getHours() + value);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'd':\r\n\t\t\t\t\texpiresAt.setDate(expiresAt.getDate() + value);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'w':\r\n\t\t\t\t\texpiresAt.setDate(expiresAt.getDate() + value * 7);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'y':\r\n\t\t\t\t\texpiresAt.setFullYear(expiresAt.getFullYear() + value);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Default to 7 days if format is invalid\r\n\t\t\texpiresAt.setDate(expiresAt.getDate() + 7);\r\n\t\t}\r\n\t} else if (typeof expiresIn === 'number') {\r\n\t\t// Interpret number as seconds\r\n\t\texpiresAt.setSeconds(expiresAt.getSeconds() + expiresIn);\r\n\t}\r\n\r\n\tawait storeRefreshToken({\r\n\t\ttoken: tokenValue,\r\n\t\tentityId: entity.id,\r\n\t\tentityType: entity.type,\r\n\t\texpiresAt,\r\n\t\tisRevoked: false,\r\n\t\tmetadata: entity.parameters,\r\n\t});\r\n\r\n\treturn tokenValue;\r\n}\r\n\r\n/**\r\n * Store a refresh token in the database\r\n */\r\nasync function storeRefreshToken(tokenRecord: RefreshTokenRecord): Promise<void> {\r\n\tconst tokenRepository = getLibraries().getAuthTokenRepository();\r\n\tawait tokenRepository.saveRefreshToken(tokenRecord);\r\n}\r\n\r\n/**\r\n * Verify an access token for the given entity types\r\n */\r\nexport async function verifyAccessToken(\r\n\tentityTypes: AuthEntityType[],\r\n\ttoken: string\r\n): Promise<EntityContext | undefined> {\r\n\tfor (const entityType of entityTypes) {\r\n\t\tconst secret = await getLibraries()\r\n\t\t\t.getSecretsService()\r\n\t\t\t.getKey(entityType.toUpperCase() + '_JWT_TOKEN');\r\n\r\n\t\ttry {\r\n\t\t\tconst decoded = jwt.verify(token, secret!) as EntityContext & { tokenType?: TokenType };\r\n\r\n\t\t\t// Verify this is an access token\r\n\t\t\tif (decoded.tokenType !== TokenType.ACCESS) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\treturn decoded;\r\n\t\t} catch (err) {\r\n\t\t\t// Continue to the next entity type\r\n\t\t}\r\n\t}\r\n\r\n\treturn undefined;\r\n}\r\n\r\n/**\r\n * Validate a refresh token and return the associated entity\r\n */\r\nexport async function validateRefreshToken(token: string): Promise<{\r\n\tvalid: boolean;\r\n\tentity?: { id: string; type: AuthEntityType; parameters?: Record<string, unknown> };\r\n}> {\r\n\tconst tokenRepository = getLibraries().getAuthTokenRepository();\r\n\tconst storedToken = await tokenRepository.findRefreshToken(token);\r\n\r\n\tif (!storedToken) {\r\n\t\treturn { valid: false };\r\n\t}\r\n\r\n\tif (storedToken.expiresAt && new Date() > storedToken.expiresAt) {\r\n\t\treturn { valid: false };\r\n\t}\r\n\r\n\tif (storedToken.isRevoked) {\r\n\t\treturn { valid: false };\r\n\t}\r\n\r\n\treturn {\r\n\t\tvalid: true,\r\n\t\tentity: {\r\n\t\t\tid: storedToken.entityId,\r\n\t\t\ttype: storedToken.entityType,\r\n\t\t\tparameters: storedToken.metadata,\r\n\t\t},\r\n\t};\r\n}\r\n\r\n/**\r\n * Refresh authentication tokens\r\n * Returns new access and refresh tokens\r\n */\r\nexport async function refreshTokens(refreshToken: string): Promise<{\r\n\taccessToken: string;\r\n\trefreshToken: string;\r\n\tentity: { id: string; type: AuthEntityType };\r\n} | null> {\r\n\t// Validate the refresh token\r\n\tconst validation = await validateRefreshToken(refreshToken);\r\n\r\n\tif (!validation.valid || !validation.entity) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tawait revokeRefreshToken(refreshToken);\r\n\r\n\t// Create new tokens\r\n\tconst entity = validation.entity;\r\n\tconst newAccessToken = await signAccessToken({\r\n\t\tid: entity.id,\r\n\t\ttype: entity.type,\r\n\t\tparameters: entity.parameters || {},\r\n\t});\r\n\r\n\tconst newRefreshToken = await generateRefreshToken({\r\n\t\tid: entity.id,\r\n\t\ttype: entity.type,\r\n\t\tparameters: entity.parameters,\r\n\t});\r\n\r\n\treturn {\r\n\t\taccessToken: newAccessToken,\r\n\t\trefreshToken: newRefreshToken,\r\n\t\tentity: {\r\n\t\t\tid: entity.id,\r\n\t\t\ttype: entity.type,\r\n\t\t},\r\n\t};\r\n}\r\n\r\n/**\r\n * Revoke a refresh token\r\n */\r\nexport async function revokeRefreshToken(token: string): Promise<boolean> {\r\n\tconst tokenRepository = getLibraries().getAuthTokenRepository();\r\n\treturn tokenRepository.revokeRefreshToken(token);\r\n}\r\n\r\n/**\r\n * Revoke all refresh tokens for a specific entity\r\n */\r\nexport async function revokeAllRefreshTokens(entityId: string, entityType: AuthEntityType): Promise<boolean> {\r\n\tconst tokenRepository = getLibraries().getAuthTokenRepository();\r\n\treturn tokenRepository.revokeAllRefreshTokensForEntity(entityId, entityType);\r\n}\r\n\r\n/**\r\n * Sign both access and refresh tokens - utility for initial login/authentication\r\n */\r\nexport async function signTokenPair(\r\n\tentity: { id: string; type: AuthEntityType; parameters?: Record<string, unknown> },\r\n\toptions?: { accessTokenOptions?: SignOptions; refreshTokenExpiresIn?: string | number }\r\n): Promise<{\r\n\taccessToken: string;\r\n\trefreshToken: string;\r\n}> {\r\n\tconst accessToken = await signAccessToken(\r\n\t\t{\r\n\t\t\tid: entity.id,\r\n\t\t\ttype: entity.type,\r\n\t\t\tparameters: entity.parameters || {},\r\n\t\t},\r\n\t\toptions?.accessTokenOptions\r\n\t);\r\n\r\n\tconst refreshToken = await generateRefreshToken(\r\n\t\t{\r\n\t\t\tid: entity.id,\r\n\t\t\ttype: entity.type,\r\n\t\t\tparameters: entity.parameters,\r\n\t\t},\r\n\t\t{ expiresIn: options?.refreshTokenExpiresIn }\r\n\t);\r\n\r\n\treturn {\r\n\t\taccessToken,\r\n\t\trefreshToken,\r\n\t};\r\n}\r\n\r\n/**\r\n * Handle the refresh token validation and renewal logic\r\n * @param refreshToken The refresh token to validate or renew\r\n * @returns Result object with token status and renewal information\r\n */\r\nexport async function handleTokenRenewal(refreshToken: string): Promise<{\r\n\tsuccess: boolean;\r\n\tentity?: {\r\n\t\tid: string;\r\n\t\ttype: AuthEntityType;\r\n\t\tparameters: Record<string, unknown>;\r\n\t};\r\n\ttokenStatus: 'valid' | 'expired' | 'revoked' | 'invalid';\r\n\tnewTokens?: {\r\n\t\taccessToken: string;\r\n\t\trefreshToken?: string | null;\r\n\t};\r\n}> {\r\n\tconst tokenRepository = getLibraries().getAuthTokenRepository();\r\n\r\n\tconst storedToken = await tokenRepository.findRefreshToken(refreshToken);\r\n\r\n\tif (!storedToken) {\r\n\t\treturn {\r\n\t\t\tsuccess: false,\r\n\t\t\ttokenStatus: 'invalid',\r\n\t\t};\r\n\t}\r\n\r\n\tconst isRevoked = storedToken.isRevoked;\r\n\tif (isRevoked) {\r\n\t\treturn {\r\n\t\t\tsuccess: false,\r\n\t\t\ttokenStatus: 'revoked',\r\n\t\t};\r\n\t}\r\n\r\n\tconst isExpired = storedToken.isExpired();\r\n\r\n\tconst entityData = {\r\n\t\tid: storedToken.entityId,\r\n\t\ttype: storedToken.entityType,\r\n\t\tparameters: storedToken.metadata || {},\r\n\t};\r\n\r\n\tif (isExpired) {\r\n\t\tconst newTokens = await signTokenPair({\r\n\t\t\tid: storedToken.entityId,\r\n\t\t\ttype: storedToken.entityType,\r\n\t\t\tparameters: storedToken.metadata || {},\r\n\t\t});\r\n\r\n\t\tawait tokenRepository.revokeRefreshToken(refreshToken);\r\n\r\n\t\treturn {\r\n\t\t\tsuccess: true,\r\n\t\t\tentity: entityData,\r\n\t\t\ttokenStatus: 'expired',\r\n\t\t\tnewTokens: {\r\n\t\t\t\taccessToken: newTokens.accessToken,\r\n\t\t\t\trefreshToken: newTokens.refreshToken,\r\n\t\t\t},\r\n\t\t};\r\n\t}\r\n\r\n\tconst newAccessToken = await signAccessToken({\r\n\t\tid: storedToken.entityId,\r\n\t\ttype: storedToken.entityType,\r\n\t\tparameters: storedToken.metadata || {},\r\n\t});\r\n\r\n\treturn {\r\n\t\tsuccess: true,\r\n\t\tentity: entityData,\r\n\t\ttokenStatus: 'valid',\r\n\t\tnewTokens: {\r\n\t\t\taccessToken: newAccessToken,\r\n\t\t\trefreshToken: null,\r\n\t\t},\r\n\t};\r\n}\r\n\r\nexport const RefreshTokenModel = createGlobalModel(RefreshToken);\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DocumentType, ReturnModelType } from '@typegoose/typegoose';
|
|
2
2
|
import { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';
|
|
3
|
-
import { AuthEntityType } from
|
|
3
|
+
import { AuthEntityType } from './index';
|
|
4
4
|
export declare class RefreshToken extends TimeStamps {
|
|
5
5
|
token: string;
|
|
6
6
|
entityId: string;
|
|
@@ -23,11 +23,7 @@ let RefreshToken = RefreshToken_1 = class RefreshToken extends defaultClasses_1.
|
|
|
23
23
|
metadata;
|
|
24
24
|
static async findValidToken(token) {
|
|
25
25
|
const query = { token, isRevoked: false };
|
|
26
|
-
query.$or = [
|
|
27
|
-
{ expiresAt: { $exists: false } },
|
|
28
|
-
{ expiresAt: null },
|
|
29
|
-
{ expiresAt: { $gt: new Date() } }
|
|
30
|
-
];
|
|
26
|
+
query.$or = [{ expiresAt: { $exists: false } }, { expiresAt: null }, { expiresAt: { $gt: new Date() } }];
|
|
31
27
|
return this.findOne(query);
|
|
32
28
|
}
|
|
33
29
|
static async revokeAllForEntity(entityId, entityType) {
|
|
@@ -43,7 +39,7 @@ let RefreshToken = RefreshToken_1 = class RefreshToken extends defaultClasses_1.
|
|
|
43
39
|
const cutoffDate = olderThan || new Date();
|
|
44
40
|
const result = await this.deleteMany({
|
|
45
41
|
expiresAt: { $ne: null, $lt: cutoffDate },
|
|
46
|
-
isRevoked: true
|
|
42
|
+
isRevoked: true,
|
|
47
43
|
});
|
|
48
44
|
return result.deletedCount;
|
|
49
45
|
}
|
|
@@ -61,7 +57,7 @@ __decorate([
|
|
|
61
57
|
(0, typegoose_1.prop)({
|
|
62
58
|
required: true,
|
|
63
59
|
type: () => String,
|
|
64
|
-
enum: index_1.AuthEntityType
|
|
60
|
+
enum: index_1.AuthEntityType,
|
|
65
61
|
}),
|
|
66
62
|
__metadata("design:type", String)
|
|
67
63
|
], RefreshToken.prototype, "entityType", void 0);
|
|
@@ -83,11 +79,11 @@ exports.RefreshToken = RefreshToken = RefreshToken_1 = __decorate([
|
|
|
83
79
|
collection: 'refresh_tokens',
|
|
84
80
|
autoCreate: true,
|
|
85
81
|
toJSON: { virtuals: true },
|
|
86
|
-
toObject: { virtuals: true }
|
|
82
|
+
toObject: { virtuals: true },
|
|
87
83
|
},
|
|
88
84
|
options: {
|
|
89
|
-
allowMixed: typegoose_1.Severity.ALLOW
|
|
90
|
-
}
|
|
85
|
+
allowMixed: typegoose_1.Severity.ALLOW,
|
|
86
|
+
},
|
|
91
87
|
}),
|
|
92
88
|
(0, typegoose_1.index)({ entityId: 1, entityType: 1 }),
|
|
93
89
|
(0, typegoose_1.index)({ isRevoked: 1 })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refreshtoken.js","sourceRoot":"/","sources":["libraries/auth/refreshtoken.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"refreshtoken.js","sourceRoot":"/","sources":["libraries/auth/refreshtoken.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n\tprop,\r\n\tgetModelForClass,\r\n\tmodelOptions,\r\n\tindex,\r\n\tSeverity,\r\n\tDocumentType,\r\n\tReturnModelType,\r\n} from '@typegoose/typegoose';\r\nimport { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';\r\nimport { getLibraries } from '../../index';\r\nimport { AuthEntityType, RefreshTokenModel } from './index';\r\n\r\n@modelOptions({\r\n\tschemaOptions: {\r\n\t\tcollection: 'refresh_tokens',\r\n\t\tautoCreate: true,\r\n\t\ttoJSON: { virtuals: true },\r\n\t\ttoObject: { virtuals: true },\r\n\t},\r\n\toptions: {\r\n\t\tallowMixed: Severity.ALLOW, // Allow mixed types for metadata\r\n\t},\r\n})\r\n@index({ entityId: 1, entityType: 1 })\r\n@index({ isRevoked: 1 })\r\nexport class RefreshToken extends TimeStamps {\r\n\t@prop({ required: true, type: () => String, unique: true })\r\n\tpublic token!: string;\r\n\r\n\t@prop({ required: true, type: () => String })\r\n\tpublic entityId!: string;\r\n\r\n\t@prop({\r\n\t\trequired: true,\r\n\t\ttype: () => String,\r\n\t\tenum: AuthEntityType,\r\n\t})\r\n\tpublic entityType!: AuthEntityType;\r\n\r\n\t@prop({ required: false, type: () => Date })\r\n\tpublic expiresAt?: Date | null;\r\n\r\n\t@prop({ required: true, type: () => Boolean, default: false })\r\n\tpublic isRevoked!: boolean;\r\n\r\n\t@prop({ required: false, type: () => Object })\r\n\tpublic metadata?: Record<string, unknown>;\r\n\r\n\t/**\r\n\t * Static method to find a valid token\r\n\t */\r\n\tpublic static async findValidToken(\r\n\t\tthis: ReturnModelType<typeof RefreshToken>,\r\n\t\ttoken: string\r\n\t): Promise<DocumentType<RefreshToken> | null> {\r\n\t\tconst query: any = { token, isRevoked: false };\r\n\r\n\t\t// Only check expiration if token has an expiration date\r\n\t\tquery.$or = [{ expiresAt: { $exists: false } }, { expiresAt: null }, { expiresAt: { $gt: new Date() } }];\r\n\r\n\t\treturn this.findOne(query);\r\n\t}\r\n\r\n\t/**\r\n\t * Static method to revoke all tokens for an entity\r\n\t */\r\n\tpublic static async revokeAllForEntity(\r\n\t\tthis: ReturnModelType<typeof RefreshToken>,\r\n\t\tentityId: string,\r\n\t\tentityType: AuthEntityType\r\n\t): Promise<number> {\r\n\t\tconst result = await this.updateMany({ entityId, entityType, isRevoked: false }, { isRevoked: true });\r\n\r\n\t\treturn result.modifiedCount;\r\n\t}\r\n\r\n\t/**\r\n\t * Check if this token is expired\r\n\t */\r\n\tpublic isExpired(): boolean {\r\n\t\tif (!this.expiresAt) return false;\r\n\t\treturn new Date() > this.expiresAt;\r\n\t}\r\n\r\n\t/**\r\n\t * Static method to clean up old expired tokens\r\n\t * Call this periodically to keep your database clean\r\n\t */\r\n\tpublic static async cleanupExpiredTokens(\r\n\t\tthis: ReturnModelType<typeof RefreshToken>,\r\n\t\tolderThan?: Date\r\n\t): Promise<number> {\r\n\t\tconst cutoffDate = olderThan || new Date();\r\n\r\n\t\tconst result = await this.deleteMany({\r\n\t\t\texpiresAt: { $ne: null, $lt: cutoffDate },\r\n\t\t\tisRevoked: true, // Only delete tokens that are both expired and already revoked\r\n\t\t});\r\n\r\n\t\treturn result.deletedCount;\r\n\t}\r\n}\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AuthEntityType } from
|
|
2
|
-
import { DocumentType } from
|
|
3
|
-
import { RefreshToken } from
|
|
1
|
+
import { AuthEntityType } from './index';
|
|
2
|
+
import { DocumentType } from '@typegoose/typegoose';
|
|
3
|
+
import { RefreshToken } from './refreshtoken';
|
|
4
4
|
export declare class TokenRepository {
|
|
5
5
|
saveRefreshToken(token: {
|
|
6
6
|
token: string;
|
|
@@ -29,11 +29,7 @@ let TokenRepository = class TokenRepository {
|
|
|
29
29
|
entityId,
|
|
30
30
|
entityType,
|
|
31
31
|
isRevoked: false,
|
|
32
|
-
$or: [
|
|
33
|
-
{ expiresAt: { $exists: false } },
|
|
34
|
-
{ expiresAt: null },
|
|
35
|
-
{ expiresAt: { $gt: new Date() } }
|
|
36
|
-
]
|
|
32
|
+
$or: [{ expiresAt: { $exists: false } }, { expiresAt: null }, { expiresAt: { $gt: new Date() } }],
|
|
37
33
|
});
|
|
38
34
|
}
|
|
39
35
|
async cleanupExpiredTokens(olderThan) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"/","sources":["libraries/auth/repository.ts"],"names":[],"mappings":";;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"/","sources":["libraries/auth/repository.ts"],"names":[],"mappings":";;;;;;;;;AAAA,mCAA4D;AAG5D,mCAAiC;AAG1B,IAAM,eAAe,GAArB,MAAM,eAAe;IAI3B,KAAK,CAAC,gBAAgB,CAAC,KAOtB;QACA,OAAO,yBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAKD,KAAK,CAAC,gBAAgB,CAAC,KAAa;QACnC,OAAO,yBAAiB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAKD,KAAK,CAAC,kBAAkB,CAAC,KAAa;QACrC,MAAM,MAAM,GAAG,MAAM,yBAAiB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjF,OAAO,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;IACjC,CAAC;IAKD,KAAK,CAAC,+BAA+B,CAAC,QAAgB,EAAE,UAA0B;QACjF,MAAM,KAAK,GAAG,MAAM,yBAAiB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC/E,OAAO,KAAK,GAAG,CAAC,CAAC;IAClB,CAAC;IAKD,KAAK,CAAC,wBAAwB,CAC7B,QAAgB,EAChB,UAA0B;QAE1B,OAAO,yBAAiB,CAAC,IAAI,CAAC;YAC7B,QAAQ;YACR,UAAU;YACV,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC;SACjG,CAAC,CAAC;IACJ,CAAC;IAMD,KAAK,CAAC,oBAAoB,CAAC,SAAgB;QAC1C,OAAO,yBAAiB,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;CACD,CAAA;AA7DY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,gBAAO,GAAE;GACG,eAAe,CA6D3B","sourcesContent":["import { AuthEntityType, RefreshTokenModel } from './index';\r\nimport { DocumentType } from '@typegoose/typegoose';\r\nimport { RefreshToken } from './refreshtoken';\r\nimport { Service } from 'typedi';\r\n\r\n@Service()\r\nexport class TokenRepository {\r\n\t/**\r\n\t * Save a refresh token\r\n\t */\r\n\tasync saveRefreshToken(token: {\r\n\t\ttoken: string;\r\n\t\tentityId: string;\r\n\t\tentityType: AuthEntityType;\r\n\t\texpiresAt?: Date | null;\r\n\t\tisRevoked?: boolean;\r\n\t\tmetadata?: Record<string, unknown>;\r\n\t}): Promise<DocumentType<RefreshToken>> {\r\n\t\treturn RefreshTokenModel.create(token);\r\n\t}\r\n\r\n\t/**\r\n\t * Find a refresh token by its value\r\n\t */\r\n\tasync findRefreshToken(token: string): Promise<DocumentType<RefreshToken> | null> {\r\n\t\treturn RefreshTokenModel.findValidToken(token);\r\n\t}\r\n\r\n\t/**\r\n\t * Revoke a specific refresh token\r\n\t */\r\n\tasync revokeRefreshToken(token: string): Promise<boolean> {\r\n\t\tconst result = await RefreshTokenModel.updateOne({ token }, { isRevoked: true });\r\n\r\n\t\treturn result.modifiedCount > 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Revoke all refresh tokens for a specific entity\r\n\t */\r\n\tasync revokeAllRefreshTokensForEntity(entityId: string, entityType: AuthEntityType): Promise<boolean> {\r\n\t\tconst count = await RefreshTokenModel.revokeAllForEntity(entityId, entityType);\r\n\t\treturn count > 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Get all active tokens for an entity\r\n\t */\r\n\tasync getActiveTokensForEntity(\r\n\t\tentityId: string,\r\n\t\tentityType: AuthEntityType\r\n\t): Promise<DocumentType<RefreshToken>[]> {\r\n\t\treturn RefreshTokenModel.find({\r\n\t\t\tentityId,\r\n\t\t\tentityType,\r\n\t\t\tisRevoked: false,\r\n\t\t\t$or: [{ expiresAt: { $exists: false } }, { expiresAt: null }, { expiresAt: { $gt: new Date() } }],\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Clean up expired tokens (can be called periodically if needed)\r\n\t * Note: MongoDB TTL index will also handle this automatically for tokens with expiresAt\r\n\t */\r\n\tasync cleanupExpiredTokens(olderThan?: Date): Promise<number> {\r\n\t\treturn RefreshTokenModel.cleanupExpiredTokens(olderThan);\r\n\t}\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ServiceAccount } from
|
|
2
|
-
import { EnvironmentConfigurationType } from
|
|
1
|
+
import { ServiceAccount } from 'firebase-admin';
|
|
2
|
+
import { EnvironmentConfigurationType } from './types/EnvironmentConfigurationType';
|
|
3
3
|
export interface ConfigurationOptions {
|
|
4
4
|
tenet?: string;
|
|
5
5
|
redisURL?: string;
|
|
@@ -14,43 +14,43 @@ const typedi_1 = require("typedi");
|
|
|
14
14
|
const EnvironmentConfigurationType_1 = require("./types/EnvironmentConfigurationType");
|
|
15
15
|
let ConfigurationService = class ConfigurationService {
|
|
16
16
|
_defaultOptions = {
|
|
17
|
-
redisURL:
|
|
18
|
-
tenet:
|
|
19
|
-
instanceType:
|
|
17
|
+
redisURL: 'redis://default:8RCVCiwXRMo6isHgJanL1pE86cRt29YP@redis-12296.fcrce173.eu-west-1-1.ec2.redns.redis-cloud.com:12296',
|
|
18
|
+
tenet: 'default',
|
|
19
|
+
instanceType: 'unknown',
|
|
20
20
|
firebaseAdmin: {
|
|
21
21
|
super: {
|
|
22
22
|
firebaseAdminServiceAccount: {
|
|
23
|
-
projectId:
|
|
24
|
-
privateKey:
|
|
25
|
-
clientEmail:
|
|
26
|
-
}
|
|
23
|
+
projectId: 'for-poc-325210',
|
|
24
|
+
privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC5aI2nsMHkJbZf\nem9ycpd57RjRDsBt9Nb/uMjsFcBRuAKcKgh4lgNO6ZmcRwK10IRygCmbY5XxmtVA\nq9CT5tYlVN4SDzN1y4lL8/CL5owW2RZOURKcM0lsNOB9uGwkv1t3bfbBNc2hh9JX\n72t7URAtrtPAkUxtgEPm6WL03uNu8KCZ0G9uoA/oM7o8OIGkjC575D9V6QjYC9fn\nPjBRQ3K42fUWFmf31jtUBSHB0xE5qJI+MOi+OcXAJLxKQBbW+vqr2KfMwVYpNclp\nk0Ptfe8xZxVfKEJAAkacQ36Hp14wFK/q+2mmhOQlbruksOZCpaIkh5IdvGkkG8ZH\n566FgFHDAgMBAAECggEAJkuuqprLSZTyiOEQoOqDWBc9X3z1CSEfwV0I/x51BUwF\nGf1il4mgsE12wX03VZd2q/HF5kcZAvjQoFV8tPfidn6DieZi4itCthHyNutNNzDq\ntw1u0x2SxktbrQwJJkPyIAZyB7FVwk38B9a3dBanyU/JhAZe62UpYUoGev6IqnKm\nIiw7r4lc47XgJNrDjXhCtTwHBmXA6qt/HrBcu4fSZlnZMhvsgnO6iafXaBo15Rpy\nyVBVCPCGJBqpbqI8w3lVTcUqvD2DS+wGJAZSNFagt5qg+vCN8xVUsyQKrM1qIXZm\nxvPX5oE6CWaD5a7yzpwqKLghKIpsb+3gezyQiFw5rQKBgQDh9U+VdFipH2o8Rezd\n2d9Kp+ya8+kAog4NMeMyD/xyvKbmv6hW2SZqLhc5MacO0GiCnFR+dMLJxRBGnn+e\ngYP26OE2fG9Kn7JrSGafu7siKnonfaN/1IcHcZe/77P/s/o2lNxaVl9i1iPQlzr/\nN8RRaYa+pvazR4VNMS+Z6keD5QKBgQDSDxfKGwOt/GlPKRDmw3bKD4tseK36JsJw\n5u7im6CpiTEgSSbOCr1ggITv6VbHUK/Nv3mExJH6uuzd9szb94JUAxGbZ16Liwn4\nse+K2XlnLEnqxzFSkprOJAJkfbffrH+IxW8gNrK/UbjKT/xgEVH1ZeKUMPLCQG+y\nLAW6NY50hwKBgCYQTPfAQa87u4mrvdsheJv67cCslfOlWPigDsXAK6aoYPU+E/2N\nVwtL+F2KH7o/IVvfOdyTjryula9Pw+/PoYtWb5neHGFVxZiM+byuwzdeMHW2lHRU\nOOroF8gdeRT6HIxVR0lwg2EC8cWRtD6KBmgwfqJfPe+1fJ8kSgCDlsiBAoGBAI1D\nOyNeYW4bBhMHMeeOYY9nPsL2sUE92Zslolbgg/4fVds5dpAvpsWECGJy0Dn/6Ap8\njtMbgnRUSsDGnWP8IjgvTCLvNCSxn0YRG1+L+tnIbfkmdePq1ZJ1oupDpWkVTzsC\nU0Ydor2IzrW3bqiIXU6jculntYmu3a67biqYo7F3AoGBALoinJdtNLLqOqf/MumD\n+YmbzHqsuID2dGyct7GESIBx3a67hwyJQfCK8nyHNyWN7lFg+H1rZlu1Cjmo0hlu\nOxzdbWON5Rg2n3TbGw3AM1M55khsedbmm8MOSRdhIkz5RuYESSNAvVC6CBcfg5gb\nCPq8jrR+oljMjBwAaQmFlPF7\n-----END PRIVATE KEY-----\n',
|
|
25
|
+
clientEmail: 'lyxa-core@for-poc-325210.iam.gserviceaccount.com',
|
|
26
|
+
},
|
|
27
27
|
},
|
|
28
28
|
user: {
|
|
29
29
|
firebaseAdminServiceAccount: {
|
|
30
|
-
projectId:
|
|
31
|
-
privateKey:
|
|
32
|
-
clientEmail:
|
|
30
|
+
projectId: 'for-poc-325210',
|
|
31
|
+
privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9yUnAC2pQ+dhe\ndJVMS7RQeQdQO7JhT0BXz0MbpCXlEdc3j/GQAY9UfKxQLg1VZh+4An8aUZevOy/v\nUaHsvqSWcWg7UHTOjk861brpjdjhM4S4ahwU2NyVI/o0Bpc5ob4nhHebny9FGqEP\nauwUXiVw7UjA/yGeTN6delZwCxejHxI6zDjFQveo8Ljkfu49CMyyf1XhN9q0So4Q\n2pZ3Xmdz0fZGykSGT9TVBDnPE8Zc3VCQ1XQ7aEKr0e9L+YYidw+iurSNwQSo72uk\nf/G2wCtlAaoDh0lKObEbi1b925BOthP2XpmQ7Kv+iWVFouCY54Md56FxtjKOyYll\n0nS6MkAJAgMBAAECggEAEeee83UoPjQ6BVxAlxJ31BU8+0TshOlwB7C8MywC7rfm\nit2Dw8sf4W/DJmvX0nAYazjiEqKyuaOO98gm64HHX5GarKjgIjoTD7kJAZ6CIOnm\nOis5k75rXg8nPFgIVZW0rb/9tEL5984ltoGG/PtuUxdxwxJ20ptML8VySO8E93yt\n203zMlm/QdlUBBO+XDlpsEoXvUjQ6MzmCSF2LCFD1uBVmj0sVFuPt5fyodhV8gQM\nvDfG4duZ7AE6Nbc5ANgJw8fHMdx+AS+I0P50et936tuFOOeHUWGbg1RMOM1GrWLZ\nH83zfHp33R3rlUgleZetKh/5vLaW29MdJmACk2Z14QKBgQDtrywbz60ULHiyNvDP\nHFweJF/9EBq6MZeo/lYrBDZXuP3sBM7uUa+oYzYad3Lsxo1Vz/Zqb6atWX/BRbHT\nfyy6yTGPRn6geaqYEFuFwfBau3qju6DRwoqplVVlLo8lgOQzIDgXkk0nt7C/bM87\nmkxQI6Xi0TAjIpd3k6miw52laQKBgQDMaTnlL2OGlJlcycBZGxrKdsIwvK2jCLPi\njPTKM163htuzaItEVpJaCPjWaU3k3E1UXjFp9oxxvtDZOZP+DcFwGKvBe2vntFYz\nafCNlYK7wT/t7ChlCUSXuU/bSrXe4Wc4KGnJ6YzNmykMJku2b845layB1PxEhHHA\nRl2NEx9RoQKBgHJvETx+m2UIGEAtZXlBvTQh7TkIxOV6NPt/IHtrdsJ7ZX15vytM\nltbqlUTe160Z1zhGfOw3vzbczT5/UKN0KlPvw/WoShT3HuRBk97tRcxZUS19i2sS\nT/Jf3JJvfSngSX439+mZXZ5OuUEgoRGgMzeuQhLXBmcUI3rF1DlyFvdpAoGAfmq5\nbn8fSzUNn+/6MGFt8Tb/JAscS87vCTZpkb+xXUlfCJaoQqxTuLEBzAC2Nsr0XDAg\n2UqsUxBSs3VDjIRPVJc9adx9wH+sLAHhzn5fquR6OBesZ8gSjs8BjzqmPeAi6P09\nZ60z8lh6S1RH0N1WqhBh7q2dEnbirqoV41CnNuECgYEAr26tTBIvEeZY3gmAmOVl\nCw6gkxaHdzZplFl8Qnv272VllQpwbR1zaF6RfWsTEsrhrT+VtrZO6DDh9O6iJkbB\n7Re3BnMOhGfUS3HlPCFnkdodeaoeVpg4llYwuunmyj+SmNxnC56TiznML1owmUYd\ndLFeY+JZ0GpSBO0qYlY5QGk=\n-----END PRIVATE KEY-----\n',
|
|
32
|
+
clientEmail: 'firebase-adminsdk-onusy@for-poc-325210.iam.gserviceaccount.com',
|
|
33
33
|
},
|
|
34
|
-
firebaseAdminAppName:
|
|
34
|
+
firebaseAdminAppName: 'lyxa-user',
|
|
35
35
|
},
|
|
36
36
|
rider: {
|
|
37
37
|
firebaseAdminServiceAccount: {
|
|
38
|
-
projectId:
|
|
39
|
-
privateKey:
|
|
40
|
-
clientEmail:
|
|
38
|
+
projectId: 'lyxa-rider-88939',
|
|
39
|
+
privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC08zRqUjHFO7Ir\n4UNHIjxVp7oJkK3rrV1UGfHeHsijm6CSWjViVqsFKUZliYXTjg9S8rIMmC3OAMrh\n5FTdNfDell8YHPbVRWZ0OFBNWglvKMgMKMoyQuBKtvEAdZwgVMreOf+51QlZnPxy\nTBNh4Du2ahb8TtAjwxXt7CgMjNIfoMjQFJTrBTAmsxhtOEpYvPU2iX+OtAkHgrs1\nNeWpBGpN4GSwOfA8MdgvorLYbeRDnkY4cH/ReNymTW9nbX1vgsx2AE1NR5PTNxv0\nIuVZQWxMMGPnT5bjzAlCR4z/Nbe89V2zl5kFtBxDBCDqxp+qZxCinJj1QqwC5qzZ\nYLbNVKVPAgMBAAECggEAEHEGwrW24v/NF9KZ3S/zASoX1oBTD+vf4+E69QlMBshV\nxeaKHOYuF5khVd7cjj/wDC6ULLPJJFjga7e7rvaUl80G//cQcIl5STcdXiHqYzN2\nldrroGHWOm5hUJQ0fEroEgV9bc0PJ+7X5f9xRWlCqQz+YKzn7vqYwVZovyyDzS6/\nTus2SeWg0Qh1Uw4+FqveEqGBAMF9COTYJ/rZ5sDE34cYRJeZOgVDeSanF/CW6+VS\nLT5+ysRS8xY/mUFIgs6zvJQr7whDj22OzvZr31LReNUl1IGI1V0wHxCJs3y934dq\nuiAf4iX2w0uwiQs7+IQc6T6GhTEajWHSQqUtbDeecQKBgQDAW/mHk1PCCxZQtc6C\nCkFYONeY0zz7JAk7AvcbeVB6icq9Zv/9botFOvJ/4dduN39+sO/SIvLV+zQzmUGA\nygY58AQIqtYurIc8OjftQ5qZ6t9H1plmj/W+GVAYWadA68P95UBjwVcZySht47s/\ngOje4TF9wXVn9oTuP8XmLpce/wKBgQDw0Onl7EVmkgnyHl1qomqHR+2+xNDZNYMv\njdX0tq2KOXa6JpbO32Yf7LVKQo7bmSOy3M1kn2+lwCXsDufr/a+1GNRxuPucsYiM\nlQeLEKRqfNUni1NnbIUOkZV0fO0Me76Ow5BKqEWrda0E5k9g46p8EgVO5zWUE00w\nZZFTUn7JsQKBgDh9SiREYb6EXwNIwOJzfIkZ+EaLEkd2Z7eKwWKyF65EtOM2Ukrs\nob2s9/YSLp/RcIGWGHePh9zLLqNQiGn36igtkiGxecCvLe/D8RSeW9KDpRqFrPrv\nn+05pcng2js4gZAYOPaSmq+Z4WOUEzMs+jYpz8zseTwUqykEVWuplvulAoGAF8y9\n4RBZx4pVW01u9BP7LUWJlJoE/gKQ5YlCBP5s5kVJm5omu2lOwYb2X9F2JvPamFnE\nHta3BQ2ZcdwDRcp7rA05KcgbbeAJ28L6zN6nMTMHKfJWGtmZyNfQioOyNdKhAaEI\nSKiawhhOMjbEz5GQjtSFG8gz/l9t+IOBOlfj2fECgYBC8gGC7YHm+PvV5F1CVRZD\nUYVlAnqOMJ1VvfTemW/kPzuCMd/JEKSE+b21h3rObMvUZU5AnkM3VT1+hDv6tyEt\nblgh89YsHUor7wXSrYnVmYsrm91JABTWsLhLy92iqylg0xBs3Q5RGCt/s9f3YFFw\nKghNmTDraGggnf5U/Z4LJw==\n-----END PRIVATE KEY-----\n',
|
|
40
|
+
clientEmail: 'firebase-adminsdk-qwhrd@lyxa-rider-88939.iam.gserviceaccount.com',
|
|
41
41
|
},
|
|
42
|
-
firebaseAdminAppName:
|
|
42
|
+
firebaseAdminAppName: 'lyxa-rider',
|
|
43
43
|
},
|
|
44
44
|
shop: {
|
|
45
45
|
firebaseAdminServiceAccount: {
|
|
46
|
-
projectId:
|
|
47
|
-
privateKey:
|
|
48
|
-
clientEmail:
|
|
46
|
+
projectId: 'lyxa-shop',
|
|
47
|
+
privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDTWaf/QGSjk7po\nri+6Nzo/tep1UtgMSY4KscT3iCbepiAsw7C8NCQqz3wYEAFRwywbaCwUcUs5KUC7\n/e9TvpSQQksu10P9uP+c7wnAy+l0ay/15vWUV0usmDhMMvfjtDwS2RYTMEAdNUiZ\nOuMC3/DDCBHt0SC5WCNzz11jj/n5bdVOS02qHd8V/lbd46iVEYfFswkI5NBgV7CY\nnR2CoVcakPIeu9kEKdjXsJvf8+zCYtXPaFvcubQcnybOcg6usU+AHD1iwCRd6BrK\n2PpM3gy/eASLJtzg/JoU0CgqJICmfR8LvGk6iHTp7VMfPuCfggwYtO3W1kSHuW4I\nswbXYOJbAgMBAAECggEAMHKZ5xIsv66KiZp8SFSGnrolv7U430AxNlRf0Vo9hsZQ\nE9Lb/Zh6PfIIAUAR/VsfDj1H9XuvAbBqLW3dYbYLOjJoJ5mi9VNmDORiuPZFUrGL\ncfP6kYGdUDgol5cLagAT0UJAJC/oUom3VaDBDxSkjSCZc4l/1dzVa6O6RatoYvuW\nqtJa5WzPH6flqj9HuFZaaNSZKXSYLwMeQC7bzxjbX0lB6b1WM2EIxQopeewrSfKg\nvaw7zYHnu9cO6oA6I4A3VXhySp3G2VIMOIezfI24mP2Bnzori6xCVXcM7R1B2Trr\nlFUrdXb9Rp3ZR0Ul0jSqCmopmMPVgob8lyHhiqk5+QKBgQDd/PcIRP7OE0ZnfXtd\nxWMz1ggp9ub6bN/mFxw/OoyEVSfmlshDCvEeqoo2DxWGC+/0uiGuPHnDKDX+R0Ho\nqmlWcVPTSBmrQvi3+VBKfr6ZCwxoutCQo3SMlEMvqHDkjGhAsDg/yjkI8yS5jqZ5\nXtG+dYQpd9qY3t46Uar1+7lpJwKBgQDzu3CzElfr3xHAEdE+1pkiPixPuW+fHw1v\nwoc5e7hJA1Mtu0Gdj7g41mF37bUXYxIg3FgV5sS76XCxw1a3plj/y0n+qZXMq5xs\nZwgqrh4APjVXVRp9SSOvEXT0NanhWKiHMNncvteqThSEal27MDghEzqDmebkuOII\ng+KDmYp1rQKBgA0dhPrYGLXULbSvlTpVDydg3dqc28iv5gqSEvkpXGP1JAZbojlT\nzCsjqEbJXVwuGF89IABLUmZVWdtMGnjEmLSivXEeMWYM7uTvte6wzlH8dR866leh\nUKF9oPqP2RunsAEiaDBcokIFG4ZbBzrkfz/hcY2Bp0ig4kBP0un1lV7BAoGBAJ4L\n4MOt1Gd2KetzYk0uGPS0fkVgSLpVB4B+EvO6f0CRMGHKOH00UdBBa8i50qEMtBes\n6k2ha9cyQ8pxkYzbCIEuUJgbXbDvYyqEES6j435i2HH+FIRDZilC16T4G2Wt+PJZ\nQhy7f9vGb9WBp7AXT35bGql1pdyQ6rl80+hkKv2tAoGAe4yFOvIdEEdgEokp5Dem\nuPf1rikk5mYPMkXhrX0cH9Wd2rh9MiP2gJuL3PD3R9LLon+9EzdBs31MwpP9C06Y\nZmnuEfgYIewBHZbpRO+nsGX+AK15gbJUNk1RbWmUU7AvkHyo4eE6NnNVbygxaFSk\n0+8aYRpYzZRnyAn8Oo6o2No=\n-----END PRIVATE KEY-----\n',
|
|
48
|
+
clientEmail: 'firebase-adminsdk-w4v98@lyxa-shop.iam.gserviceaccount.com',
|
|
49
49
|
},
|
|
50
|
-
firebaseAdminAppName:
|
|
50
|
+
firebaseAdminAppName: 'lyxa-shop',
|
|
51
51
|
},
|
|
52
52
|
},
|
|
53
|
-
environment: EnvironmentConfigurationType_1.EnvironmentConfigurationType.DEV
|
|
53
|
+
environment: EnvironmentConfigurationType_1.EnvironmentConfigurationType.DEV,
|
|
54
54
|
};
|
|
55
55
|
_options;
|
|
56
56
|
constructor(options) {
|