|
@@ -1,3 +1,4 @@
|
|
|
|
|
+import type EventEmitter from 'events';
|
|
|
import pathlib from 'path';
|
|
import pathlib from 'path';
|
|
|
import { Readable, Writable } from 'stream';
|
|
import { Readable, Writable } from 'stream';
|
|
|
|
|
|
|
@@ -46,8 +47,12 @@ import { divideByType } from '../../util/granted-group';
|
|
|
import { configManager } from '../config-manager';
|
|
import { configManager } from '../config-manager';
|
|
|
|
|
|
|
|
import { BULK_REINDEX_SIZE, LIMIT_FOR_MULTIPLE_PAGE_OP } from './consts';
|
|
import { BULK_REINDEX_SIZE, LIMIT_FOR_MULTIPLE_PAGE_OP } from './consts';
|
|
|
|
|
+import { IPageService } from './page-service';
|
|
|
import { shouldUseV4Process } from './should-use-v4-process';
|
|
import { shouldUseV4Process } from './should-use-v4-process';
|
|
|
|
|
|
|
|
|
|
+export * from './page-service';
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
const debug = require('debug')('growi:services:page');
|
|
const debug = require('debug')('growi:services:page');
|
|
|
|
|
|
|
|
const logger = loggerFactory('growi:services:page');
|
|
const logger = loggerFactory('growi:services:page');
|
|
@@ -139,11 +144,16 @@ class PageCursorsForDescendantsFactory {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-class PageService {
|
|
|
|
|
|
|
+
|
|
|
|
|
+class PageService implements IPageService {
|
|
|
|
|
|
|
|
crowi: any;
|
|
crowi: any;
|
|
|
|
|
|
|
|
- pageEvent: any;
|
|
|
|
|
|
|
+ pageEvent: EventEmitter & {
|
|
|
|
|
+ onCreate,
|
|
|
|
|
+ onCreateMany,
|
|
|
|
|
+ onAddSeenUsers,
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
tagEvent: any;
|
|
tagEvent: any;
|
|
|
|
|
|
|
@@ -170,6 +180,10 @@ class PageService {
|
|
|
this.pageEvent.on('addSeenUsers', this.pageEvent.onAddSeenUsers);
|
|
this.pageEvent.on('addSeenUsers', this.pageEvent.onAddSeenUsers);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ getEventEmitter(): EventEmitter {
|
|
|
|
|
+ return this.pageEvent;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
canDeleteCompletely(path: string, creatorId: ObjectIdLike, operator: any | null, isRecursively: boolean): boolean {
|
|
canDeleteCompletely(path: string, creatorId: ObjectIdLike, operator: any | null, isRecursively: boolean): boolean {
|
|
|
if (operator == null || isTopPage(path) || isUsersTopPage(path)) return false;
|
|
if (operator == null || isTopPage(path) || isUsersTopPage(path)) return false;
|
|
|
|
|
|
|
@@ -1746,7 +1760,7 @@ class PageService {
|
|
|
return nDeletedNonEmptyPages;
|
|
return nDeletedNonEmptyPages;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- async deleteCompletelyOperation(pageIds, pagePaths) {
|
|
|
|
|
|
|
+ async deleteCompletelyOperation(pageIds, pagePaths): Promise<void> {
|
|
|
// Delete Bookmarks, Attachments, Revisions, Pages and emit delete
|
|
// Delete Bookmarks, Attachments, Revisions, Pages and emit delete
|
|
|
const Bookmark = this.crowi.model('Bookmark');
|
|
const Bookmark = this.crowi.model('Bookmark');
|
|
|
const Comment = this.crowi.model('Comment');
|
|
const Comment = this.crowi.model('Comment');
|
|
@@ -1758,7 +1772,7 @@ class PageService {
|
|
|
const { attachmentService } = this.crowi;
|
|
const { attachmentService } = this.crowi;
|
|
|
const attachments = await Attachment.find({ page: { $in: pageIds } });
|
|
const attachments = await Attachment.find({ page: { $in: pageIds } });
|
|
|
|
|
|
|
|
- return Promise.all([
|
|
|
|
|
|
|
+ await Promise.all([
|
|
|
Bookmark.deleteMany({ page: { $in: pageIds } }),
|
|
Bookmark.deleteMany({ page: { $in: pageIds } }),
|
|
|
Comment.deleteMany({ page: { $in: pageIds } }),
|
|
Comment.deleteMany({ page: { $in: pageIds } }),
|
|
|
PageTagRelation.deleteMany({ relatedPage: { $in: pageIds } }),
|
|
PageTagRelation.deleteMany({ relatedPage: { $in: pageIds } }),
|
|
@@ -1771,7 +1785,7 @@ class PageService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// delete multiple pages
|
|
// delete multiple pages
|
|
|
- async deleteMultipleCompletely(pages, user, options = {}) {
|
|
|
|
|
|
|
+ async deleteMultipleCompletely(pages, user) {
|
|
|
const ids = pages.map(page => (page._id));
|
|
const ids = pages.map(page => (page._id));
|
|
|
const paths = pages.map(page => (page.path));
|
|
const paths = pages.map(page => (page.path));
|
|
|
|
|
|
|
@@ -1971,7 +1985,7 @@ class PageService {
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
count += batch.length;
|
|
count += batch.length;
|
|
|
- await deleteMultipleCompletely(batch, user, options);
|
|
|
|
|
|
|
+ await deleteMultipleCompletely(batch, user);
|
|
|
const subscribedUsers = await Subscription.getSubscriptions(batch);
|
|
const subscribedUsers = await Subscription.getSubscriptions(batch);
|
|
|
subscribedUsers.forEach((eachUser) => {
|
|
subscribedUsers.forEach((eachUser) => {
|
|
|
descendantsSubscribedSets.add(eachUser);
|
|
descendantsSubscribedSets.add(eachUser);
|