|
|
@@ -1,9 +1,10 @@
|
|
|
-import mongoose from 'mongoose';
|
|
|
import { pagePathUtils, pathUtils, pageUtils } from '@growi/core';
|
|
|
import escapeStringRegexp from 'escape-string-regexp';
|
|
|
+import mongoose from 'mongoose';
|
|
|
|
|
|
-import UserGroup from '~/server/models/user-group';
|
|
|
+import { IRecordApplicableGrant } from '~/interfaces/page-grant';
|
|
|
import { PageDocument, PageModel } from '~/server/models/page';
|
|
|
+import UserGroup from '~/server/models/user-group';
|
|
|
import { isIncludesObjectId, excludeTestIdsFromTargetIds } from '~/server/util/compare-objectId';
|
|
|
|
|
|
const { addTrailingSlash } = pathUtils;
|
|
|
@@ -403,6 +404,48 @@ class PageGrantService {
|
|
|
return [normalizable, nonNormalizable];
|
|
|
}
|
|
|
|
|
|
+ async calcApplicableGrantData(page, user): Promise<IRecordApplicableGrant> {
|
|
|
+ const Page = mongoose.model('Page') as unknown as PageModel;
|
|
|
+ const UserGroupRelation = mongoose.model('UserGroupRelation') as any; // TODO: Typescriptize model
|
|
|
+
|
|
|
+ const parent = await Page.findById(page.parent);
|
|
|
+ if (parent == null) {
|
|
|
+ throw Error('The page\'s parent does not exist.');
|
|
|
+ }
|
|
|
+
|
|
|
+ const {
|
|
|
+ grant, grantedUsers, grantedGroup,
|
|
|
+ } = parent;
|
|
|
+
|
|
|
+ // Increment an object (type IRecordApplicableGrant)
|
|
|
+ // grant is never public, anyone with the link, nor specified
|
|
|
+ const data: IRecordApplicableGrant = {};
|
|
|
+
|
|
|
+ if (grant === Page.GRANT_OWNER) {
|
|
|
+ const grantedUser = grantedUsers[0];
|
|
|
+
|
|
|
+ const isUserApplicable = grantedUser.toString() === user._id.toString();
|
|
|
+
|
|
|
+ if (isUserApplicable) {
|
|
|
+ data[Page.GRANT_OWNER] = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ else if (grant === Page.GRANT_USER_GROUP) {
|
|
|
+ const group = await UserGroup.findById(grantedGroup);
|
|
|
+ if (group == null) {
|
|
|
+ throw Error('Group not found to calculate grant data.');
|
|
|
+ }
|
|
|
+
|
|
|
+ const applicableGroups = await UserGroupRelation.findGroupsWithDescendantsByGroupAndUser(group, user);
|
|
|
+
|
|
|
+ data[Page.GRANT_OWNER] = null;
|
|
|
+ data[Page.GRANT_USER_GROUP] = { applicableGroups };
|
|
|
+ }
|
|
|
+
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
export default PageGrantService;
|