Просмотр исходного кода

Merge pull request #6067 from weseek/feat/create-notification-when-parentPage-are-deleted

feat: Feat/create notification when parent page are deleted
Shun Murai 3 лет назад
Родитель
Сommit
7c111cc38e
2 измененных файлов с 20 добавлено и 12 удалено
  1. 16 8
      packages/app/src/server/service/page.ts
  2. 4 4
      packages/app/test/integration/service/page.test.js

+ 16 - 8
packages/app/src/server/service/page.ts

@@ -26,6 +26,7 @@ import { createBatchStream } from '~/server/util/batch-stream';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 import { prepareDeleteConfigValuesForCalc } from '~/utils/page-delete-config';
 import { prepareDeleteConfigValuesForCalc } from '~/utils/page-delete-config';
 
 
+import PageEvent from '../events/page';
 import { ObjectIdLike } from '../interfaces/mongoose-utils';
 import { ObjectIdLike } from '../interfaces/mongoose-utils';
 import { PathAlreadyExistsError } from '../models/errors';
 import { PathAlreadyExistsError } from '../models/errors';
 import PageOperation, { PageActionStage, PageActionType } from '../models/page-operation';
 import PageOperation, { PageActionStage, PageActionType } from '../models/page-operation';
@@ -168,7 +169,7 @@ class PageService {
 
 
     // Change the parameter of the function into the pages
     // Change the parameter of the function into the pages
     // rename
     // rename
-    this.pageEvent.on('rename', async(page, descendantPages, user) => {
+    this.pageEvent.on('rename', async(page, user, descendantPages?) => {
       const isRecursively = descendantPages != null;
       const isRecursively = descendantPages != null;
       const action = isRecursively ? SUPPORTED_ACTION_TYPE.ACTION_PAGE_RECURSIVELY_RENAME : SUPPORTED_ACTION_TYPE.ACTION_PAGE_RENAME;
       const action = isRecursively ? SUPPORTED_ACTION_TYPE.ACTION_PAGE_RECURSIVELY_RENAME : SUPPORTED_ACTION_TYPE.ACTION_PAGE_RENAME;
       try {
       try {
@@ -190,9 +191,11 @@ class PageService {
     });
     });
 
 
     // delete
     // delete
-    this.pageEvent.on('delete', async(page, user) => {
+    this.pageEvent.on('delete', async(page, user, descendantPages?) => {
+      const isRecursively = descendantPages != null;
+      const action = isRecursively ? SUPPORTED_ACTION_TYPE.ACTION_PAGE_RECURSIVELY_DELETE : SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE;
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE);
+        await this.createAndSendNotifications(page, user, action, descendantPages);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -540,7 +543,8 @@ class PageService {
       update.updatedAt = new Date();
       update.updatedAt = new Date();
     }
     }
     const renamedPage = await Page.findByIdAndUpdate(page._id, { $set: update }, { new: true });
     const renamedPage = await Page.findByIdAndUpdate(page._id, { $set: update }, { new: true });
-    this.pageEvent.emit('rename', page, null, user);
+    this.pageEvent.emit('rename', page, user);
+
     // create page redirect
     // create page redirect
     if (options.createRedirectPage) {
     if (options.createRedirectPage) {
       const PageRedirect = mongoose.model('PageRedirect') as unknown as PageRedirectModel;
       const PageRedirect = mongoose.model('PageRedirect') as unknown as PageRedirectModel;
@@ -685,7 +689,7 @@ class PageService {
       await PageRedirect.create({ fromPath: page.path, toPath: newPagePath });
       await PageRedirect.create({ fromPath: page.path, toPath: newPagePath });
     }
     }
 
 
-    this.pageEvent.emit('rename', page, null, user);
+    this.pageEvent.emit('rename', page, user);
 
 
     return renamedPage;
     return renamedPage;
   }
   }
@@ -840,7 +844,7 @@ class PageService {
           await renameDescendants(
           await renameDescendants(
             batch, user, options, pathRegExp, newPagePathPrefix, shouldUseV4Process,
             batch, user, options, pathRegExp, newPagePathPrefix, shouldUseV4Process,
           );
           );
-          pageEvent.emit('rename', targetPage, batch, user);
+          pageEvent.emit('rename', targetPage, user, batch);
           logger.debug(`Renaming pages progressing: (count=${count})`);
           logger.debug(`Renaming pages progressing: (count=${count})`);
         }
         }
         catch (err) {
         catch (err) {
@@ -1415,6 +1419,9 @@ class PageService {
        */
        */
       this.deleteRecursivelyMainOperation(page, user, pageOp._id);
       this.deleteRecursivelyMainOperation(page, user, pageOp._id);
     }
     }
+    else {
+      this.pageEvent.emit('delete', page, user);
+    }
 
 
     return deletedPage;
     return deletedPage;
   }
   }
@@ -1440,7 +1447,6 @@ class PageService {
         throw err;
         throw err;
       }
       }
     }
     }
-    this.pageEvent.emit('delete', page, user);
     this.pageEvent.emit('create', deletedPage, user);
     this.pageEvent.emit('create', deletedPage, user);
 
 
     return deletedPage;
     return deletedPage;
