Kaynağa Gözat

cannot rename to existing path

yohei0125 4 yıl önce
ebeveyn
işleme
dff44fb256

+ 6 - 0
packages/app/src/server/service/page.ts

@@ -314,6 +314,12 @@ class PageService {
   async renamePage(page, newPagePath, user, options) {
   async renamePage(page, newPagePath, user, options) {
     const Page = this.crowi.model('Page');
     const Page = this.crowi.model('Page');
 
 
+    const isExist = await Page.count({ path: newPagePath }) > 0;
+    if (isExist) {
+      // if page found, cannot cannot rename to that path
+      throw new Error('the path already exists');
+    }
+
     if (isTopPage(page.path)) {
     if (isTopPage(page.path)) {
       throw Error('It is forbidden to rename the top page');
       throw Error('It is forbidden to rename the top page');
     }
     }

+ 29 - 0
packages/app/test/integration/service/pagev5.test.ts

@@ -31,6 +31,7 @@ describe('PageService page operations with only public pages', () => {
   let parentForRename5;
   let parentForRename5;
   let parentForRename6;
   let parentForRename6;
   let parentForRename7;
   let parentForRename7;
+  let parentForRename8;
   // children
   // children
   let childForRename1;
   let childForRename1;
   let childForRename2;
   let childForRename2;
@@ -131,6 +132,20 @@ describe('PageService page operations with only public pages', () => {
         lastUpdateUser: dummyUser1._id,
         lastUpdateUser: dummyUser1._id,
         parent: rootPage._id,
         parent: rootPage._id,
       },
       },
+      {
+        path: '/v5_ParentForRename8',
+        grant: Page.GRANT_PUBLIC,
+        creator: dummyUser1,
+        lastUpdateUser: dummyUser1._id,
+        parent: rootPage._id,
+      },
+      {
+        path: '/v5_ParentForRename9',
+        grant: Page.GRANT_PUBLIC,
+        creator: dummyUser1,
+        lastUpdateUser: dummyUser1._id,
+        parent: rootPage._id,
+      },
       // children
       // children
       {
       {
         path: '/v5_ChildForRename1',
         path: '/v5_ChildForRename1',
@@ -191,6 +206,7 @@ describe('PageService page operations with only public pages', () => {
     parentForRename5 = await Page.findOne({ path: '/v5_ParentForRename5' });
     parentForRename5 = await Page.findOne({ path: '/v5_ParentForRename5' });
     parentForRename6 = await Page.findOne({ path: '/v5_ParentForRename6' });
     parentForRename6 = await Page.findOne({ path: '/v5_ParentForRename6' });
     parentForRename7 = await Page.findOne({ path: '/v5_ParentForRename7' });
     parentForRename7 = await Page.findOne({ path: '/v5_ParentForRename7' });
+    parentForRename8 = await Page.findOne({ path: '/v5_ParentForRename8' });
     // Find pages as Child
     // Find pages as Child
     childForRename1 = await Page.findOne({ path: '/v5_ChildForRename1' });
     childForRename1 = await Page.findOne({ path: '/v5_ChildForRename1' });
     childForRename2 = await Page.findOne({ path: '/v5_ChildForRename2' });
     childForRename2 = await Page.findOne({ path: '/v5_ChildForRename2' });
@@ -341,6 +357,19 @@ describe('PageService page operations with only public pages', () => {
       expect(grandchild.parent).toStrictEqual(renamedPage._id);
       expect(grandchild.parent).toStrictEqual(renamedPage._id);
       expect(grandchild.path).toBe('/v5_ParentForRename7/renamedChildForRename7/v5_GrandchildForRename7');
       expect(grandchild.path).toBe('/v5_ParentForRename7/renamedChildForRename7/v5_GrandchildForRename7');
     });
     });
+    test('Should NOT rename/move with existing path', async() => {
+      // rename target page
+      const newPath = '/v5_ParentForRename9';
+      let isThrown;
+      try {
+        await renamePage(parentForRename8, newPath, dummyUser1, {});
+      }
+      catch (err) {
+        isThrown = true;
+      }
+
+      expect(isThrown).toBe(true);
+    });
   });
   });
   afterAll(async() => {
   afterAll(async() => {
     await Page.remove({});
     await Page.remove({});