Shun Miyazawa 3 лет назад
Родитель
Сommit
5ed2deffd0

+ 3 - 8
packages/app/src/client/services/page-operation.ts

@@ -98,7 +98,7 @@ const createPage = async(pagePath: string, markdown: string, tmpParams: OptionsT
 };
 
 // TODO: define return type
-const updatePage = async(pageId: string, revisionId: Nullable<string>, markdown: string, tmpParams: OptionsToSave) => {
+const updatePage = async(pageId: string, revisionId: string, markdown: string, tmpParams: OptionsToSave) => {
   // clone
   const params = Object.assign(tmpParams, {
     page_id: pageId,
@@ -115,16 +115,13 @@ const updatePage = async(pageId: string, revisionId: Nullable<string>, markdown:
 
 type PageInfo= {
   path: string,
-  isNotFound?: boolean,
   pageId: Nullable<string>,
   revisionId: Nullable<string>,
 }
 
 // TODO: define return type
 export const saveOrUpdate = async(optionsToSave: OptionsToSave, pageInfo: PageInfo, markdown: string) => {
-  const {
-    path, isNotFound, pageId, revisionId,
-  } = pageInfo;
+  const { path, pageId, revisionId } = pageInfo;
 
   const options = Object.assign({}, optionsToSave);
 
@@ -146,14 +143,12 @@ export const saveOrUpdate = async(optionsToSave: OptionsToSave, pageInfo: PageIn
   // markdown = pageEditor.getMarkdown();
   // }
 
-  const isEmpty = pageId != null && isNotFound;
-
   let res;
   if (pageId == null) {
     res = await createPage(path, markdown, options);
   }
   else {
-    if (!isEmpty && revisionId == null) {
+    if (revisionId == null) {
       const msg = '\'revisionId\' is required to update page';
       throw new Error(msg);
     }

+ 3 - 10
packages/app/src/components/PageEditor.tsx

@@ -16,7 +16,7 @@ import { getOptionsToSave } from '~/client/util/editor';
 import { IEditorMethods } from '~/interfaces/editor-methods';
 import {
   useCurrentPagePath, useCurrentPathname, useCurrentPageId, useEditingMarkdown,
-  useIsEditable, useIsIndentSizeForced, useIsUploadableFile, useIsUploadableImage, useIsNotFound,
+  useIsEditable, useIsIndentSizeForced, useIsUploadableFile, useIsUploadableImage,
 } from '~/stores/context';
 import {
   useCurrentIndentSize, useSWRxSlackChannels, useIsSlackEnabled, useIsTextlintEnabled, usePageTagsForEditors,
@@ -58,7 +58,6 @@ const PageEditor = React.memo((): JSX.Element => {
   const { data: editingMarkdown } = useEditingMarkdown();
   const { data: grantData, mutate: mutateGrant } = useSelectedGrant();
   const { data: pageTags } = usePageTagsForEditors(pageId);
-  const { data: isNotFound } = useIsNotFound();
 
   const { data: isEditable } = useIsEditable();
   const { data: editorMode, mutate: mutateEditorMode } = useEditorMode();
@@ -115,13 +114,7 @@ const PageEditor = React.memo((): JSX.Element => {
     );
 
     try {
-      const pageInfo = {
-        pageId,
-        isNotFound,
-        path: currentPagePath || currentPathname,
-        revisionId: currentRevisionId,
-      };
-      await saveOrUpdate(optionsToSave, pageInfo, markdownToSave.current);
+      await saveOrUpdate(optionsToSave, { pageId, path: currentPagePath || currentPathname, revisionId: currentRevisionId }, markdownToSave.current);
       await mutateCurrentPage();
       mutateIsEnabledUnsavedWarning(false);
       return true;
@@ -141,7 +134,7 @@ const PageEditor = React.memo((): JSX.Element => {
     }
 
   // eslint-disable-next-line max-len
-  }, [grantData, isSlackEnabled, currentPathname, slackChannels, pageTags, pageId, currentPagePath, currentRevisionId, isNotFound, mutateCurrentPage, mutateIsEnabledUnsavedWarning]);
+  }, [grantData, isSlackEnabled, currentPathname, slackChannels, pageTags, pageId, currentPagePath, currentRevisionId, mutateCurrentPage, mutateIsEnabledUnsavedWarning]);
 
   const saveAndReturnToViewHandler = useCallback(async(opts?: {overwriteScopesOfDescendants: boolean}) => {
     if (editorMode !== EditorMode.Editor) {

+ 3 - 20
packages/app/src/components/PageEditorByHackmd.tsx

@@ -13,7 +13,7 @@ import { apiPost } from '~/client/util/apiv1-client';
 import { getOptionsToSave } from '~/client/util/editor';
 import { IResHackmdIntegrated, IResHackmdDiscard } from '~/interfaces/hackmd';
 import {
-  useCurrentPagePath, useCurrentPageId, useHackmdUri, usePageIdOnHackmd, useHasDraftOnHackmd, useRevisionIdHackmdSynced, useIsNotFound,
+  useCurrentPagePath, useCurrentPageId, useHackmdUri, usePageIdOnHackmd, useHasDraftOnHackmd, useRevisionIdHackmdSynced,
 } from '~/stores/context';
 import {
   useSWRxSlackChannels, useIsSlackEnabled, usePageTagsForEditors, useIsEnabledUnsavedWarning,
@@ -48,7 +48,6 @@ export const PageEditorByHackmd = (): JSX.Element => {
   const { mutate: mutateTagsInfo } = useSWRxTagsInfo(pageId);
   const { data: grant } = useSelectedGrant();
   const { data: hackmdUri } = useHackmdUri();
-  const { data: isNotFound } = useIsNotFound();
 
   // pageData
   const { data: pageData, mutate: mutatePageData } = useSWRxCurrentPage();
@@ -98,14 +97,7 @@ export const PageEditorByHackmd = (): JSX.Element => {
 
       const markdown = await hackmdEditorRef.current.getValue();
 
-      const pageInfo = {
-        pageId,
-        isNotFound,
-        path: currentPagePath || currentPathname,
-        revisionId: revision?._id,
-      };
-
-      await saveOrUpdate(optionsToSave, pageInfo, markdown);
+      await saveOrUpdate(optionsToSave, { pageId, path: currentPagePath || currentPathname, revisionId: revision?._id }, markdown);
       await mutatePageData();
       await mutateTagsInfo();
       mutateEditorMode(EditorMode.View);
@@ -124,7 +116,6 @@ export const PageEditorByHackmd = (): JSX.Element => {
       pageTags,
       pageId,
       currentPagePath,
-      isNotFound,
       mutatePageData,
       mutateEditorMode,
       mutateTagsInfo,
@@ -238,14 +229,7 @@ export const PageEditorByHackmd = (): JSX.Element => {
       const optionsToSave = getOptionsToSave(
         isSlackEnabled, slackChannels, grant.grant, grant.grantedGroup?.id, grant.grantedGroup?.name, pageTags ?? [], true,
       );
-
-      const pageInfo = {
-        pageId,
-        isNotFound,
-        path: currentPagePathOrPathname,
-        revisionId: revisionIdHackmdSynced,
-      };
-      const res = await saveOrUpdate(optionsToSave, pageInfo, markdown);
+      const res = await saveOrUpdate(optionsToSave, { pageId, path: currentPagePathOrPathname, revisionId: revisionIdHackmdSynced }, markdown);
 
       // update pageData
       mutatePageData(res);
@@ -273,7 +257,6 @@ export const PageEditorByHackmd = (): JSX.Element => {
       currentPathname,
       pageTags,
       currentPagePath,
-      isNotFound,
       mutatePageData,
       mutateRevisionIdHackmdSynced,
       mutateHasDraftOnHackmd,

+ 1 - 10
packages/app/src/server/models/page.ts

@@ -998,12 +998,7 @@ export default (crowi): any => {
       body: string | null,
       previousBody: string | null,
       user,
-      options: {
-        grant?: PageGrant,
-        grantUserGroupId?: ObjectIdLike,
-        isSyncRevisionToHackmd?: boolean
-        isEmpty?: boolean,
-      } = {},
+      options: {grant?: PageGrant, grantUserGroupId?: ObjectIdLike, isSyncRevisionToHackmd?: boolean} = {},
   ) {
     if (crowi.configManager == null || crowi.pageGrantService == null || crowi.pageService == null) {
       throw Error('Crowi is not set up');
@@ -1062,10 +1057,6 @@ export default (crowi): any => {
 
     newPageData.applyScope(user, grant, grantUserGroupId);
 
-    if (options.isEmpty != null) {
-      newPageData.isEmpty = options.isEmpty;
-    }
-
     // update existing page
     let savedPage = await newPageData.save();
 

+ 4 - 17
packages/app/src/server/routes/page.js

@@ -5,7 +5,6 @@ import urljoin from 'url-join';
 
 import { SupportedTargetModel, SupportedAction } from '~/interfaces/activity';
 import Activity from '~/server/models/activity';
-import { pushRevision } from '~/server/models/page';
 import XssOption from '~/services/xss/xssOption';
 import loggerFactory from '~/utils/logger';
 
@@ -991,8 +990,8 @@ module.exports = function(crowi, app) {
     const isSyncRevisionToHackmd = !!req.body.isSyncRevisionToHackmd; // cast to boolean
     const pageTags = req.body.pageTags || undefined;
 
-    if (pageId === null || pageBody === null) {
-      return res.json(ApiResponse.error('pageId and paegBody are required.'));
+    if (pageId === null || pageBody === null || revisionId === null) {
+      return res.json(ApiResponse.error('page_id, body and revision_id are required.'));
     }
 
     // check page existence
@@ -1003,7 +1002,7 @@ module.exports = function(crowi, app) {
 
     // check revision
     const Revision = crowi.model('Revision');
-    let page = await Page.findByIdAndViewer(pageId, req.user, null, true);
+    let page = await Page.findByIdAndViewer(pageId, req.user);
     if (page != null && revisionId != null && !page.isUpdatable(revisionId)) {
       const latestRevision = await Revision.findById(page.revision).populate('author');
       const returnLatestRevision = {
@@ -1015,25 +1014,13 @@ module.exports = function(crowi, app) {
       return res.json(ApiResponse.error('Posted param "revisionId" is outdated.', 'conflict', returnLatestRevision));
     }
 
-    // update empty page
-    let newRevisionId = null;
-    if (page.isEmpty) {
-      const newRevision = await Revision.prepareRevision(page, pageBody, null, req.user);
-      newRevisionId = newRevision._id.toString();
-      page = await pushRevision(page, newRevision, req.user);
-    }
-
     const options = { isSyncRevisionToHackmd };
     if (grant != null) {
       options.grant = grant;
       options.grantUserGroupId = grantUserGroupId;
     }
 
-    if (page.isEmpty) {
-      options.isEmpty = false;
-    }
-
-    const previousRevision = await Revision.findById(newRevisionId ?? revisionId);
+    const previousRevision = await Revision.findById(revisionId);
     try {
       page = await Page.updatePage(page, pageBody, previousRevision.body, req.user, options);
     }