UNPKG

nestjs-supabase-webhooks

Version:
112 lines 6.47 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 SupabaseModule_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.SupabaseModule = void 0; const nestjs_discovery_1 = require("@golevelup/nestjs-discovery"); const nestjs_modules_1 = require("@golevelup/nestjs-modules"); const common_1 = require("@nestjs/common"); const constants_1 = require("@nestjs/common/constants"); const lodash_1 = require("lodash"); const external_context_creator_1 = require("@nestjs/core/helpers/external-context-creator"); const supabase_event_handler_controller_1 = require("./supabase.event-handler.controller"); const supabase_constants_1 = require("./supabase.constants"); const supabase_decorators_1 = require("./supabase.decorators"); const supabase_event_handler_service_1 = require("./supabase.event-handler.service"); const supabase_event_handler_guard_1 = require("./supabase.event-handler.guard"); function isSupabaseEvent(value) { return ['type', 'table', 'schema'].every((it) => it in value); } let SupabaseModule = SupabaseModule_1 = class SupabaseModule extends (0, nestjs_modules_1.createConfigurableDynamicRootModule)(supabase_constants_1.SUPABASE_MODULE_CONFIG, { providers: [ { provide: Symbol('CONTROLLER_HACK'), useFactory: (config) => { var _a; const controllerPrefix = 'supabase'; Reflect.defineMetadata(constants_1.PATH_METADATA, controllerPrefix, supabase_event_handler_controller_1.EventHandlerController); (_a = config.decorators) === null || _a === void 0 ? void 0 : _a.forEach((deco) => { deco(supabase_event_handler_controller_1.EventHandlerController); }); }, inject: [supabase_constants_1.SUPABASE_MODULE_CONFIG], }, supabase_event_handler_service_1.EventHandlerService, supabase_event_handler_guard_1.SupabaseEventHandlerHeaderGuard, ], }) { constructor(discover, externalContextCreator, supabaseModuleConfig) { super(); this.discover = discover; this.externalContextCreator = externalContextCreator; this.supabaseModuleConfig = supabaseModuleConfig; this.logger = new common_1.Logger(SupabaseModule_1.name); } async onModuleInit() { this.logger.log('Initializing Supabase Webhooks Module'); const eventHandlerMeta = await this.discover.providerMethodsWithMetaAtKey(supabase_constants_1.SUPABASE_EVENT_HANDLER); if (!eventHandlerMeta.length) { this.logger.log('No Supabase Webhooks event handlers were discovered'); return; } this.logger.log(`Discovered ${eventHandlerMeta.length} Supabase Webhooks event handlers`); const grouped = (0, lodash_1.groupBy)(eventHandlerMeta, (x) => x.discoveredMethod.parentClass.name); const eventHandlers = (0, lodash_1.flatten)(Object.keys(grouped).map((x) => { this.logger.log(`Registering supabase webhooks event handlers from ${x}`); return grouped[x].map(({ discoveredMethod, meta: config }) => { return { key: `${config.type}-${config.schema}-${config.table}`, handler: this.externalContextCreator.create(discoveredMethod.parentClass.instance, discoveredMethod.handler, discoveredMethod.methodName, undefined, // metadataKey undefined, // paramsFactory undefined, // contextId undefined, // inquirerId undefined, // options 'supabase_webhook_event'), }; }); })); const [eventHandlerServiceInstance] = await (await this.discover.providers((x) => x.name === supabase_event_handler_service_1.EventHandlerService.name)).map((x) => x.instance); const eventHandlerService = eventHandlerServiceInstance; eventHandlerService.handleEvent = (evt) => { if (!isSupabaseEvent(evt)) { throw new Error('Not a Supabase Event'); } const keys = [`${evt.type}-${evt === null || evt === void 0 ? void 0 : evt.schema}-${evt === null || evt === void 0 ? void 0 : evt.table}`]; // TODO: this should use a map for faster lookups const handlers = eventHandlers.filter((x) => keys.includes(x.key)); if (this.supabaseModuleConfig.enableEventLogs) { this.logger.log(`[${evt === null || evt === void 0 ? void 0 : evt.type}] ${evt === null || evt === void 0 ? void 0 : evt.schema}.${evt === null || evt === void 0 ? void 0 : evt.table}`); } if (handlers && handlers.length) { return Promise.all(handlers.map((x) => x.handler(evt))); } else { const errorMessage = `Handler not found for ${keys}`; this.logger.error(errorMessage); throw new common_1.BadRequestException(errorMessage); } }; } }; exports.SupabaseModule = SupabaseModule; exports.SupabaseModule = SupabaseModule = SupabaseModule_1 = __decorate([ (0, common_1.Module)({ imports: [nestjs_discovery_1.DiscoveryModule], controllers: [supabase_event_handler_controller_1.EventHandlerController], }), __param(2, (0, supabase_decorators_1.InjectSupabaseConfig)()), __metadata("design:paramtypes", [nestjs_discovery_1.DiscoveryService, external_context_creator_1.ExternalContextCreator, Object]) ], SupabaseModule); //# sourceMappingURL=supabase.module.js.map