@@ -1592,6 +1598,7 @@ class PageService {
     const deleteDescendants = this.deleteDescendants.bind(this);
     const deleteDescendants = this.deleteDescendants.bind(this);
     let count = 0;
     let count = 0;
     let nDeletedNonEmptyPages = 0; // used for updating descendantCount
     let nDeletedNonEmptyPages = 0; // used for updating descendantCount
+    const pageEvent = this.pageEvent;
 
 
     const writeStream = new Writable({
     const writeStream = new Writable({
       objectMode: true,
       objectMode: true,
@@ -1601,6 +1608,7 @@ class PageService {
         try {
         try {
           count += batch.length;
           count += batch.length;
           await deleteDescendants(batch, user);
           await deleteDescendants(batch, user);
+          pageEvent.emit('delete', targetPage, user, batch);
           logger.debug(`Deleting pages progressing: (count=${count})`);
           logger.debug(`Deleting pages progressing: (count=${count})`);
         }
         }
         catch (err) {
         catch (err) {
@@ -2249,7 +2257,7 @@ class PageService {
     const activity = await activityService.createByParameters(parameters);
     const activity = await activityService.createByParameters(parameters);
     // Get user to be notified
     // Get user to be notified
     let targetUsers = await activity.getNotificationTargetUsers();
     let targetUsers = await activity.getNotificationTargetUsers();
-    if (descendantPages !== undefined && descendantPages.length > 0) {
+    if (descendantPages != null && descendantPages.length > 0) {
       const User = this.crowi.model('User');
       const User = this.crowi.model('User');
       const targetDescendantsUsers = await Subscription.getSubscriptions(descendantPages);
       const targetDescendantsUsers = await Subscription.getSubscriptions(descendantPages);
       const descendantsUsers = targetDescendantsUsers.filter(item => (item.toString() !== user._id.toString()));
       const descendantsUsers = targetDescendantsUsers.filter(item => (item.toString() !== user._id.toString()));

+ 4 - 4
packages/app/test/integration/service/page.test.js

@@ -350,7 +350,7 @@ describe('PageService', () => {
 
 
         expect(xssSpy).toHaveBeenCalled();
         expect(xssSpy).toHaveBeenCalled();
 
 
-        expect(pageEventSpy).toHaveBeenCalledWith('rename', parentForRename1, null, testUser2);
+        expect(pageEventSpy).toHaveBeenCalledWith('rename', parentForRename1, testUser2);
 
 
         expect(resultPage.path).toBe('/renamed1');
         expect(resultPage.path).toBe('/renamed1');
         expect(resultPage.updatedAt).toEqual(parentForRename1.updatedAt);
         expect(resultPage.updatedAt).toEqual(parentForRename1.updatedAt);
@@ -363,7 +363,7 @@ describe('PageService', () => {
 
 
         expect(xssSpy).toHaveBeenCalled();
         expect(xssSpy).toHaveBeenCalled();
 
 
-        expect(pageEventSpy).toHaveBeenCalledWith('rename', parentForRename2, null, testUser2);
+        expect(pageEventSpy).toHaveBeenCalledWith('rename', parentForRename2, testUser2);
 
 
         expect(resultPage.path).toBe('/renamed2');
         expect(resultPage.path).toBe('/renamed2');
         expect(resultPage.updatedAt).toEqual(dateToUse);
         expect(resultPage.updatedAt).toEqual(dateToUse);
@@ -375,7 +375,7 @@ describe('PageService', () => {
         const resultPage = await crowi.pageService.renamePage(parentForRename3, '/renamed3', testUser2, { createRedirectPage: true });
         const resultPage = await crowi.pageService.renamePage(parentForRename3, '/renamed3', testUser2, { createRedirectPage: true });
 
 
         expect(xssSpy).toHaveBeenCalled();
         expect(xssSpy).toHaveBeenCalled();
-        expect(pageEventSpy).toHaveBeenCalledWith('rename', parentForRename3, null, testUser2);
+        expect(pageEventSpy).toHaveBeenCalledWith('rename', parentForRename3, testUser2);
 
 
         expect(resultPage.path).toBe('/renamed3');
         expect(resultPage.path).toBe('/renamed3');
         expect(resultPage.updatedAt).toEqual(parentForRename3.updatedAt);
         expect(resultPage.updatedAt).toEqual(parentForRename3.updatedAt);
@@ -388,7 +388,7 @@ describe('PageService', () => {
 
 
         expect(xssSpy).toHaveBeenCalled();
         expect(xssSpy).toHaveBeenCalled();
         expect(renameDescendantsWithStreamSpy).toHaveBeenCalled();
         expect(renameDescendantsWithStreamSpy).toHaveBeenCalled();
-        expect(pageEventSpy).toHaveBeenCalledWith('rename', parentForRename4, null, testUser2);
+        expect(pageEventSpy).toHaveBeenCalledWith('rename', parentForRename4, testUser2);
 
 
         expect(resultPage.path).toBe('/renamed4');
         expect(resultPage.path).toBe('/renamed4');
         expect(resultPage.updatedAt).toEqual(parentForRename4.updatedAt);
         expect(resultPage.updatedAt).toEqual(parentForRename4.updatedAt);