Просмотр исходного кода

WIP: refactor GrowiUriInjector

Yuki Takei 4 лет назад
Родитель
Сommit
4b9cd5e13e

+ 30 - 7
packages/slackbot-proxy/src/interfaces/growi-uri-injector.ts

@@ -1,5 +1,28 @@
-import { GrowiReq } from './growi-to-slack/growi-req';
-import { SlackOauthReq } from './slack-to-growi/slack-oauth-req';
+// see: https://api.slack.com/reference/interaction-payloads/views
+export type ViewElement = {
+  type: string,
+  'private_metadata'?: any,
+}
+
+// see: https://api.slack.com/reference/interaction-payloads/views
+export type ViewInteractionPayload = {
+  type: string,
+  view: {
+    'private_metadata'?: any,
+  },
+}
+
+// see: https://api.slack.com/reference/block-kit/blocks
+export type BlockElement = {
+  type: string,
+  elements: { type: string }[],
+}
+
+// see: https://api.slack.com/reference/interaction-payloads/block-actions
+export type BlockActionsPayload = {
+  type: string,
+  actions: { type: string }[],
+}
 
 export type GrowiUriWithOriginalData = {
   growiUri: string,
@@ -16,13 +39,13 @@ export const isGrowiUriWithOriginalData = (data: any): data is GrowiUriWithOrigi
   return data.growiUri != null && data.originalData != null;
 };
 
-export interface GrowiUriInjector<IB, EP> {
+export interface GrowiUriInjector<IDATA extends ViewElement|BlockElement[], EDATA extends (ViewInteractionPayload|BlockActionsPayload)> {
 
-  shouldHandleToInject(req: GrowiReq): boolean;
-  inject(body: IB, growiUri:string): void;
+  shouldHandleToInject(data: IDATA): boolean;
+  inject(data: IDATA, growiUri:string): void;
 
-  shouldHandleToExtract(req: SlackOauthReq): boolean;
-  extract(payload: EP): GrowiUriWithOriginalData;
+  shouldHandleToExtract(data: EDATA): boolean;
+  extract(data: EDATA): GrowiUriWithOriginalData;
 
 }
 

+ 2 - 2
packages/slackbot-proxy/src/middlewares/slack-to-growi/extract-growi-uri-from-req.ts

@@ -18,11 +18,11 @@ export class ExtractGrowiUriFromReq implements IMiddleware {
     // TODO: get list from decorator
     const vipDelegators: ViewInteractionPayloadDelegator[] = [new ViewInteractionPayloadDelegator()];
     const bapDelegators: BlockActionsPayloadDelegator[] = [];
-    const delegators = vipDelegators.concat(bapDelegators);
 
     const parsedPayload = JSON.parse(req.body.payload);
 
-    for (const delegator of delegators) {
+    // iterate combined delegators
+    for (const delegator of [...vipDelegators, ...bapDelegators]) {
       if (delegator.shouldHandleToExtract(parsedPayload)) {
         const data = delegator.extract(parsedPayload);
         req.growiUri = data.growiUri;

+ 18 - 22
packages/slackbot-proxy/src/services/growi-uri-injector/ViewInteractionPayloadDelegator.ts

@@ -1,34 +1,30 @@
-import { GrowiUriInjector, GrowiUriWithOriginalData, isGrowiUriWithOriginalData } from '~/interfaces/growi-uri-injector';
-import { GrowiReq } from '~/interfaces/growi-to-slack/growi-req';
-import { SlackOauthReq } from '~/interfaces/slack-to-growi/slack-oauth-req';
+import {
+  GrowiUriInjector, GrowiUriWithOriginalData, isGrowiUriWithOriginalData, ViewElement, ViewInteractionPayload,
+} from '~/interfaces/growi-uri-injector';
 
-export class ViewInteractionPayloadDelegator implements GrowiUriInjector<{view: string}, {view: {'private_metadata': string}}> {
+export class ViewInteractionPayloadDelegator implements GrowiUriInjector<ViewElement, ViewInteractionPayload> {
 
-  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
-  shouldHandleToInject(req: GrowiReq): boolean {
-    return req.body.view != null;
+  shouldHandleToInject(data: ViewElement): boolean {
+    return data != null;
   }
 
-  inject(body: {view: string}, growiUri:string): void {
-    const parsedView = JSON.parse(body.view);
-    const originalData = JSON.stringify(parsedView.private_metadata);
+  inject(data: ViewElement, growiUri :string): void {
+    const originalData = data.private_metadata;
 
-    const data: GrowiUriWithOriginalData = { growiUri, originalData };
+    const urlWithOrgData: GrowiUriWithOriginalData = { growiUri, originalData };
 
-    parsedView.private_metadata = JSON.stringify(data);
-    body.view = JSON.stringify(parsedView);
+    data.private_metadata = JSON.stringify(urlWithOrgData);
   }
 
-  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
-  shouldHandleToExtract(req: SlackOauthReq): boolean {
-    const { type, view } = req.parsedPayload;
+  shouldHandleToExtract(data: ViewInteractionPayload): boolean {
+    const { type, view } = data;
     if (type !== 'view_submission') {
       return false;
     }
 
     try {
-      const data: any = JSON.parse(view.private_metadata);
-      return isGrowiUriWithOriginalData(data);
+      const restoredData: any = JSON.parse(view.private_metadata);
+      return isGrowiUriWithOriginalData(restoredData);
     }
     // when parsing failed
     catch (err) {
@@ -36,12 +32,12 @@ export class ViewInteractionPayloadDelegator implements GrowiUriInjector<{view:
     }
   }
 
-  extract(payload: {view: {'private_metadata': string}}): GrowiUriWithOriginalData {
+  extract(data: ViewInteractionPayload): GrowiUriWithOriginalData {
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    const data: GrowiUriWithOriginalData = JSON.parse(payload.view.private_metadata!); // private_metadata must not be null at this moment
-    payload.view.private_metadata = JSON.parse(data.originalData);
+    const restoredData: GrowiUriWithOriginalData = JSON.parse(data.view.private_metadata!); // private_metadata must not be null at this moment
+    data.view.private_metadata = JSON.parse(restoredData.originalData);
 
-    return data;
+    return restoredData;
   }
 
 }