|
@@ -837,10 +837,8 @@ class PageService {
|
|
|
const Revision = mongoose.model('Revision') as any; // TODO: Typescriptize model
|
|
const Revision = mongoose.model('Revision') as any; // TODO: Typescriptize model
|
|
|
|
|
|
|
|
// v4 compatible process
|
|
// v4 compatible process
|
|
|
- const isPageMigrated = page.parent != null;
|
|
|
|
|
- const isV5Compatible = this.crowi.configManager.getConfig('crowi', 'app:isV5Compatible');
|
|
|
|
|
- const useV4Process = !isV5Compatible || !isPageMigrated;
|
|
|
|
|
- if (useV4Process) {
|
|
|
|
|
|
|
+ const shouldUseV4Process = this.shouldUseV4Process(page);
|
|
|
|
|
+ if (shouldUseV4Process) {
|
|
|
return this.deletePageV4(page, user, options, isRecursively);
|
|
return this.deletePageV4(page, user, options, isRecursively);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -865,24 +863,30 @@ class PageService {
|
|
|
this.deleteDescendantsWithStream(page, user); // use the same process in both version v4 and v5
|
|
this.deleteDescendantsWithStream(page, user); // use the same process in both version v4 and v5
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ let deletedPage;
|
|
|
// update Revisions
|
|
// update Revisions
|
|
|
- await Revision.updateRevisionListByPageId(page._id, { pageId: page._id });
|
|
|
|
|
- const deletedPage = await Page.findByIdAndUpdate(page._id, {
|
|
|
|
|
- $set: {
|
|
|
|
|
- path: newPath, status: Page.STATUS_DELETED, deleteUser: user._id, deletedAt: Date.now(), parent: null, // set parent as null
|
|
|
|
|
- },
|
|
|
|
|
- }, { new: true });
|
|
|
|
|
- await PageTagRelation.updateMany({ relatedPage: page._id }, { $set: { isPageTrashed: true } });
|
|
|
|
|
|
|
+ if (page.isEmpty) {
|
|
|
|
|
+ await Page.remove({ _id: page._id });
|
|
|
|
|
+ }
|
|
|
|
|
+ else {
|
|
|
|
|
+ await Revision.updateRevisionListByPageId(page._id, { pageId: page._id });
|
|
|
|
|
+ deletedPage = await Page.findByIdAndUpdate(page._id, {
|
|
|
|
|
+ $set: {
|
|
|
|
|
+ path: newPath, status: Page.STATUS_DELETED, deleteUser: user._id, deletedAt: Date.now(), parent: null, // set parent as null
|
|
|
|
|
+ },
|
|
|
|
|
+ }, { new: true });
|
|
|
|
|
+ await PageTagRelation.updateMany({ relatedPage: page._id }, { $set: { isPageTrashed: true } });
|
|
|
|
|
|
|
|
- /*
|
|
|
|
|
- * TODO: https://redmine.weseek.co.jp/issues/86577
|
|
|
|
|
- * bulkWrite PageRedirect documents
|
|
|
|
|
- */
|
|
|
|
|
- // const body = `redirect ${newPath}`;
|
|
|
|
|
- // await Page.create(page.path, body, user, { redirectTo: newPath });
|
|
|
|
|
|
|
+ /*
|
|
|
|
|
+ * TODO: https://redmine.weseek.co.jp/issues/86577
|
|
|
|
|
+ * bulkWrite PageRedirect documents
|
|
|
|
|
+ */
|
|
|
|
|
+ // const body = `redirect ${newPath}`;
|
|
|
|
|
+ // await Page.create(page.path, body, user, { redirectTo: newPath });
|
|
|
|
|
|
|
|
- this.pageEvent.emit('delete', page, user);
|
|
|
|
|
- this.pageEvent.emit('create', deletedPage, user);
|
|
|
|
|
|
|
+ this.pageEvent.emit('delete', page, user);
|
|
|
|
|
+ this.pageEvent.emit('create', deletedPage, user);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return deletedPage;
|
|
return deletedPage;
|
|
|
}
|
|
}
|
|
@@ -932,25 +936,39 @@ class PageService {
|
|
|
private async deleteDescendants(pages, user) {
|
|
private async deleteDescendants(pages, user) {
|
|
|
const Page = mongoose.model('Page') as PageModel;
|
|
const Page = mongoose.model('Page') as PageModel;
|
|
|
|
|
|
|
|
- const deletePageBulkOp: any[] = [];
|
|
|
|
|
|
|
+ const deletePageOperations: any[] = [];
|
|
|
|
|
|
|
|
pages.forEach((page) => {
|
|
pages.forEach((page) => {
|
|
|
const newPath = Page.getDeletedPageName(page.path);
|
|
const newPath = Page.getDeletedPageName(page.path);
|
|
|
|
|
|
|
|
- deletePageBulkOp.push({
|
|
|
|
|
- updateOne: {
|
|
|
|
|
- filter: { _id: page._id },
|
|
|
|
|
- update: {
|
|
|
|
|
- $set: {
|
|
|
|
|
- path: newPath, status: Page.STATUS_DELETED, deleteUser: user._id, deletedAt: Date.now(), parent: null, // set parent as null
|
|
|
|
|
|
|
+ let operation;
|
|
|
|
|
+ // if empty, delete completely
|
|
|
|
|
+ if (page.isEmpty) {
|
|
|
|
|
+ operation = {
|
|
|
|
|
+ deleteOne: {
|
|
|
|
|
+ filter: { _id: page._id },
|
|
|
|
|
+ },
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+ // if not empty, set parent to null and update to trash
|
|
|
|
|
+ else {
|
|
|
|
|
+ operation = {
|
|
|
|
|
+ updateOne: {
|
|
|
|
|
+ filter: { _id: page._id },
|
|
|
|
|
+ update: {
|
|
|
|
|
+ $set: {
|
|
|
|
|
+ path: newPath, status: Page.STATUS_DELETED, deleteUser: user._id, deletedAt: Date.now(), parent: null, // set parent as null
|
|
|
|
|
+ },
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
- },
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ deletePageOperations.push(operation);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- await Page.bulkWrite(deletePageBulkOp);
|
|
|
|
|
|
|
+ await Page.bulkWrite(deletePageOperations);
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
if (err.code !== 11000) {
|
|
if (err.code !== 11000) {
|
|
@@ -1055,10 +1073,8 @@ class PageService {
|
|
|
const Page = mongoose.model('Page') as PageModel;
|
|
const Page = mongoose.model('Page') as PageModel;
|
|
|
|
|
|
|
|
// v4 compatible process
|
|
// v4 compatible process
|
|
|
- const isPageMigrated = page.parent != null;
|
|
|
|
|
- const isV5Compatible = this.crowi.configManager.getConfig('crowi', 'app:isV5Compatible');
|
|
|
|
|
- const useV4Process = !isV5Compatible || !isPageMigrated;
|
|
|
|
|
- if (useV4Process) {
|
|
|
|
|
|
|
+ const shouldUseV4Process = this.shouldUseV4Process(page);
|
|
|
|
|
+ if (shouldUseV4Process) {
|
|
|
return this.deleteCompletelyV4(page, user, options, isRecursively, preventEmitting);
|
|
return this.deleteCompletelyV4(page, user, options, isRecursively, preventEmitting);
|
|
|
}
|
|
}
|
|
|
|
|
|