Преглед изворни кода

add IPageService interface

Yuki Takei пре 2 година
родитељ
комит
f16a48fd6b

+ 8 - 6
apps/app/src/server/service/page/delete-completely-user-home-by-system.integ.ts

@@ -1,5 +1,8 @@
+import type EventEmitter from 'events';
+
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
 import { vi } from 'vitest';
 import { vi } from 'vitest';
+import { mock } from 'vitest-mock-extended';
 
 
 import { getPageSchema } from '~/server/models/obsolete-page';
 import { getPageSchema } from '~/server/models/obsolete-page';
 import { configManager } from '~/server/service/config-manager';
 import { configManager } from '~/server/service/config-manager';
@@ -7,8 +10,7 @@ import { configManager } from '~/server/service/config-manager';
 import pageModel from '../../models/page';
 import pageModel from '../../models/page';
 
 
 import { deleteCompletelyUserHomeBySystem } from './delete-completely-user-home-by-system';
 import { deleteCompletelyUserHomeBySystem } from './delete-completely-user-home-by-system';
-
-import PageService from '.';
+import type { IPageService } from './page-service';
 
 
 // TODO: use actual user model after ~/server/models/user.js becomes importable in vitest
 // TODO: use actual user model after ~/server/models/user.js becomes importable in vitest
 // ref: https://github.com/vitest-dev/vitest/issues/846
 // ref: https://github.com/vitest-dev/vitest/issues/846
@@ -85,15 +87,15 @@ describe('delete-completely-user-home-by-system test', () => {
     // setup
     // setup
     const mockUpdateDescendantCountOfAncestors = vi.fn().mockImplementation(() => Promise.resolve());
     const mockUpdateDescendantCountOfAncestors = vi.fn().mockImplementation(() => Promise.resolve());
     const mockDeleteCompletelyOperation = vi.fn().mockImplementation(() => Promise.resolve());
     const mockDeleteCompletelyOperation = vi.fn().mockImplementation(() => Promise.resolve());
-    const mockPageEvent = { emit: vi.fn().mockImplementation(() => {}) };
+    const mockPageEvent = mock<EventEmitter>();
     const mockDeleteMultipleCompletely = vi.fn().mockImplementation(() => Promise.resolve());
     const mockDeleteMultipleCompletely = vi.fn().mockImplementation(() => Promise.resolve());
 
 
-    const mockPageService = {
+    const mockPageService: IPageService = {
       updateDescendantCountOfAncestors: mockUpdateDescendantCountOfAncestors,
       updateDescendantCountOfAncestors: mockUpdateDescendantCountOfAncestors,
       deleteCompletelyOperation: mockDeleteCompletelyOperation,
       deleteCompletelyOperation: mockDeleteCompletelyOperation,
-      pageEvent: mockPageEvent,
+      getEventEmitter: () => mockPageEvent,
       deleteMultipleCompletely: mockDeleteMultipleCompletely,
       deleteMultipleCompletely: mockDeleteMultipleCompletely,
-    } as unknown as PageService;
+    };
 
 
     it('should call used page service functions', async() => {
     it('should call used page service functions', async() => {
       // when
       // when

+ 3 - 4
apps/app/src/server/service/page/delete-completely-user-home-by-system.ts

@@ -11,10 +11,9 @@ import { createBatchStream } from '~/server/util/batch-stream';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
 import { BULK_REINDEX_SIZE } from './consts';
 import { BULK_REINDEX_SIZE } from './consts';
+import type { IPageService } from './page-service';
 import { shouldUseV4Process } from './should-use-v4-process';
 import { shouldUseV4Process } from './should-use-v4-process';
 
 
-import PageService from '.';
-
 const logger = loggerFactory('growi:services:page');
 const logger = loggerFactory('growi:services:page');
 
 
 /**
 /**
@@ -25,7 +24,7 @@ const logger = loggerFactory('growi:services:page');
    * @returns {Promise<void>} - A Promise that resolves when the deletion is complete.
    * @returns {Promise<void>} - A Promise that resolves when the deletion is complete.
    * @throws {Error} - If an error occurs during the deletion process.
    * @throws {Error} - If an error occurs during the deletion process.
    */
    */
-export const deleteCompletelyUserHomeBySystem = async(userHomepagePath: string, pageService: PageService): Promise<void> => {
+export const deleteCompletelyUserHomeBySystem = async(userHomepagePath: string, pageService: IPageService): Promise<void> => {
   if (!isUsersHomepage(userHomepagePath)) {
   if (!isUsersHomepage(userHomepagePath)) {
     const msg = 'input value is not user homepage path.';
     const msg = 'input value is not user homepage path.';
     logger.error(msg);
     logger.error(msg);
@@ -89,7 +88,7 @@ export const deleteCompletelyUserHomeBySystem = async(userHomepagePath: string,
         try {
         try {
           count += batch.length;
           count += batch.length;
           // Delete multiple pages completely
           // Delete multiple pages completely
-          await pageService.deleteMultipleCompletely(batch, undefined, {});
+          await pageService.deleteMultipleCompletely(batch, undefined);
           logger.debug(`Adding pages progressing: (count=${count})`);
           logger.debug(`Adding pages progressing: (count=${count})`);
         }
         }
         catch (err) {
         catch (err) {

+ 20 - 6
apps/app/src/server/service/page/index.ts

@@ -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);

+ 12 - 0
apps/app/src/server/service/page/page-service.ts

@@ -0,0 +1,12 @@
+import type EventEmitter from 'events';
+
+import type { IUser } from '@growi/core';
+
+import type { ObjectIdLike } from '~/server/interfaces/mongoose-utils';
+
+export interface IPageService {
+  updateDescendantCountOfAncestors: (pageId: ObjectIdLike, inc: number, shouldIncludeTarget: boolean) => Promise<void>,
+  deleteCompletelyOperation: (pageIds: string[], pagePaths: string[]) => Promise<void>,
+  getEventEmitter: () => EventEmitter,
+  deleteMultipleCompletely: (pages: ObjectIdLike[], user: IUser | undefined) => Promise<void>,
+}