index.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import UpdatePost from '~/server/models/update-post';
  2. import { toArrayFromCsv } from '~/utils/to-array-from-csv';
  3. import {
  4. prepareSlackMessageForPage,
  5. prepareSlackMessageForComment,
  6. } from '../../util/slack';
  7. /**
  8. * service class of UserNotification
  9. */
  10. export class UserNotificationService {
  11. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  12. crowi!: any;
  13. constructor(crowi) {
  14. this.crowi = crowi;
  15. }
  16. /**
  17. * fire user notification
  18. *
  19. * @memberof UserNotificationService
  20. *
  21. * @param {Page} page
  22. * @param {User} user
  23. * @param {string} slackChannelsStr comma separated string. e.g. 'general,channel1,channel2'
  24. * @param {string} mode 'create' or 'update' or 'comment'
  25. * @param {string} previousRevision
  26. * @param {Comment} comment
  27. */
  28. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  29. async fire(page, user, slackChannelsStr, mode, option, comment = {}): Promise<PromiseSettledResult<any>[]> {
  30. const {
  31. appService, slackIntegrationService,
  32. } = this.crowi;
  33. if (!slackIntegrationService.isSlackConfigured) {
  34. throw new Error('slackIntegrationService has not been set up');
  35. }
  36. // update slackChannels attribute asynchronously
  37. page.updateSlackChannels(slackChannelsStr);
  38. const opt = option || {};
  39. const previousRevision = opt.previousRevision || '';
  40. // "dev,slacktest" => [dev,slacktest]
  41. const slackChannels: (string|null)[] = toArrayFromCsv(slackChannelsStr);
  42. await this.putDefaultChannelIfEmpty(page.path, slackChannels);
  43. const appTitle = appService.getAppTitle();
  44. const siteUrl = appService.getSiteUrl();
  45. const promises = slackChannels.map(async(chan) => {
  46. let messageObj;
  47. if (mode === 'comment') {
  48. messageObj = prepareSlackMessageForComment(comment, user, appTitle, siteUrl, chan, page.path);
  49. }
  50. else {
  51. messageObj = prepareSlackMessageForPage(page, user, appTitle, siteUrl, chan, mode, previousRevision);
  52. }
  53. return slackIntegrationService.postMessage(messageObj);
  54. });
  55. return Promise.allSettled(promises);
  56. }
  57. private async putDefaultChannelIfEmpty(pagePath:string, slackChannels: (string|null)[]): Promise<void> {
  58. const updatePosts = await UpdatePost.findSettingsByPath(pagePath);
  59. slackChannels.push(...(updatePosts).map(up => up.channel));
  60. // insert null if empty to notify once
  61. if (slackChannels.length === 0) {
  62. slackChannels.push(null);
  63. }
  64. }
  65. }