Shun Miyazawa 3 лет назад
Родитель
Сommit
af68298dd0

+ 3 - 4
packages/app/src/components/Admin/AuditLogManagement.tsx

@@ -32,10 +32,9 @@ export const AuditLogManagement: FC = () => {
    * Fetch
    */
   const selectedActionList = Array.from(actionMap.entries()).filter(v => v[1]).map(v => v[0]);
-  const query = {
-    action: selectedActionList,
-  };
-  const { data: activityListData, error } = useSWRxActivityList(PAGING_LIMIT, offset, query);
+  const searchFilter = { action: selectedActionList };
+
+  const { data: activityListData, error } = useSWRxActivityList(PAGING_LIMIT, offset, searchFilter);
   const activityList = activityListData?.docs != null ? activityListData.docs : [];
   const totalActivityNum = activityListData?.totalDocs != null ? activityListData.totalDocs : 0;
   const isLoading = activityListData === undefined && error == null;

+ 7 - 7
packages/app/src/server/routes/apiv3/activity.ts

@@ -2,7 +2,7 @@ import express, { Request, Router } from 'express';
 import rateLimit from 'express-rate-limit';
 import { query } from 'express-validator';
 
-import { IActivity } from '~/interfaces/activity';
+import { IActivity, AllSupportedActionType } from '~/interfaces/activity';
 import Activity from '~/server/models/activity';
 import loggerFactory from '~/utils/logger';
 
@@ -20,7 +20,7 @@ const validator = {
   list: [
     query('limit').optional().isInt({ max: 100 }).withMessage('limit must be a number less than or equal to 100'),
     query('offset').optional().isInt().withMessage('page must be a number'),
-    query('query').optional().isString().withMessage('query must be a string'),
+    query('searchFilter').optional().isString().withMessage('query must be a string'),
   ],
 };
 
@@ -43,15 +43,15 @@ module.exports = (crowi: Crowi): Router => {
   router.get('/', apiLimiter, accessTokenParser, loginRequiredStrictly, adminRequired, validator.list, apiV3FormValidator, async(req: Request, res: ApiV3Response) => {
     const limit = req.query.limit || await crowi.configManager?.getConfig('crowi', 'customize:showPageLimitationS') || 10;
     const offset = req.query.offset || 1;
-    const query = req.query.query as string || '';
+    const parsedSearchFilter = JSON.parse(req.query.searchFilter as string || '');
 
-    const parsedQuery = JSON.parse(query);
-    const q = {
-      action: parsedQuery.action,
+    const canContainActionFilterToQuery = parsedSearchFilter.action.every(a => AllSupportedActionType.includes(a));
+    const query = {
+      action: canContainActionFilterToQuery ? parsedSearchFilter.action : [],
     };
 
     try {
-      const paginationResult = await Activity.getPaginatedActivity(limit, offset, q);
+      const paginationResult = await Activity.getPaginatedActivity(limit, offset, query);
 
       const User = crowi.model('User');
       const serializedDocs = paginationResult.docs.map((doc: IActivity) => {

+ 8 - 7
packages/app/src/stores/activity.ts

@@ -2,18 +2,19 @@ import { SWRResponse } from 'swr';
 import useSWRImmutable from 'swr/immutable';
 
 import { apiv3Get } from '../client/util/apiv3-client';
-import { IActivityHasId } from '../interfaces/activity';
+import { IActivityHasId, SupportedActionType } from '../interfaces/activity';
 import { PaginateResult } from '../interfaces/mongoose-utils';
 
-type IQuery = {
-  action?: string[]
+
+type ISearchFilter = {
+  action?: SupportedActionType[]
 }
 
-export const useSWRxActivityList = (limit?: number, offset?: number, query?: IQuery): SWRResponse<PaginateResult<IActivityHasId>, Error> => {
-  const stringifiedQuery = JSON.stringify(query);
+export const useSWRxActivityList = (limit?: number, offset?: number, searchFilter?: ISearchFilter): SWRResponse<PaginateResult<IActivityHasId>, Error> => {
+  const stringifiedSearchFilter = JSON.stringify(searchFilter);
   return useSWRImmutable(
-    ['/activity', limit, offset, stringifiedQuery],
-    (endpoint, limit, offset, stringifiedQuery) => apiv3Get(endpoint, { limit, offset, query: stringifiedQuery })
+    ['/activity', limit, offset, stringifiedSearchFilter],
+    (endpoint, limit, offset, stringifiedSearchFilter) => apiv3Get(endpoint, { limit, offset, searchFilter: stringifiedSearchFilter })
       .then(result => result.data.serializedPaginationResult),
   );
 };