Browse Source

add filtering deletable pages in server

yuken 3 years ago
parent
commit
72b7572218

+ 6 - 1
packages/app/src/components/EmptyTrashModal.tsx

@@ -26,8 +26,13 @@ const EmptyTrashModal: FC = () => {
       return;
       return;
     }
     }
 
 
+    const pageIdToRevisionIdMap = {};
+    emptyTrashModalData.pages.forEach((p) => { pageIdToRevisionIdMap[p.data._id] = p.data.revision as string });
+
     try {
     try {
-      await apiv3Delete('/pages/empty-trash');
+      await apiv3Delete('/pages/empty-trash', {
+        pageIdToRevisionIdMap,
+      });
       const onEmptiedTrash = emptyTrashModalData.opts?.onEmptiedTrash;
       const onEmptiedTrash = emptyTrashModalData.opts?.onEmptiedTrash;
       if (onEmptiedTrash != null) {
       if (onEmptiedTrash != null) {
         onEmptiedTrash();
         onEmptiedTrash();

+ 22 - 4
packages/app/src/server/routes/apiv3/pages.js

@@ -1,16 +1,15 @@
-import loggerFactory from '~/utils/logger';
 
 
 import { subscribeRuleNames } from '~/interfaces/in-app-notification';
 import { subscribeRuleNames } from '~/interfaces/in-app-notification';
+import loggerFactory from '~/utils/logger';
 
 
 import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
 import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
 
 
 const logger = loggerFactory('growi:routes:apiv3:pages'); // eslint-disable-line no-unused-vars
 const logger = loggerFactory('growi:routes:apiv3:pages'); // eslint-disable-line no-unused-vars
-const express = require('express');
 const { pathUtils, pagePathUtils } = require('@growi/core');
 const { pathUtils, pagePathUtils } = require('@growi/core');
-const mongoose = require('mongoose');
-
+const express = require('express');
 const { body } = require('express-validator');
 const { body } = require('express-validator');
 const { query } = require('express-validator');
 const { query } = require('express-validator');
+const mongoose = require('mongoose');
 
 
 const ErrorV3 = require('../../models/vo/error-apiv3');
 const ErrorV3 = require('../../models/vo/error-apiv3');
 
 
@@ -548,6 +547,25 @@ module.exports = (crowi) => {
    */
    */
   router.delete('/empty-trash', accessTokenParser, loginRequired, adminRequired, csrf, apiV3FormValidator, async(req, res) => {
   router.delete('/empty-trash', accessTokenParser, loginRequired, adminRequired, csrf, apiV3FormValidator, async(req, res) => {
     const options = {};
     const options = {};
+    const { pageIdToRevisionIdMap } = req.body;
+    const pageIds = Object.keys(pageIdToRevisionIdMap);
+
+    let pagesToDelete;
+
+    try {
+      pagesToDelete = await Page.findByIdsAndViewer(pageIds, req.user, null, true);
+    }
+    catch (err) {
+      logger.error('Failed to find pages to delete.', err);
+      return res.apiv3Err(new ErrorV3('Failed to find pages to delete.'));
+    }
+
+    const deletablePages = crowi.pageService.filterPagesByCanDeleteCompletely(pagesToDelete, req.user, true);
+
+    if (deletablePages.length === 0) {
+      const msg = 'No pages can be deleted.';
+      return res.apiv3Err(new ErrorV3(msg), 500);
+    }
 
 
     try {
     try {
       const pages = await crowi.pageService.emptyTrashPage(req.user, options);
       const pages = await crowi.pageService.emptyTrashPage(req.user, options);