Skip to content
Merged
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 72 additions & 66 deletions apps/app/src/server/routes/apiv3/page/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,55 @@ module.exports = (crowi: Crowi) => {
const { pageId, path, findAll, revisionId, shareLinkId, includeEmpty } =
req.query;

const respondWithSinglePage = async (
pageWithMeta:
| IDataWithMeta<HydratedDocument<PageDocument>, IPageInfoExt>
| IDataWithMeta<null, IPageNotFoundInfo>,
) => {
let { data: page } = pageWithMeta;
const { meta } = pageWithMeta;

if (isIPageNotFoundInfo(meta)) {
if (meta.isForbidden) {
return res.apiv3Err(
new ErrorV3(
'Page is forbidden',
'page-is-forbidden',
undefined,
meta,
),
403,
);
}
return res.apiv3Err(
new ErrorV3('Page is not found', 'page-not-found', undefined, meta),
404,
);
}

if (page != null) {
try {
page.initLatestRevisionField(revisionId);

// populate
page = await page.populateDataToShowRevision();
} catch (err) {
logger.error('populate-page-failed', err);
return res.apiv3Err(
new ErrorV3(
'Failed to populate page',
'populate-page-failed',
undefined,
{ err, meta },
),
500,
);
}
}

return res.apiv3({ page, pages: undefined, meta });
};

const isValid =
(shareLinkId != null && pageId != null && path == null) ||
(shareLinkId == null && (pageId != null || path != null));
Expand All @@ -204,12 +253,6 @@ module.exports = (crowi: Crowi) => {
);
}

let pageWithMeta:
| IDataWithMeta<HydratedDocument<PageDocument>, IPageInfoExt>
| IDataWithMeta<null, IPageNotFoundInfo> = {
data: null,
};
let pages: HydratedDocument<PageDocument>[] = [];
try {
if (isSharedPage) {
const shareLink = await ShareLink.findOne({
Expand All @@ -218,78 +261,41 @@ module.exports = (crowi: Crowi) => {
if (shareLink == null) {
return res.apiv3Err('ShareLink is not found', 404);
}
pageWithMeta = await pageService.findPageAndMetaDataByViewer(
getIdStringForRef(shareLink.relatedPage),
path,
user,
true,
);
} else if (!findAll) {
pageWithMeta = await pageService.findPageAndMetaDataByViewer(
pageId,
path,
user,
return respondWithSinglePage(
await pageService.findPageAndMetaDataByViewer(
getIdStringForRef(shareLink.relatedPage),
path,
user,
true,
),
);
} else {
pages = await Page.findByPathAndViewer(
}

if (findAll != null) {
const pages = await Page.findByPathAndViewer(
path,
user,
null,
false,
includeEmpty,
);

if (pages.length === 0) {
return res.apiv3Err(
new ErrorV3('Page is not found', 'page-not-found'),
404,
);
}
return res.apiv3({ page: undefined, pages, meta: undefined });
}

return respondWithSinglePage(
await pageService.findPageAndMetaDataByViewer(pageId, path, user),
);
} catch (err) {
logger.error('get-page-failed', err);
return res.apiv3Err(err, 500);
}

let { data: page } = pageWithMeta;
const { meta } = pageWithMeta;

// not found or forbidden
if (
isIPageNotFoundInfo(meta) ||
(Array.isArray(pages) && pages.length === 0)
) {
if (isIPageNotFoundInfo(meta) && meta.isForbidden) {
return res.apiv3Err(
new ErrorV3(
'Page is forbidden',
'page-is-forbidden',
undefined,
meta,
),
403,
);
}
return res.apiv3Err(
new ErrorV3('Page is not found', 'page-not-found', undefined, meta),
404,
);
}

if (page != null) {
try {
page.initLatestRevisionField(revisionId);

// populate
page = await page.populateDataToShowRevision();
} catch (err) {
logger.error('populate-page-failed', err);
return res.apiv3Err(
new ErrorV3(
'Failed to populate page',
'populate-page-failed',
undefined,
{ err, meta },
),
500,
);
}
}

return res.apiv3({ page, pages, meta });
},
);

Expand Down
Loading