Jelajahi Sumber

refs 125405: add types and serialize api response

Futa Arai 2 tahun lalu
induk
melakukan
ed5c99ca78

+ 4 - 5
apps/app/src/features/external-user-group/client/components/ExternalUserGroup/ExternalUserGroupManagement.tsx

@@ -105,15 +105,14 @@ export const ExternalGroupManagement: FC = () => {
       // sync
       await mutateExternalUserGroups();
 
-      setSelectedExternalUserGroup(undefined);
-      setDeleteModalShown(false);
+      hideDeleteModal();
 
       toastSuccess(`Deleted ${selectedExternalUserGroup?.name} group.`);
     }
     catch (err) {
       toastError(new Error('Unable to delete the groups'));
     }
-  }, [mutateExternalUserGroups, selectedExternalUserGroup]);
+  }, [mutateExternalUserGroups, selectedExternalUserGroup, hideDeleteModal]);
 
   const switchActiveTab = (selectedTab) => {
     setActiveTab(selectedTab);
@@ -139,7 +138,7 @@ export const ExternalGroupManagement: FC = () => {
       onEdit={showUpdateModal}
       onDelete={showDeleteModal}
       userGroupRelations={externalUserGroupRelations}
-      isExternalGroup={true}
+      isExternalGroup
     />
 
     <UserGroupModal
@@ -148,7 +147,7 @@ export const ExternalGroupManagement: FC = () => {
       onClickSubmit={updateExternalUserGroup}
       isShow={isUpdateModalShown}
       onHide={hideUpdateModal}
-      isExternalGroup={true}
+      isExternalGroup
     />
 
     <UserGroupDeleteModal

+ 4 - 4
apps/app/src/features/external-user-group/client/components/ExternalUserGroupDetail.tsx

@@ -187,13 +187,13 @@ const ExternalUserGroupDetailPage = (props: Props): JSX.Element => {
             ? ancestorExternalUserGroups[ancestorExternalUserGroups.length - 2] : undefined}
           submitButtonLabel={t('Update')}
           onSubmit={onClickSubmitForm}
-          isExternalGroup={true}
+          isExternalGroup
         />
       </div>
       <h2 className="admin-setting-header mt-4">{t('user_group_management.user_list')}</h2>
       <UserGroupUserTable
         userGroupRelations={externalUserGroupRelations}
-        isExternalGroup={true}
+        isExternalGroup
       />
 
       <h2 className="admin-setting-header mt-4">{t('user_group_management.child_group_list')}</h2>
@@ -204,7 +204,7 @@ const ExternalUserGroupDetailPage = (props: Props): JSX.Element => {
         onClickSubmit={updateChildExternalUserGroup}
         isShow={isUpdateModalShown}
         onHide={hideUpdateModal}
-        isExternalGroup={true}
+        isExternalGroup
       />
 
       <UserGroupTable
@@ -214,7 +214,7 @@ const ExternalUserGroupDetailPage = (props: Props): JSX.Element => {
         onEdit={showUpdateModal}
         onDelete={showDeleteModal}
         userGroupRelations={childUserGroupRelations}
-        isExternalGroup={true}
+        isExternalGroup
       />
 
       <UserGroupDeleteModal

+ 2 - 6
apps/app/src/features/external-user-group/server/models/external-user-group-relation.ts

@@ -1,7 +1,7 @@
 import { Schema, Model, Document } from 'mongoose';
 
 import { getOrCreateModel } from '../../../../server/util/mongoose-utils';
-import { IExternalUserGroupRelation } from '../../interfaces/external-user-group';
+import { IExternalUserGroupHasId, IExternalUserGroupRelation } from '../../interfaces/external-user-group';
 
 export interface ExternalUserGroupRelationDocument extends IExternalUserGroupRelation, Document {}
 
@@ -41,11 +41,7 @@ schema.statics.createRelations = async function(userGroupIds, user) {
    * @param {ExternalUserGroup} userGroup related group for remove
    * @returns {Promise<any>}
    */
-schema.statics.removeAllByUserGroups = function(groupsToDelete) {
-  if (!Array.isArray(groupsToDelete)) {
-    throw Error('groupsToDelete must be an array.');
-  }
-
+schema.statics.removeAllByUserGroups = function(groupsToDelete: IExternalUserGroupHasId[]) {
   return this.deleteMany({ relatedGroup: { $in: groupsToDelete } });
 };
 

+ 3 - 1
apps/app/src/features/external-user-group/server/routes/apiv3/external-user-group.ts

@@ -10,6 +10,7 @@ import { SupportedAction } from '~/interfaces/activity';
 import Crowi from '~/server/crowi';
 import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';
 import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
+import { serializeUserGroupRelationSecurely } from '~/server/models/serializers/user-group-relation-serializer';
 import { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
 import { configManager } from '~/server/service/config-manager';
 import loggerFactory from '~/utils/logger';
@@ -178,7 +179,8 @@ module.exports = (crowi: Crowi): Router => {
       const externalUserGroup = await ExternalUserGroup.findById(id);
       const userGroupRelations = await ExternalUserGroupRelation.find({ relatedGroup: externalUserGroup })
         .populate('relatedUser');
-      return res.apiv3({ userGroupRelations });
+      const serialized = userGroupRelations.map(relation => serializeUserGroupRelationSecurely(relation));
+      return res.apiv3({ userGroupRelations: serialized });
     }
     catch (err) {
       const msg = `Error occurred in fetching user group relations for external user group: ${id}`;

+ 1 - 5
apps/app/src/server/models/user-group.ts

@@ -49,11 +49,7 @@ schema.statics.findWithPagination = function(opts) {
 };
 
 
-schema.statics.findChildrenByParentIds = async function(parentIds, includeGrandChildren = false) {
-  if (!Array.isArray(parentIds)) {
-    throw Error('parentIds must be an array.');
-  }
-
+schema.statics.findChildrenByParentIds = async function(parentIds: string[], includeGrandChildren = false) {
   const childUserGroups = await this.find({ parent: { $in: parentIds } });
 
   let grandChildUserGroups: UserGroupDocument[] | null = null;

+ 3 - 1
apps/app/src/server/routes/apiv3/user-group.js

@@ -1,6 +1,7 @@
 import { ErrorV3 } from '@growi/core';
 
 import { SupportedAction } from '~/interfaces/activity';
+import { serializeUserGroupRelationSecurely } from '~/server/models/serializers/user-group-relation-serializer';
 import UserGroup from '~/server/models/user-group';
 import { excludeTestIdsFromTargetIds } from '~/server/util/compare-objectId';
 import loggerFactory from '~/utils/logger';
@@ -763,7 +764,8 @@ module.exports = (crowi) => {
     try {
       const userGroup = await UserGroup.findById(id);
       const userGroupRelations = await UserGroupRelation.findAllRelationForUserGroup(userGroup);
-      return res.apiv3({ userGroupRelations });
+      const serialized = userGroupRelations.map(relation => serializeUserGroupRelationSecurely(relation));
+      return res.apiv3({ userGroupRelations: serialized });
     }
     catch (err) {
       const msg = `Error occurred in fetching user group relations for group: ${id}`;