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

transplant route action for brand logo

Yuki Takei 2 лет назад
Родитель
Сommit
c0be00aeae

+ 0 - 10
apps/app/src/server/routes/attachment/api.js

@@ -260,16 +260,6 @@ export const routesFactory = (crowi) => {
     return responseForAttachment(req, res, attachment, true);
   };
 
-  api.getBrandLogo = async function(req, res) {
-    const brandLogoAttachment = await Attachment.findOne({ attachmentType: AttachmentType.BRAND_LOGO });
-
-    if (brandLogoAttachment == null) {
-      return res.status(404).json(ApiResponse.error('Brand logo does not exist'));
-    }
-
-    return responseForAttachment(req, res, brandLogoAttachment);
-  };
-
   /**
    * @swagger
    *

+ 41 - 0
apps/app/src/server/routes/attachment/get-brand-logo.ts

@@ -0,0 +1,41 @@
+import express from 'express';
+import type {
+  Response, Router,
+} from 'express';
+
+import type { CrowiRequest } from '~/interfaces/crowi-request';
+import loggerFactory from '~/utils/logger';
+
+import type Crowi from '../../crowi';
+import { AttachmentType } from '../../interfaces/attachment';
+import { generateCertifyBrandLogoMiddleware } from '../../middlewares/certify-brand-logo';
+import { Attachment } from '../../models';
+import ApiResponse from '../../util/apiResponse';
+
+import { getActionFactory } from './get';
+
+
+const logger = loggerFactory('growi:routes:attachment:get-brand-logo');
+
+
+export const getBrandLogoRouterFactory = (crowi: Crowi): Router => {
+
+  const certifyBrandLogo = generateCertifyBrandLogoMiddleware(crowi);
+  const loginRequired = require('../../middlewares/login-required')(crowi, true);
+
+  const router = express.Router();
+
+  router.get('/brand-logo', certifyBrandLogo, loginRequired, async(req: CrowiRequest, res: Response) => {
+    const brandLogoAttachment = await Attachment.findOne({ attachmentType: AttachmentType.BRAND_LOGO });
+
+    if (brandLogoAttachment == null) {
+      return res.status(404).json(ApiResponse.error('Brand logo does not exist'));
+    }
+
+    const getAction = getActionFactory(crowi, brandLogoAttachment);
+
+    getAction(req, res);
+  });
+
+  return router;
+};

+ 76 - 71
apps/app/src/server/routes/attachment/get.ts

@@ -8,7 +8,7 @@ import type {
 import mongoose from 'mongoose';
 
 import { SupportedAction } from '~/interfaces/activity';
-import type { CrowiProperties } from '~/interfaces/crowi-request';
+import type { CrowiProperties, CrowiRequest } from '~/interfaces/crowi-request';
 import loggerFactory from '~/utils/logger';
 
 import type Crowi from '../../crowi';
@@ -64,20 +64,7 @@ export const validateGetRequest = async(req: ValidateGetRequest, res: ValidateGe
 };
 
 
-type GetRequest = CrowiProperties & Request<
-  { id: string },
-  any, any, any,
-  LocalsAfterDataInjection
->;
-
-type GetResponse = Response<
-  any,
-  LocalsAfterDataInjection
->
-
-export const setCommonHeadersToRes = (res: GetResponse): void => {
-  const { attachment } = res.locals;
-
+export const setCommonHeadersToRes = (res: Response, attachment: IAttachmentDocument): void => {
   res.set({
     ETag: `Attachment-${attachment._id}`,
     'Last-Modified': attachment.createdAt.toUTCString(),
@@ -107,74 +94,92 @@ export const setCommonHeadersToRes = (res: GetResponse): void => {
 };
 
 
-export const getRouterFactory = (crowi: Crowi): Router => {
+const generateActivityParameters = (req: CrowiRequest) => {
+  return {
+    ip:  req.ip,
+    endpoint: req.originalUrl,
+    action: SupportedAction.ACTION_ATTACHMENT_DOWNLOAD,
+    user: req.user?._id,
+    snapshot: {
+      username: req.user?.username,
+    },
+  };
+};
 
-  const loginRequired = require('../../middlewares/login-required')(crowi, true);
+export const getActionFactory = (crowi: Crowi, attachment: IAttachmentDocument) => {
+  return async(req: CrowiRequest, res: Response): Promise<void> => {
 
-  const router = express.Router();
+    const { fileUploadService } = crowi;
 
+    // add headers before evaluating 'req.fresh'
+    setCommonHeadersToRes(res, attachment);
 
-  const generateActivityParameters = (req: GetRequest) => {
-    return {
-      ip:  req.ip,
-      endpoint: req.originalUrl,
-      action: SupportedAction.ACTION_ATTACHMENT_DOWNLOAD,
-      user: req.user?._id,
-      snapshot: {
-        username: req.user?.username,
-      },
+    res.set({
+      'Content-Type': attachment.fileFormat,
+      // eslint-disable-next-line max-len
+      'Content-Security-Policy': "script-src 'unsafe-hashes'; style-src 'self' 'unsafe-inline'; object-src 'none'; require-trusted-types-for 'script'; media-src 'self'; default-src 'none';",
+      'Content-Disposition': `inline;filename*=UTF-8''${encodeURIComponent(attachment.originalName)}`,
+    });
+
+    const activityParameters = generateActivityParameters(req);
+    const createActivity = async() => {
+      await crowi.activityService.createActivity(activityParameters);
     };
+
+    // return 304 if request is "fresh"
+    // see: http://expressjs.com/en/5x/api.html#req.fresh
+    if (req.fresh) {
+      res.sendStatus(304);
+      createActivity();
+      return;
+    }
+
+    if (fileUploadService.canRespond()) {
+      fileUploadService.respond(res, attachment);
+      createActivity();
+      return;
+    }
+
+    try {
+      const readable = await fileUploadService.findDeliveryFile(attachment);
+      readable.pipe(res);
+    }
+    catch (e) {
+      logger.error(e);
+      res.json(ApiResponse.error(e.message));
+      return;
+    }
+
+    createActivity();
+    return;
   };
+};
+
+
+type GetRequest = CrowiProperties & Request<
+  { id: string },
+  any, any, any,
+  LocalsAfterDataInjection
+>;
 
+type GetResponse = Response<
+  any,
+  LocalsAfterDataInjection
+>
+
+export const getRouterFactory = (crowi: Crowi): Router => {
+
+  const loginRequired = require('../../middlewares/login-required')(crowi, true);
+
+  const router = express.Router();
 
   // note: validateGetRequest requires `req.params.id`
   router.get<{ id: string }>('/:id([0-9a-z]{24})',
     certifySharedPageAttachmentMiddleware, loginRequired, validateGetRequest,
-    async(req: GetRequest, res: GetResponse) => {
+    (req: GetRequest, res: GetResponse) => {
       const { attachment } = res.locals;
-
-      const { fileUploadService } = crowi;
-
-      // add headers before evaluating 'req.fresh'
-      setCommonHeadersToRes(res);
-
-      res.set({
-        'Content-Type': attachment.fileFormat,
-        // eslint-disable-next-line max-len
-        'Content-Security-Policy': "script-src 'unsafe-hashes'; style-src 'self' 'unsafe-inline'; object-src 'none'; require-trusted-types-for 'script'; media-src 'self'; default-src 'none';",
-        'Content-Disposition': `inline;filename*=UTF-8''${encodeURIComponent(attachment.originalName)}`,
-      });
-
-      const activityParameters = generateActivityParameters(req);
-      const createActivity = async() => {
-        await crowi.activityService.createActivity(activityParameters);
-      };
-
-      // return 304 if request is "fresh"
-      // see: http://expressjs.com/en/5x/api.html#req.fresh
-      if (req.fresh) {
-        res.sendStatus(304);
-        createActivity();
-        return;
-      }
-
-      if (fileUploadService.canRespond()) {
-        fileUploadService.respond(res, attachment);
-        createActivity();
-        return;
-      }
-
-      try {
-        const readable = await fileUploadService.findDeliveryFile(attachment);
-        readable.pipe(res);
-      }
-      catch (e) {
-        logger.error(e);
-        return res.json(ApiResponse.error(e.message));
-      }
-
-      createActivity();
-      return;
+      const getAction = getActionFactory(crowi, attachment);
+      getAction(req, res);
     });
 
   return router;

+ 1 - 0
apps/app/src/server/routes/attachment/index.ts

@@ -1 +1,2 @@
 export * from './get';
+export * from './get-brand-logo';

+ 2 - 3
apps/app/src/server/routes/index.js

@@ -5,7 +5,6 @@ import { middlewareFactory as rateLimiterFactory } from '~/features/rate-limiter
 
 import { generateAddActivityMiddleware } from '../middlewares/add-activity';
 import apiV1FormValidator from '../middlewares/apiv1-form-validator';
-import { generateCertifyBrandLogoMiddleware } from '../middlewares/certify-brand-logo';
 import { certifySharedPageAttachmentMiddleware } from '../middlewares/certify-shared-page-attachment';
 import { excludeReadOnlyUser } from '../middlewares/exclude-read-only-user';
 import injectResetOrderByTokenMiddleware from '../middlewares/inject-reset-order-by-token-middleware';
@@ -36,7 +35,6 @@ module.exports = function(crowi, app) {
   const loginRequiredStrictly = require('../middlewares/login-required')(crowi);
   const loginRequired = require('../middlewares/login-required')(crowi, true);
   const adminRequired = require('../middlewares/admin-required')(crowi);
-  const certifyBrandLogo = generateCertifyBrandLogoMiddleware(crowi);
   const addActivity = generateAddActivityMiddleware(crowi);
 
   const uploads = multer({ dest: `${crowi.tmpDir}uploads` });
@@ -111,7 +109,8 @@ module.exports = function(crowi, app) {
   app.post('/_api/admin/import/qiita'           , loginRequiredStrictly , adminRequired , csrfProtection, addActivity, admin.api.importDataFromQiita);
   app.post('/_api/admin/import/testQiitaAPI'    , loginRequiredStrictly , adminRequired , csrfProtection, addActivity, admin.api.testQiitaAPI);
 
-  app.get('/attachment/brand-logo' , certifyBrandLogo, loginRequired, attachmentApi.getBrandLogo);
+  // brand logo
+  app.use('/attachment', attachment.getBrandLogoRouterFactory(crowi));
 
   /*
    * Routes below are unavailable when maintenance mode