|
|
@@ -50,6 +50,27 @@ class PageService {
|
|
|
return this.prepareShoudDeletePagesByRedirectTo(pagePath, redirectToPagePathMapping, pagePaths);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Generate read stream to operate descendants of the specified page path
|
|
|
+ * @param {string} targetPagePath
|
|
|
+ * @param {User} viewer
|
|
|
+ */
|
|
|
+ async generateReadStreamToOperateOnlyDescendants(targetPagePath, userToOperate) {
|
|
|
+ const Page = this.crowi.model('Page');
|
|
|
+ const { PageQueryBuilder } = Page;
|
|
|
+
|
|
|
+ const builder = new PageQueryBuilder(Page.find())
|
|
|
+ .addConditionToExcludeRedirect()
|
|
|
+ .addConditionToListOnlyDescendants(targetPagePath);
|
|
|
+
|
|
|
+ await Page.addConditionToFilteringByViewerToEdit(builder, userToOperate);
|
|
|
+
|
|
|
+ return builder
|
|
|
+ .query
|
|
|
+ .lean()
|
|
|
+ .cursor({ batchSize: BULK_REINDEX_SIZE });
|
|
|
+ }
|
|
|
+
|
|
|
async renamePage(page, newPagePath, user, options, isRecursively = false) {
|
|
|
|
|
|
const Page = this.crowi.model('Page');
|
|
|
@@ -152,19 +173,12 @@ class PageService {
|
|
|
* Create rename stream
|
|
|
*/
|
|
|
async renameDescendantsWithStream(targetPage, newPagePath, user, options = {}) {
|
|
|
- const Page = this.crowi.model('Page');
|
|
|
+
|
|
|
+ const readStream = await this.generateReadStreamToOperateOnlyDescendants(targetPage.path, user);
|
|
|
+
|
|
|
const newPagePathPrefix = newPagePath;
|
|
|
- const { PageQueryBuilder } = Page;
|
|
|
const pathRegExp = new RegExp(`^${escapeStringRegexp(targetPage.path)}`, 'i');
|
|
|
|
|
|
- const readStream = new PageQueryBuilder(Page.find())
|
|
|
- .addConditionToExcludeRedirect()
|
|
|
- .addConditionToListOnlyDescendants(targetPage.path)
|
|
|
- .addConditionToFilteringByViewer(user)
|
|
|
- .query
|
|
|
- .lean()
|
|
|
- .cursor({ batchSize: BULK_REINDEX_SIZE });
|
|
|
-
|
|
|
const renameDescendants = this.renameDescendants.bind(this);
|
|
|
const pageEvent = this.pageEvent;
|
|
|
let count = 0;
|
|
|
@@ -355,19 +369,11 @@ class PageService {
|
|
|
}
|
|
|
|
|
|
async duplicateDescendantsWithStream(page, newPagePath, user) {
|
|
|
- const Page = this.crowi.model('Page');
|
|
|
- const newPagePathPrefix = newPagePath;
|
|
|
- const pathRegExp = new RegExp(`^${escapeStringRegexp(page.path)}`, 'i');
|
|
|
|
|
|
- const { PageQueryBuilder } = Page;
|
|
|
+ const readStream = await this.generateReadStreamToOperateOnlyDescendants(page.path, user);
|
|
|
|
|
|
- const readStream = new PageQueryBuilder(Page.find())
|
|
|
- .addConditionToExcludeRedirect()
|
|
|
- .addConditionToListOnlyDescendants(page.path)
|
|
|
- .addConditionToFilteringByViewer(user)
|
|
|
- .query
|
|
|
- .lean()
|
|
|
- .cursor({ batchSize: BULK_REINDEX_SIZE });
|
|
|
+ const newPagePathPrefix = newPagePath;
|
|
|
+ const pathRegExp = new RegExp(`^${escapeStringRegexp(page.path)}`, 'i');
|
|
|
|
|
|
const duplicateDescendants = this.duplicateDescendants.bind(this);
|
|
|
const pageEvent = this.pageEvent;
|
|
|
@@ -493,16 +499,8 @@ class PageService {
|
|
|
* Create delete stream
|
|
|
*/
|
|
|
async deleteDescendantsWithStream(targetPage, user, options = {}) {
|
|
|
- const Page = this.crowi.model('Page');
|
|
|
- const { PageQueryBuilder } = Page;
|
|
|
|
|
|
- const readStream = new PageQueryBuilder(Page.find())
|
|
|
- .addConditionToExcludeRedirect()
|
|
|
- .addConditionToListOnlyDescendants(targetPage.path)
|
|
|
- .addConditionToFilteringByViewer(user)
|
|
|
- .query
|
|
|
- .lean()
|
|
|
- .cursor({ batchSize: BULK_REINDEX_SIZE });
|
|
|
+ const readStream = await this.generateReadStreamToOperateOnlyDescendants(targetPage.path, user);
|
|
|
|
|
|
const deleteDescendants = this.deleteDescendants.bind(this);
|
|
|
let count = 0;
|
|
|
@@ -569,16 +567,8 @@ class PageService {
|
|
|
* Create delete completely stream
|
|
|
*/
|
|
|
async deleteCompletelyDescendantsWithStream(targetPage, user, options = {}) {
|
|
|
- const Page = this.crowi.model('Page');
|
|
|
- const { PageQueryBuilder } = Page;
|
|
|
|
|
|
- const readStream = new PageQueryBuilder(Page.find())
|
|
|
- .addConditionToExcludeRedirect()
|
|
|
- .addConditionToListOnlyDescendants(targetPage.path)
|
|
|
- .addConditionToFilteringByViewer(user)
|
|
|
- .query
|
|
|
- .lean()
|
|
|
- .cursor({ batchSize: BULK_REINDEX_SIZE });
|
|
|
+ const readStream = await this.generateReadStreamToOperateOnlyDescendants(targetPage.path, user);
|
|
|
|
|
|
const deleteMultipleCompletely = this.deleteMultipleCompletely.bind(this);
|
|
|
let count = 0;
|
|
|
@@ -695,16 +685,8 @@ class PageService {
|
|
|
* Create revert stream
|
|
|
*/
|
|
|
async revertDeletedDescendantsWithStream(targetPage, user, options = {}) {
|
|
|
- const Page = this.crowi.model('Page');
|
|
|
- const { PageQueryBuilder } = Page;
|
|
|
|
|
|
- const readStream = new PageQueryBuilder(Page.find())
|
|
|
- .addConditionToExcludeRedirect()
|
|
|
- .addConditionToListOnlyDescendants(targetPage.path)
|
|
|
- .addConditionToFilteringByViewer(user)
|
|
|
- .query
|
|
|
- .lean()
|
|
|
- .cursor({ batchSize: BULK_REINDEX_SIZE });
|
|
|
+ const readStream = await this.generateReadStreamToOperateOnlyDescendants(targetPage.path, user);
|
|
|
|
|
|
const revertDeletedDescendants = this.revertDeletedDescendants.bind(this);
|
|
|
let count = 0;
|