paystack-nestjs
Version:
A library for integrating Paystack with NestJS. Supports webhooks
105 lines • 6.09 kB
JavaScript
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
;