nestjs-slack-bolt
Version:
A NestJS module for seamless integration with Slack using the Bolt SDK
155 lines (154 loc) • 6.69 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 __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var SlackModule_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SlackModule = void 0;
const common_1 = require("@nestjs/common");
const explorer_service_1 = require("./services/explorer.service");
const slack_service_1 = require("./services/slack.service");
const config_1 = require("@nestjs/config");
const bolt_1 = require("@slack/bolt");
const logger_proxy_1 = require("./loggers/logger.proxy");
const tokens_1 = require("./tokens");
const createSlackConnection = {
provide: 'CONNECTION',
useFactory: (configService, loggerProxy, options) => {
var _a;
const logLevel = (_a = options.logLevel) !== null && _a !== void 0 ? _a : bolt_1.LogLevel.INFO;
loggerProxy.setName(tokens_1.SLACK);
loggerProxy.setLevel(logLevel);
const _b = options !== null && options !== void 0 ? options : {}, { token = configService.get('SLACK_BOT_TOKEN'), signingSecret = configService.get('SLACK_SIGNING_SECRET'), socketMode = !!configService.get('SLACK_SOCKET_MODE'), appToken = configService.get('SLACK_APP_TOKEN') } = _b, rest = __rest(_b, ["token", "signingSecret", "socketMode", "appToken"]);
const opts = Object.assign({ logger: loggerProxy, token,
signingSecret,
socketMode,
appToken,
logLevel }, rest);
return new bolt_1.App(opts);
},
inject: [config_1.ConfigService, logger_proxy_1.LoggerProxy, tokens_1.SLACK_MODULE_OPTIONS],
};
let SlackModule = SlackModule_1 = class SlackModule {
constructor(slackService, explorerService) {
this.slackService = slackService;
this.explorerService = explorerService;
}
static forRoot(options) {
return {
module: SlackModule_1,
imports: [config_1.ConfigModule.forRoot()],
providers: [
{
provide: tokens_1.SLACK_MODULE_OPTIONS,
useValue: options !== null && options !== void 0 ? options : {},
},
explorer_service_1.ExplorerService,
logger_proxy_1.LoggerProxy,
slack_service_1.SlackService,
createSlackConnection,
],
global: true,
exports: [slack_service_1.SlackService],
};
}
static forRootAsync(options) {
return {
module: SlackModule_1,
imports: [...(options.imports || []), config_1.ConfigModule.forRoot()],
providers: [
...this.createAsyncProviders(options),
explorer_service_1.ExplorerService,
logger_proxy_1.LoggerProxy,
slack_service_1.SlackService,
createSlackConnection,
],
global: true,
exports: [slack_service_1.SlackService],
};
}
/**
* Create providers based on the async options
* @param options The async module options
* @returns An array of providers
*/
static createAsyncProviders(options) {
if (options.useValue) {
return [
{
provide: tokens_1.SLACK_MODULE_OPTIONS,
useValue: options.useValue,
},
];
}
if (options.useFactory) {
return [
{
provide: tokens_1.SLACK_MODULE_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
},
];
}
if (options.useClass) {
return [
{
provide: options.useClass,
useClass: options.useClass,
},
{
provide: tokens_1.SLACK_MODULE_OPTIONS,
useFactory: async (optionsFactory) => optionsFactory.createSlackOptions(),
inject: [options.useClass],
},
];
}
if (options.useExisting) {
return [
{
provide: tokens_1.SLACK_MODULE_OPTIONS,
useFactory: async (optionsFactory) => optionsFactory.createSlackOptions(),
inject: [options.useExisting],
},
];
}
throw new Error('Invalid SlackModuleAsyncOptions configuration. Provide useValue, useFactory, useClass, or useExisting.');
}
onApplicationBootstrap() {
const { messages, actions, commands, events, shortcuts, views } = this.explorerService.explore();
this.slackService.registerMessages(messages);
this.slackService.registerActions(actions);
this.slackService.registerCommands(commands);
this.slackService.registerEvents(events);
this.slackService.registerShortcuts(shortcuts);
this.slackService.registerViews(views);
// TODO register other events handler
}
};
exports.SlackModule = SlackModule;
exports.SlackModule = SlackModule = SlackModule_1 = __decorate([
(0, common_1.Module)({
imports: [config_1.ConfigModule.forRoot()],
providers: [explorer_service_1.ExplorerService, logger_proxy_1.LoggerProxy, slack_service_1.SlackService],
exports: [slack_service_1.SlackService],
}),
__metadata("design:paramtypes", [slack_service_1.SlackService,
explorer_service_1.ExplorerService])
], SlackModule);