UNPKG

paystack-nestjs

Version:

A library for integrating Paystack with NestJS. Supports webhooks

105 lines 6.09 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var PaystackModule_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.PaystackModule = void 0; const common_1 = require("@nestjs/common"); const constants_1 = require("@nestjs/common/constants"); const external_context_creator_1 = require("@nestjs/core/helpers/external-context-creator"); const nestjs_discovery_1 = require("@golevelup/nestjs-discovery"); const nestjs_modules_1 = require("@golevelup/nestjs-modules"); const paystack_sdk_1 = require("paystack-sdk"); const decorators_1 = require("./decorators"); const webhook_controller_1 = require("./webhook.controller"); const constants_2 = require("./constants"); const webhook_service_1 = require("./webhook.service"); const payload_service_1 = require("./payload.service"); const lodash_1 = require("lodash"); let PaystackModule = PaystackModule_1 = class PaystackModule extends (0, nestjs_modules_1.createConfigurableDynamicRootModule)(constants_2.PAYSTACK_MODULE_CONFIG_TOKEN, { imports: [nestjs_discovery_1.DiscoveryModule], providers: [ { provide: constants_2.PAYSTACK_CLIENT_TOKEN, useFactory({ secretKey }) { return new paystack_sdk_1.Paystack(secretKey); }, inject: [constants_2.PAYSTACK_MODULE_CONFIG_TOKEN], }, { provide: Symbol('WEBHOOK_CONTROLLER_HACK'), inject: [constants_2.PAYSTACK_MODULE_CONFIG_TOKEN], useFactory: ({ enableWebhook, webhookConfig, }) => { var _a; if (!enableWebhook) return; const controllerPrefix = (webhookConfig === null || webhookConfig === void 0 ? void 0 : webhookConfig.controllerPrefix) || 'paystack/webhook'; Reflect.defineMetadata(constants_1.PATH_METADATA, controllerPrefix, webhook_controller_1.PaystackWebhookController); (_a = webhookConfig === null || webhookConfig === void 0 ? void 0 : webhookConfig.decorators) === null || _a === void 0 ? void 0 : _a.forEach((decor) => decor(webhook_controller_1.PaystackWebhookController)); }, }, webhook_service_1.PaystackWebhookService, payload_service_1.PaystackPayloadService, ], exports: [constants_2.PAYSTACK_MODULE_CONFIG_TOKEN, constants_2.PAYSTACK_CLIENT_TOKEN], }) { constructor(discover, externalContextCreator, paystackModuleConfig) { super(); this.discover = discover; this.externalContextCreator = externalContextCreator; this.paystackModuleConfig = paystackModuleConfig; this.logger = new common_1.Logger(PaystackModule_1.name); } async onModuleInit() { if (!this.paystackModuleConfig.enableWebhook) { return; } this.logger.log('Initializing Paystack Module for webhooks'); const [paystackWebhookService] = ((await this.discover.providersWithMetaAtKey(constants_2.PAYSTACK_WEBHOOK_SERVICE)) || []).map((x) => x.discoveredClass.instance); if (!paystackWebhookService || !(paystackWebhookService instanceof webhook_service_1.PaystackWebhookService)) { throw new Error('Could not find instance of PaystackWebhookService'); } const eventHandlerMeta = await this.discover.providerMethodsWithMetaAtKey(constants_2.PAYSTACK_WEBHOOK_HANDLER); const grouped = (0, lodash_1.groupBy)(eventHandlerMeta, (x) => x.discoveredMethod.parentClass.name); const webhookHandlers = (0, lodash_1.flatten)(Object.keys(grouped).map((x) => { this.logger.log(`Registering Paystack webhook handlers from ${x}`); return grouped[x].map(({ discoveredMethod, meta: eventType }) => ({ key: eventType, handler: this.externalContextCreator.create(discoveredMethod.parentClass.instance, discoveredMethod.handler, discoveredMethod.methodName), })); })); const handleWebhook = async (webhookEvent) => { var _a, _b, _c; const { event } = webhookEvent; const handlers = webhookHandlers.filter((x) => x.key === event); if (handlers.length) { if ((_c = (_b = (_a = this.paystackModuleConfig) === null || _a === void 0 ? void 0 : _a.webhookConfig) === null || _b === void 0 ? void 0 : _b.loggingConfiguration) === null || _c === void 0 ? void 0 : _c.logMatchingEventHandlers) { this.logger.log(`Received webhook event for ${event}. Forwarding to ${handlers.length} event handlers`); } await Promise.all(handlers.map((x) => x.handler(webhookEvent))); } }; paystackWebhookService.handleWebhookEvent = handleWebhook; } }; PaystackModule = PaystackModule_1 = __decorate([ (0, common_1.Module)({ controllers: [webhook_controller_1.PaystackWebhookController], }), __param(2, (0, decorators_1.InjectPaystackModuleConfig)()), __metadata("design:paramtypes", [nestjs_discovery_1.DiscoveryService, external_context_creator_1.ExternalContextCreator, Object]) ], PaystackModule); exports.PaystackModule = PaystackModule; //# sourceMappingURL=module.js.map