Przeglądaj źródła

Merge pull request #6113 from weseek/imprv/98232-search-only-available-action-groups

imprv: Search only available action groups
Shun Miyazawa 3 lat temu
rodzic
commit
80fbfd1070

+ 6 - 0
packages/app/src/interfaces/activity.ts

@@ -230,3 +230,9 @@ export type IActivity = {
 }
 
 export type IActivityHasId = IActivity & HasObjectId;
+
+export type ISearchFilter = {
+  usernames?: string[]
+  dates?: {startDate: string | null, endDate: string | null}
+  actions?: SupportedActionType[]
+}

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

@@ -3,7 +3,7 @@ import express, { Request, Router } from 'express';
 import rateLimit from 'express-rate-limit';
 import { query } from 'express-validator';
 
-import { AllSupportedAction } from '~/interfaces/activity';
+import { ISearchFilter } from '~/interfaces/activity';
 import Activity from '~/server/models/activity';
 import loggerFactory from '~/utils/logger';
 
@@ -46,23 +46,28 @@ module.exports = (crowi: Crowi): Router => {
     const query = {};
 
     try {
-      const parsedSearchFilter = JSON.parse(req.query.searchFilter as string);
+      const parsedSearchFilter = JSON.parse(req.query.searchFilter as string) as ISearchFilter;
 
       // add username to query
-      const canContainUsernameFilterToQuery = parsedSearchFilter.usernames.every(u => typeof u === 'string');
-      if (canContainUsernameFilterToQuery && parsedSearchFilter.usernames.length > 0) {
+      const canContainUsernameFilterToQuery = (
+        parsedSearchFilter.usernames != null
+        && parsedSearchFilter.usernames.length > 0
+        && parsedSearchFilter.usernames.every(u => typeof u === 'string')
+      );
+      if (canContainUsernameFilterToQuery) {
         Object.assign(query, { 'snapshot.username': parsedSearchFilter.usernames });
       }
 
       // add action to query
-      const canContainActionFilterToQuery = parsedSearchFilter.actions.every(a => AllSupportedAction.includes(a));
-      if (canContainActionFilterToQuery) {
-        Object.assign(query, { action: parsedSearchFilter.actions });
+      if (parsedSearchFilter.actions != null) {
+        const availableActions = crowi.activityService.getAvailableActions(false);
+        const searchableActions = parsedSearchFilter.actions.filter(action => availableActions.includes(action));
+        Object.assign(query, { action: searchableActions });
       }
 
       // add date to query
-      const startDate = parseISO(parsedSearchFilter.dates.startDate);
-      const endDate = parseISO(parsedSearchFilter.dates.endDate);
+      const startDate = parseISO(parsedSearchFilter?.dates?.startDate || '');
+      const endDate = parseISO(parsedSearchFilter?.dates?.endDate || '');
       if (isValid(startDate) && isValid(endDate)) {
         Object.assign(query, {
           createdAt: {

+ 4 - 2
packages/app/src/server/service/activity.ts

@@ -57,7 +57,7 @@ class ActivityService {
     });
   }
 
-  getAvailableActions = function(): SupportedActionType[] {
+  getAvailableActions = function(isIncludeEssentialActions = true): SupportedActionType[] {
     const auditLogActionGroupSize = this.crowi.configManager.getConfig('crowi', 'app:auditLogActionGroupSize') || ActionGroupSize.Small;
     const auditLogAdditionalActions = this.crowi.configManager.getConfig('crowi', 'app:auditLogAdditionalActions');
     const auditLogExcludeActions = this.crowi.configManager.getConfig('crowi', 'app:auditLogExcludeActions');
@@ -86,7 +86,9 @@ class ActivityService {
     excludeActions.forEach(action => availableActionsSet.delete(action));
 
     // Add essentialActions
-    AllSupportedActionToNotified.forEach(action => availableActionsSet.add(action));
+    if (isIncludeEssentialActions) {
+      AllSupportedActionToNotified.forEach(action => availableActionsSet.add(action));
+    }
 
     return Array.from(availableActionsSet);
   }

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

@@ -2,16 +2,9 @@ import { SWRResponse } from 'swr';
 import useSWRImmutable from 'swr/immutable';
 
 import { apiv3Get } from '../client/util/apiv3-client';
-import { IActivityHasId, SupportedActionType } from '../interfaces/activity';
+import { IActivityHasId, ISearchFilter } from '../interfaces/activity';
 import { PaginateResult } from '../interfaces/mongoose-utils';
 
-
-type ISearchFilter = {
-  usernames?: string[]
-  dates?: {startDate: string | null, endDate: string | null}
-  actions?: SupportedActionType[]
-}
-
 export const useSWRxActivity = (limit?: number, offset?: number, searchFilter?: ISearchFilter): SWRResponse<PaginateResult<IActivityHasId>, Error> => {
   const stringifiedSearchFilter = JSON.stringify(searchFilter);
   return useSWRImmutable(