From a92911c0e4ccfdb012c10f9cf3d2a8c3a3cf1ac4 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 8 Jan 2025 03:00:20 +0000 Subject: [PATCH 1/6] fix: make grantedUsers optional in IPage interface and handle potential null in page route --- apps/app/src/server/routes/apiv3/page/index.ts | 2 +- packages/core/src/interfaces/page.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/server/routes/apiv3/page/index.ts b/apps/app/src/server/routes/apiv3/page/index.ts index 22f32c2236d..c80ded8bdb6 100644 --- a/apps/app/src/server/routes/apiv3/page/index.ts +++ b/apps/app/src/server/routes/apiv3/page/index.ts @@ -530,7 +530,7 @@ module.exports = (crowi) => { } = page; let isGrantNormalized = false; try { - const grantedUsersId = grantedUsers.map(ref => getIdForRef(ref)); + const grantedUsersId = grantedUsers?.map(ref => getIdForRef(ref)); isGrantNormalized = await pageGrantService.isGrantNormalized(req.user, path, grant, grantedUsersId, grantedGroups, false, false); } catch (err) { diff --git a/packages/core/src/interfaces/page.ts b/packages/core/src/interfaces/page.ts index 491c93b52e3..3c7444d28db 100644 --- a/packages/core/src/interfaces/page.ts +++ b/packages/core/src/interfaces/page.ts @@ -28,7 +28,7 @@ export type IPage = { descendantCount: number, isEmpty: boolean, grant: PageGrant, - grantedUsers: Ref[], + grantedUsers?: Ref[], grantedGroups: IGrantedGroup[], lastUpdateUser?: Ref, liker: Ref[], From b51f27f08d14bc24fdc1fee35d2261bee62171db Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 8 Jan 2025 03:14:46 +0000 Subject: [PATCH 2/6] nullable --- apps/app/src/server/service/page-grant.ts | 4 ++-- apps/app/src/server/service/page/index.ts | 2 +- apps/app/src/server/service/search-delegator/elasticsearch.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/app/src/server/service/page-grant.ts b/apps/app/src/server/service/page-grant.ts index 192ac41c1b1..17391bd7e63 100644 --- a/apps/app/src/server/service/page-grant.ts +++ b/apps/app/src/server/service/page-grant.ts @@ -606,9 +606,9 @@ class PageGrantService implements IPageGrantService { data[PageGrant.GRANT_USER_GROUP] = { applicableGroups: userRelatedGroups }; } else if (grant === PageGrant.GRANT_OWNER) { - const grantedUser = grantedUsers[0]; + const grantedUser = grantedUsers?.[0]; - const isUserApplicable = grantedUser.toString() === user._id.toString(); + const isUserApplicable = grantedUser?.toString() === user._id.toString(); if (isUserApplicable) { data[PageGrant.GRANT_OWNER] = null; diff --git a/apps/app/src/server/service/page/index.ts b/apps/app/src/server/service/page/index.ts index fd639462538..44fb277c490 100644 --- a/apps/app/src/server/service/page/index.ts +++ b/apps/app/src/server/service/page/index.ts @@ -2705,7 +2705,7 @@ class PageService implements IPageService { '', { grant: notEmptyParent?.grant, - grantUserIds: notEmptyParent?.grantedUsers.map(u => getIdForRef(u)), + grantUserIds: notEmptyParent?.grantedUsers?.map(u => getIdForRef(u)), grantUserGroupIds: notEmptyParent?.grantedGroups, }, ); diff --git a/apps/app/src/server/service/search-delegator/elasticsearch.ts b/apps/app/src/server/service/search-delegator/elasticsearch.ts index ed1fb03fd43..439c4970a4b 100644 --- a/apps/app/src/server/service/search-delegator/elasticsearch.ts +++ b/apps/app/src/server/service/search-delegator/elasticsearch.ts @@ -358,7 +358,7 @@ class ElasticsearchDelegator implements SearchDelegator getIdStringForRef(user)); + const grantedUserIds = page.grantedUsers?.map(user => getIdStringForRef(user)); const grantedGroupIds = page.grantedGroups.map(group => getIdStringForRef(group.item)); return { From 903e5c6e5d178930181916d2b5f0a7994e2a9004 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 8 Jan 2025 07:40:42 +0000 Subject: [PATCH 3/6] Revert "nullable" This reverts commit b51f27f08d14bc24fdc1fee35d2261bee62171db. --- apps/app/src/server/service/page-grant.ts | 4 ++-- apps/app/src/server/service/page/index.ts | 2 +- apps/app/src/server/service/search-delegator/elasticsearch.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/app/src/server/service/page-grant.ts b/apps/app/src/server/service/page-grant.ts index 17391bd7e63..192ac41c1b1 100644 --- a/apps/app/src/server/service/page-grant.ts +++ b/apps/app/src/server/service/page-grant.ts @@ -606,9 +606,9 @@ class PageGrantService implements IPageGrantService { data[PageGrant.GRANT_USER_GROUP] = { applicableGroups: userRelatedGroups }; } else if (grant === PageGrant.GRANT_OWNER) { - const grantedUser = grantedUsers?.[0]; + const grantedUser = grantedUsers[0]; - const isUserApplicable = grantedUser?.toString() === user._id.toString(); + const isUserApplicable = grantedUser.toString() === user._id.toString(); if (isUserApplicable) { data[PageGrant.GRANT_OWNER] = null; diff --git a/apps/app/src/server/service/page/index.ts b/apps/app/src/server/service/page/index.ts index 44fb277c490..fd639462538 100644 --- a/apps/app/src/server/service/page/index.ts +++ b/apps/app/src/server/service/page/index.ts @@ -2705,7 +2705,7 @@ class PageService implements IPageService { '', { grant: notEmptyParent?.grant, - grantUserIds: notEmptyParent?.grantedUsers?.map(u => getIdForRef(u)), + grantUserIds: notEmptyParent?.grantedUsers.map(u => getIdForRef(u)), grantUserGroupIds: notEmptyParent?.grantedGroups, }, ); diff --git a/apps/app/src/server/service/search-delegator/elasticsearch.ts b/apps/app/src/server/service/search-delegator/elasticsearch.ts index 439c4970a4b..ed1fb03fd43 100644 --- a/apps/app/src/server/service/search-delegator/elasticsearch.ts +++ b/apps/app/src/server/service/search-delegator/elasticsearch.ts @@ -358,7 +358,7 @@ class ElasticsearchDelegator implements SearchDelegator getIdStringForRef(user)); + const grantedUserIds = page.grantedUsers.map(user => getIdStringForRef(user)); const grantedGroupIds = page.grantedGroups.map(group => getIdStringForRef(group.item)); return { From d43bb399570ed04ab3163fff8ba6bca3de1c09f9 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 8 Jan 2025 07:41:01 +0000 Subject: [PATCH 4/6] Revert "fix: make grantedUsers optional in IPage interface and handle potential null in page route" This reverts commit a92911c0e4ccfdb012c10f9cf3d2a8c3a3cf1ac4. --- apps/app/src/server/routes/apiv3/page/index.ts | 2 +- packages/core/src/interfaces/page.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/server/routes/apiv3/page/index.ts b/apps/app/src/server/routes/apiv3/page/index.ts index c80ded8bdb6..22f32c2236d 100644 --- a/apps/app/src/server/routes/apiv3/page/index.ts +++ b/apps/app/src/server/routes/apiv3/page/index.ts @@ -530,7 +530,7 @@ module.exports = (crowi) => { } = page; let isGrantNormalized = false; try { - const grantedUsersId = grantedUsers?.map(ref => getIdForRef(ref)); + const grantedUsersId = grantedUsers.map(ref => getIdForRef(ref)); isGrantNormalized = await pageGrantService.isGrantNormalized(req.user, path, grant, grantedUsersId, grantedGroups, false, false); } catch (err) { diff --git a/packages/core/src/interfaces/page.ts b/packages/core/src/interfaces/page.ts index 3c7444d28db..491c93b52e3 100644 --- a/packages/core/src/interfaces/page.ts +++ b/packages/core/src/interfaces/page.ts @@ -28,7 +28,7 @@ export type IPage = { descendantCount: number, isEmpty: boolean, grant: PageGrant, - grantedUsers?: Ref[], + grantedUsers: Ref[], grantedGroups: IGrantedGroup[], lastUpdateUser?: Ref, liker: Ref[], From 7606aac4f2b083a6e52683279e5dc5f629ea635e Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 8 Jan 2025 09:11:05 +0000 Subject: [PATCH 5/6] impl convertNullToEmptyGrantedArrays --- .../convert-null-to-empty-granted-arrays.ts | 29 +++++++++++++++++++ .../server/service/normalize-data/index.ts | 2 ++ 2 files changed, 31 insertions(+) create mode 100644 apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts diff --git a/apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts b/apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts new file mode 100644 index 00000000000..4621d84bac8 --- /dev/null +++ b/apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts @@ -0,0 +1,29 @@ +import type { IPageHasId } from '@growi/core'; +import mongoose from 'mongoose'; + +import { type PageModel } from '~/server/models/page'; + +export const convertNullToEmptyGrantedArrays = async(): Promise => { + const Page = mongoose.model('Page'); + + const requests = [ + { + updateMany: { + filter: { grantedUsers: null }, + update: { + $set: { grantedUsers: [] }, + }, + }, + }, + { + updateMany: { + filter: { grantedGroups: null }, + update: { + $set: { grantedGroups: [] }, + }, + }, + }, + ]; + + await Page.bulkWrite(requests); +}; diff --git a/apps/app/src/server/service/normalize-data/index.ts b/apps/app/src/server/service/normalize-data/index.ts index f4647773625..b7901e77356 100644 --- a/apps/app/src/server/service/normalize-data/index.ts +++ b/apps/app/src/server/service/normalize-data/index.ts @@ -1,6 +1,7 @@ import { normalizeExpiredAtForThreadRelations } from '~/features/openai/server/services/normalize-data'; import loggerFactory from '~/utils/logger'; +import { convertNullToEmptyGrantedArrays } from './convert-null-to-empty-granted-arrays'; import { convertRevisionPageIdToObjectId } from './convert-revision-page-id-to-objectid'; import { renameDuplicateRootPages } from './rename-duplicate-root-pages'; @@ -10,6 +11,7 @@ export const normalizeData = async(): Promise => { await renameDuplicateRootPages(); await convertRevisionPageIdToObjectId(); await normalizeExpiredAtForThreadRelations(); + await convertNullToEmptyGrantedArrays(); logger.info('normalizeData has been executed'); return; From ac27a76d8819144271ba189a5dc338729846f0d3 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Thu, 9 Jan 2025 01:47:43 +0000 Subject: [PATCH 6/6] Add comment --- .../normalize-data/convert-null-to-empty-granted-arrays.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts b/apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts index 4621d84bac8..bcd6255b353 100644 --- a/apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts +++ b/apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts @@ -9,6 +9,8 @@ export const convertNullToEmptyGrantedArrays = async(): Promise => { const requests = [ { updateMany: { + // Matches documents where field is null or nonexistent + // https://www.mongodb.com/docs/manual/tutorial/query-for-null-fields/#equality-filter filter: { grantedUsers: null }, update: { $set: { grantedUsers: [] },