Przeglądaj źródła

Fixed import & Extended compare-id for string values

Taichi Masuyama 4 lat temu
rodzic
commit
36604391da

+ 1 - 1
packages/app/src/server/routes/admin.js

@@ -1,4 +1,5 @@
 import loggerFactory from '~/utils/logger';
+import UserGroup from '~/server/models/user-group';
 
 const logger = loggerFactory('growi:routes:admin');
 const debug = require('debug')('growi:routes:admin');
@@ -7,7 +8,6 @@ const debug = require('debug')('growi:routes:admin');
 module.exports = function(crowi, app) {
 
   const models = crowi.models;
-  const UserGroup = models.UserGroup;
   const UserGroupRelation = models.UserGroupRelation;
   const GlobalNotificationSetting = models.GlobalNotificationSetting;
 

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

@@ -1,5 +1,6 @@
 import loggerFactory from '~/utils/logger';
 import { excludeTestIdsFromTargetIds } from '~/server/util/compare-objectId';
+import UserGroup from '~/server/models/user-group';
 
 const logger = loggerFactory('growi:routes:apiv3:user-group'); // eslint-disable-line no-unused-vars
 
@@ -35,7 +36,6 @@ module.exports = (crowi) => {
   const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);
 
   const {
-    UserGroup,
     UserGroupRelation,
     User,
     Page,

+ 5 - 2
packages/app/src/server/service/page-grant.ts

@@ -141,7 +141,9 @@ class PageGrantService {
       grant, grantedUserIds: ObjectId[], grantedGroupId: ObjectId, includeApplicable: boolean,
   ): Promise<ComparableTarget> {
     if (includeApplicable) {
-      const applicableGroupIds = await UserGroup.findGroupsWithDescendantsById(grantedGroupId);
+      const applicableGroups = await UserGroup.findGroupsWithDescendantsById(grantedGroupId);
+      const applicableGroupIds = applicableGroups.map(g => g._id);
+
 
       return {
         grant,
@@ -187,7 +189,8 @@ class PageGrantService {
     if (testAncestor.grant === Page.GRANT_USER_GROUP) {
       // make a set of all users
       const grantedRelations = await UserGroupRelation.find({ relatedGroup: testAncestor.grantedGroup }, { _id: 0, relatedUser: 1 });
-      applicableGroupIds = await UserGroup.findGroupsWithDescendantsById(testAncestor.grantedGroup);
+      const grantedGroups = await UserGroup.findGroupsWithDescendantsById(testAncestor.grantedGroup);
+      applicableGroupIds = grantedGroups.map(g => g._id);
       applicableUserIds = Array.from(new Set(grantedRelations.map(r => r.relatedUser))) as ObjectId[];
     }
 

+ 19 - 11
packages/app/src/server/util/compare-objectId.ts

@@ -3,13 +3,21 @@ import mongoose from 'mongoose';
 type IObjectId = mongoose.Types.ObjectId;
 const ObjectId = mongoose.Types.ObjectId;
 
-export const compareObjectId = (id1: IObjectId, id2: IObjectId): boolean => {
-  return id1.toString() === id2.toString();
+const castToString = (val: string | IObjectId) => {
+  if (typeof val === 'string') {
+    return val;
+  }
+
+  return val.toString();
+};
+
+export const compareObjectId = (id1: IObjectId | string, id2: IObjectId | string): boolean => {
+  return castToString(id1) === castToString(id2);
 };
 
-export const isIncludesObjectId = (arr: IObjectId[], id: IObjectId): boolean => {
-  const _arr = arr.map(i => i.toString());
-  const _id = id.toString();
+export const isIncludesObjectId = (arr: (IObjectId | string)[], id: IObjectId | string): boolean => {
+  const _arr = arr.map(i => castToString(i));
+  const _id = castToString(id);
 
   return _arr.includes(_id);
 };
@@ -20,21 +28,21 @@ export const isIncludesObjectId = (arr: IObjectId[], id: IObjectId): boolean =>
  * @param testIds Array of mongoose.Types.ObjectId
  * @returns Array of mongoose.Types.ObjectId
  */
-export const excludeTestIdsFromTargetIds = (targetIds: IObjectId[], testIds: IObjectId[]): IObjectId[] => {
+export const excludeTestIdsFromTargetIds = (targetIds: (IObjectId | string)[], testIds: (IObjectId | string)[]): IObjectId[] => {
   // cast to string
-  const arr1 = targetIds.map(e => e.toString());
-  const arr2 = testIds.map(e => e.toString());
+  const arr1 = targetIds.map(e => castToString(e));
+  const arr2 = testIds.map(e => castToString(e));
 
   // filter
-  const excluded = arr2.filter(e => !arr1.includes(e));
+  const excluded = arr1.filter(e => !arr2.includes(e));
 
   // cast to ObjectId
   return excluded.map(e => new ObjectId(e));
 };
 
-export const removeDuplicates = (objectIds: IObjectId[]): IObjectId[] => {
+export const removeDuplicates = (objectIds: (IObjectId | string)[]): IObjectId[] => {
   // cast to string
-  const strs = objectIds.map(id => id.toString());
+  const strs = objectIds.map(id => castToString(id));
   const uniqueArr = Array.from(new Set(strs));
 
   // cast to ObjectId