ViewInteractionPayloadDelegator.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { Service } from '@tsed/di';
  2. import {
  3. GrowiUriInjector, GrowiUriWithOriginalData, isGrowiUriWithOriginalData, TypedBlock,
  4. } from '~/interfaces/growi-uri-injector';
  5. // see: https://api.slack.com/reference/interaction-payloads/views
  6. type ViewElement = TypedBlock & {
  7. 'private_metadata'?: any,
  8. }
  9. // see: https://api.slack.com/reference/interaction-payloads/views
  10. type ViewInteractionPayload = TypedBlock & {
  11. view: {
  12. 'private_metadata'?: any,
  13. },
  14. }
  15. @Service()
  16. export class ViewInteractionPayloadDelegator implements GrowiUriInjector<any, ViewElement, any, ViewInteractionPayload> {
  17. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  18. shouldHandleToInject(data: any): data is ViewElement {
  19. return data.type != null && data.private_metadata != null;
  20. }
  21. inject(data: ViewElement, growiUri :string): void {
  22. const originalData = data.private_metadata;
  23. const urlWithOrgData: GrowiUriWithOriginalData = { growiUri, originalData };
  24. data.private_metadata = JSON.stringify(urlWithOrgData);
  25. }
  26. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  27. shouldHandleToExtract(data: any): data is ViewInteractionPayload {
  28. const { type, view } = data;
  29. if (type !== 'view_submission') {
  30. return false;
  31. }
  32. if (view.private_metadata == null) {
  33. return false;
  34. }
  35. try {
  36. const restoredData: any = JSON.parse(view.private_metadata);
  37. return isGrowiUriWithOriginalData(restoredData);
  38. }
  39. // when parsing failed
  40. catch (err) {
  41. return false;
  42. }
  43. }
  44. extract(data: ViewInteractionPayload): GrowiUriWithOriginalData {
  45. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
  46. const restoredData: GrowiUriWithOriginalData = JSON.parse(data.view.private_metadata!); // private_metadata must not be null at this moment
  47. data.view.private_metadata = restoredData.originalData;
  48. return restoredData;
  49. }
  50. }