Просмотр исходного кода

WIP: GC-524: organize starting process

* refactor isHackmdBodyHasDraft -> hasDraftOnHackmd
* impl hackmd.saveOnHackmd route
Yuki Takei 7 лет назад
Родитель
Сommit
6d3db9997b

+ 17 - 3
lib/models/page.js

@@ -71,7 +71,7 @@ module.exports = function(crowi) {
     },
     pageIdOnHackmd: String,
     revisionHackmdSynced: { type: ObjectId, ref: 'Revision' },  // the revision that is synced to HackMD
-    isHackmdBodyHasDraft: { type: Boolean },                    // set true if revision and revisionHackmdSynced are same but HackMD document has modified
+    hasDraftOnHackmd: { type: Boolean },                        // set true if revision and revisionHackmdSynced are same but HackMD document has modified
     createdAt: { type: Date, default: Date.now },
     updatedAt: Date
   }, {
@@ -1325,12 +1325,26 @@ module.exports = function(crowi) {
    */
   pageSchema.statics.syncRevisionToHackmd = function(pageData) {
     pageData.revisionHackmdSynced = pageData.revision;
-    pageData.isHackmdBodyHasDraft = false;
+    pageData.hasDraftOnHackmd = false;
     return pageData.save();
   };
 
+  /**
+   * update hasDraftOnHackmd if revision and 'bodyOnHackmd' has difference
+   * @param {Page} pageData
+   * @param {string} bodyOnHackmd
+   */
+  pageSchema.statics.updateIfHackmdHasDraft = async function(pageData, bodyOnHackmd) {
+    if (pageData.revision !== pageData.revisionHackmdSynced) {
+      return;
+    }
+    else if (pageData.hasDraftOnHackmd) {
+      // do nothing when hasDraftOnHackmd is already 'true'
+      return;
+    }
 
-    // update page
+    pageData = await pageData.populate();
+    pageData.hasDraftOnHackmd = pageData.revision.body !== bodyOnHackmd;
     return pageData.save();
   };
 

+ 17 - 7
lib/routes/hackmd.js

@@ -83,7 +83,7 @@ module.exports = function(crowi, app) {
       const data = {
         pageIdOnHackmd: page.pageIdOnHackmd,
         revisionIdHackmdSynced: page.revisionHackmdSynced,
-        isHackmdBodyHasDraft: page.isHackmdBodyHasDraft,
+        hasDraftOnHackmd: page.hasDraftOnHackmd,
       };
       return res.json(ApiResponse.success(data));
     }
@@ -104,13 +104,22 @@ module.exports = function(crowi, app) {
     return Page.registerHackmdPage(page, pageIdOnHackmd);
   }
 
-    try {
-      await Page.registerHackmdPage(page, pageIdOnHackmd);
+  /**
+   * POST /_api/hackmd.saveOnHackmd
+   *
+   * receive when save operation triggered on HackMD
+   * !! This will be invoked many time from many people !!
+   *
+   * @param {object} req
+   * @param {object} res
+   */
+  const saveOnHackmd = async function(req, res) {
+    const page = req.page;
+    const bodyOnHackmd = req.body.bodyOnHackmd;
 
-      const data = {
-        pageIdOnHackmd,
-      };
-      return res.json(ApiResponse.success(data));
+    try {
+      await Page.updateIfHackmdHasDraft(page, bodyOnHackmd);
+      return res.json(ApiResponse.success());
     }
     catch (err) {
       return res.json(ApiResponse.error(err));
@@ -121,5 +130,6 @@ module.exports = function(crowi, app) {
     loadAgent,
     validateForApi,
     integrate,
+    saveOnHackmd,
   };
 };

+ 1 - 0
lib/routes/index.js

@@ -203,6 +203,7 @@ module.exports = function(crowi, app) {
 
   app.get('/_hackmd/load-agent'        , hackmd.loadAgent);
   app.post('/_api/hackmd.integrate'    , accessTokenParser , loginRequired(crowi, app) , csrf, hackmd.validateForApi, hackmd.integrate);
+  app.post('/_api/hackmd.saveOnHackmd' , accessTokenParser , loginRequired(crowi, app) , csrf, hackmd.validateForApi, hackmd.saveOnHackmd);
 
   app.get('/*/$'                   , loginRequired(crowi, app, false) , page.pageListShowWrapper);
   app.get('/*'                     , loginRequired(crowi, app, false) , page.pageShowWrapper);

+ 3 - 3
lib/routes/page.js

@@ -181,7 +181,7 @@ module.exports = function(crowi, app) {
         renderVars.revision = portalPage.revision;
         renderVars.pageIdOnHackmd = portalPage.pageIdOnHackmd;
         renderVars.revisionHackmdSynced = portalPage.revisionHackmdSynced;
-        renderVars.isHackmdBodyHasDraft = portalPage.isHackmdBodyHasDraft;
+        renderVars.hasDraftOnHackmd = portalPage.hasDraftOnHackmd;
         return Revision.findRevisionList(portalPage.path, {});
       }
       else {
@@ -259,7 +259,7 @@ module.exports = function(crowi, app) {
       pageRelatedGroup: null,
       template: null,
       revisionHackmdSynced: null,
-      isHackmdBodyHasDraft: false,
+      hasDraftOnHackmd: false,
       slack: '',
     };
 
@@ -285,7 +285,7 @@ module.exports = function(crowi, app) {
         renderVars.author = page.revision.author;
         renderVars.pageIdOnHackmd = page.pageIdOnHackmd;
         renderVars.revisionHackmdSynced = page.revisionHackmdSynced;
-        renderVars.isHackmdBodyHasDraft = page.isHackmdBodyHasDraft;
+        renderVars.hasDraftOnHackmd = page.hasDraftOnHackmd;
 
         return Revision.findRevisionList(page.path, {})
         .then(function(tree) {

+ 1 - 1
lib/views/widget/page_content.html

@@ -7,7 +7,7 @@
   data-page-revision-created="{% if revision %}{{ revision.createdAt|datetz('U') }}{% endif %}"
   data-page-revision-id-hackmd-synced="{% if revisionHackmdSynced %}{{ revisionHackmdSynced.toString() }}{% endif %}"
   data-page-id-on-hackmd="{% if pageIdOnHackmd %}{{ pageIdOnHackmd.toString() }}{% endif %}"
-  data-page-hackmd-body-has-draft="{% if isHackmdBodyHasDraft %}{{ isHackmdBodyHasDraft.toString() }}{% endif %}"
+  data-page-has-draft-on-hackmd="{% if hasDraftOnHackmd %}{{ hasDraftOnHackmd.toString() }}{% endif %}"
   data-page-is-seen="{% if page and page.isSeenUser(user) %}1{% else %}0{% endif %}"
   data-slack-channels="{{ slack|default('') }}"
   >

+ 3 - 3
resource/js/app.js

@@ -52,7 +52,7 @@ let pageId = null;
 let pageRevisionId = null;
 let pageRevisionCreatedAt = null;
 let pageRevisionIdHackmdSynced = null;
-let isHackmdBodyHasDraft = false;
+let hasDraftOnHackmd = false;
 let pageIdOnHackmd = null;
 let pagePath;
 let pageContent = '';
@@ -64,7 +64,7 @@ if (mainContent !== null) {
   pageRevisionCreatedAt = +mainContent.getAttribute('data-page-revision-created');
   pageRevisionIdHackmdSynced = mainContent.getAttribute('data-page-revision-id-hackmd-synced') || null;
   pageIdOnHackmd = mainContent.getAttribute('data-page-id-on-hackmd') || null;
-  isHackmdBodyHasDraft = !!mainContent.getAttribute('data-page-hackmd-body-has-draft');
+  hasDraftOnHackmd = !!mainContent.getAttribute('data-page-has-draft-on-hackmd');
   pagePath = mainContent.attributes['data-path'].value;
   slackChannels = mainContent.getAttribute('data-slack-channels');
   const rawText = document.getElementById('raw-text-original');
@@ -283,7 +283,7 @@ if (pageEditorWithHackmdElem) {
   pageEditor = ReactDOM.render(
     <PageEditorByHackmd crowi={crowi}
         pageId={pageId} revisionId={pageRevisionId}
-        pageIdOnHackmd={pageIdOnHackmd} revisionIdHackmdSynced={pageRevisionIdHackmdSynced} isHackmdBodyHasDraft={isHackmdBodyHasDraft}
+        pageIdOnHackmd={pageIdOnHackmd} revisionIdHackmdSynced={pageRevisionIdHackmdSynced} hasDraftOnHackmd={hasDraftOnHackmd}
         markdown={markdown}
         onSaveSuccess={onSaveSuccess} />,
     pageEditorWithHackmdElem

+ 3 - 3
resource/js/components/PageEditorByHackmd.jsx

@@ -116,8 +116,8 @@ export default class PageEditorByHackmd extends React.PureComponent {
         </div>
       );
     }
-    // page is exists, revisions are match, isHackmdBodyHasDraft is true
-    else if (isPageExistsOnHackmd && isRevisionMatch && this.props.isHackmdBodyHasDraft) {
+    // page is exists, revisions are match, hasDraftOnHackmd is true
+    else if (isPageExistsOnHackmd && isRevisionMatch && this.props.hasDraftOnHackmd) {
       content = (
         <div>
           <p className="text-center hackmd-status-label"><i className="fa fa-file-text"></i> HackMD is READY!</p>
@@ -163,5 +163,5 @@ PageEditorByHackmd.propTypes = {
   revisionId: PropTypes.string,
   pageIdOnHackmd: PropTypes.string,
   revisionIdHackmdSynced: PropTypes.string,
-  isHackmdBodyHasDraft: PropTypes.bool,
+  hasDraftOnHackmd: PropTypes.bool,
 };