note.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import {
  2. actionsBlock,
  3. buttonElement,
  4. inputBlock,
  5. inputSectionBlock,
  6. markdownHeaderBlock,
  7. } from '@growi/slack/dist/utils/block-kit-builder';
  8. import { SlackCommandHandlerError } from '~/server/models/vo/slack-command-handler-error';
  9. import loggerFactory from '~/utils/logger';
  10. const logger = loggerFactory('growi:service:SlackCommandHandler:note');
  11. /** @param {import('~/server/crowi').default} crowi Crowi instance */
  12. module.exports = (crowi) => {
  13. const CreatePageService = require('./create-page-service');
  14. const createPageService = new CreatePageService(crowi);
  15. const BaseSlackCommandHandler = require('./slack-command-handler');
  16. const handler = new BaseSlackCommandHandler();
  17. const conversationsSelectElement = {
  18. action_id: 'conversation',
  19. type: 'conversations_select',
  20. default_to_current_conversation: true,
  21. };
  22. const { User } = crowi.models;
  23. handler.handleCommand = async (growiCommand, client, body, respondUtil) => {
  24. await respondUtil.respond({
  25. text: 'Take a note on GROWI',
  26. blocks: [
  27. markdownHeaderBlock('Take a note on GROWI'),
  28. inputBlock(
  29. conversationsSelectElement,
  30. 'conversation',
  31. 'Channel name to display in the page to be created',
  32. ),
  33. inputSectionBlock('path', 'Page path', 'path_input', false, '/path'),
  34. inputSectionBlock(
  35. 'contents',
  36. 'Contents',
  37. 'contents_input',
  38. true,
  39. 'Input with Markdown...',
  40. ),
  41. actionsBlock(
  42. buttonElement({ text: 'Cancel', actionId: 'note:cancel' }),
  43. buttonElement({
  44. text: 'Create page',
  45. actionId: 'note:createPage',
  46. style: 'primary',
  47. }),
  48. ),
  49. ],
  50. });
  51. };
  52. handler.cancel = async (
  53. client,
  54. interactionPayload,
  55. interactionPayloadAccessor,
  56. respondUtil,
  57. ) => {
  58. await respondUtil.deleteOriginal();
  59. };
  60. handler.handleInteractions = async function (
  61. client,
  62. interactionPayload,
  63. interactionPayloadAccessor,
  64. handlerMethodName,
  65. respondUtil,
  66. ) {
  67. await this[handlerMethodName](
  68. client,
  69. interactionPayload,
  70. interactionPayloadAccessor,
  71. respondUtil,
  72. );
  73. };
  74. handler.createPage = async (
  75. client,
  76. interactionPayload,
  77. interactionPayloadAccessor,
  78. respondUtil,
  79. ) => {
  80. const user = await User.findUserBySlackMemberId(interactionPayload.user.id);
  81. const path =
  82. interactionPayloadAccessor.getStateValues()?.path.path_input.value;
  83. const contentsBody =
  84. interactionPayloadAccessor.getStateValues()?.contents.contents_input
  85. .value;
  86. if (path == null || contentsBody == null) {
  87. throw new SlackCommandHandlerError('All parameters are required.');
  88. }
  89. await createPageService.createPageInGrowi(
  90. interactionPayloadAccessor,
  91. path,
  92. contentsBody,
  93. respondUtil,
  94. user,
  95. );
  96. await respondUtil.deleteOriginal();
  97. };
  98. return handler;
  99. };