|
@@ -17,12 +17,13 @@ import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity
|
|
|
import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
|
|
import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
|
|
|
import { excludeReadOnlyUser } from '~/server/middlewares/exclude-read-only-user';
|
|
import { excludeReadOnlyUser } from '~/server/middlewares/exclude-read-only-user';
|
|
|
import { GlobalNotificationSettingEvent } from '~/server/models/GlobalNotificationSetting';
|
|
import { GlobalNotificationSettingEvent } from '~/server/models/GlobalNotificationSetting';
|
|
|
-import type { PageModel } from '~/server/models/page';
|
|
|
|
|
|
|
+import type { PageDocument, PageModel } from '~/server/models/page';
|
|
|
import { Revision } from '~/server/models/revision';
|
|
import { Revision } from '~/server/models/revision';
|
|
|
import Subscription from '~/server/models/subscription';
|
|
import Subscription from '~/server/models/subscription';
|
|
|
import { configManager } from '~/server/service/config-manager';
|
|
import { configManager } from '~/server/service/config-manager';
|
|
|
import type { IPageGrantService } from '~/server/service/page-grant';
|
|
import type { IPageGrantService } from '~/server/service/page-grant';
|
|
|
import { preNotifyService } from '~/server/service/pre-notify';
|
|
import { preNotifyService } from '~/server/service/pre-notify';
|
|
|
|
|
+import { normalizeLatestRevisionIfBroken } from '~/server/service/revision/normalize-latest-revision-if-broken';
|
|
|
import loggerFactory from '~/utils/logger';
|
|
import loggerFactory from '~/utils/logger';
|
|
|
|
|
|
|
|
import type { ApiV3Response } from '../interfaces/apiv3-response';
|
|
import type { ApiV3Response } from '../interfaces/apiv3-response';
|
|
@@ -741,14 +742,17 @@ module.exports = (crowi) => {
|
|
|
* description: Return page's markdown
|
|
* description: Return page's markdown
|
|
|
*/
|
|
*/
|
|
|
router.get('/export/:pageId', loginRequiredStrictly, validator.export, async(req, res) => {
|
|
router.get('/export/:pageId', loginRequiredStrictly, validator.export, async(req, res) => {
|
|
|
- const { pageId } = req.params;
|
|
|
|
|
|
|
+ const pageId: string = req.params.pageId;
|
|
|
const { format, revisionId = null } = req.query;
|
|
const { format, revisionId = null } = req.query;
|
|
|
let revision;
|
|
let revision;
|
|
|
let pagePath;
|
|
let pagePath;
|
|
|
|
|
|
|
|
|
|
+ const Page = mongoose.model<PageDocument, PageModel>('Page');
|
|
|
|
|
+
|
|
|
|
|
+ let page: PageDocument;
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
- const Page = crowi.model('Page');
|
|
|
|
|
- const page = await Page.findByIdAndViewer(pageId, req.user);
|
|
|
|
|
|
|
+ page = await Page.findByIdAndViewer(pageId, req.user);
|
|
|
|
|
|
|
|
if (page == null) {
|
|
if (page == null) {
|
|
|
const isPageExist = await Page.count({ _id: pageId }) > 0;
|
|
const isPageExist = await Page.count({ _id: pageId }) > 0;
|
|
@@ -758,8 +762,22 @@ module.exports = (crowi) => {
|
|
|
}
|
|
}
|
|
|
return res.apiv3Err(new ErrorV3(`Page ${pageId} is not exist.`), 404);
|
|
return res.apiv3Err(new ErrorV3(`Page ${pageId} is not exist.`), 404);
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ logger.error('Failed to get page data', err);
|
|
|
|
|
+ return res.apiv3Err(err, 500);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Normalize the latest revision which was borken by the migration script '20211227060705-revision-path-to-page-id-schema-migration--fixed-7549.js'
|
|
|
|
|
+ try {
|
|
|
|
|
+ await normalizeLatestRevisionIfBroken(pageId);
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ logger.error('Error occurred in normalizing the latest revision');
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- const revisionIdForFind = revisionId || page.revision;
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ const revisionIdForFind = revisionId ?? page.revision;
|
|
|
|
|
|
|
|
revision = await Revision.findById(revisionIdForFind);
|
|
revision = await Revision.findById(revisionIdForFind);
|
|
|
pagePath = page.path;
|
|
pagePath = page.path;
|
|
@@ -770,7 +788,7 @@ module.exports = (crowi) => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
- logger.error('Failed to get page data', err);
|
|
|
|
|
|
|
+ logger.error('Failed to get revision data', err);
|
|
|
return res.apiv3Err(err, 500);
|
|
return res.apiv3Err(err, 500);
|
|
|
}
|
|
}
|
|
|
|
|
|