From 82c13959baac7ce1f5c37b4cb07f334116ec8bf2 Mon Sep 17 00:00:00 2001
From: Jure Triglav <juretriglav@gmail.com>
Date: Tue, 9 Jun 2020 16:05:53 +0200
Subject: [PATCH] feat(manuscript): use submission field as a pure JSON blob to
 simplify changing forms

---
 .../src/components/SubmitPage.js                |  6 +++++-
 .../src/index.js                                |  0
 .../src/manuscript.js                           |  2 ++
 .../src/migrations/1537450834-manuscript.sql    |  1 +
 .../src/resolvers.js                            | 17 +++++++++++++++++
 .../src/typeDefs.js                             |  3 +++
 6 files changed, 28 insertions(+), 1 deletion(-)
 rename server/{manuscript => model-manuscript}/src/index.js (100%)
 rename server/{manuscript => model-manuscript}/src/manuscript.js (99%)
 rename server/{manuscript => model-manuscript}/src/migrations/1537450834-manuscript.sql (93%)
 rename server/{manuscript => model-manuscript}/src/resolvers.js (89%)
 rename server/{manuscript => model-manuscript}/src/typeDefs.js (97%)

diff --git a/app/components/component-xpub-submit/src/components/SubmitPage.js b/app/components/component-xpub-submit/src/components/SubmitPage.js
index d8ddaa6fb2..9f64e1796b 100644
--- a/app/components/component-xpub-submit/src/components/SubmitPage.js
+++ b/app/components/component-xpub-submit/src/components/SubmitPage.js
@@ -90,6 +90,7 @@ const fragmentFields = `
     email
     affiliation
   }
+  submission
 `
 
 const query = gql`
@@ -237,7 +238,10 @@ export default compose(
   })),
   withFormik({
     initialValues: {},
-    mapPropsToValues: ({ manuscript }) => manuscript,
+    mapPropsToValues: ({ manuscript }) =>
+      Object.assign({}, manuscript, {
+        submission: JSON.parse(manuscript.submission),
+      }),
     displayName: 'submit',
     handleSubmit: (
       props,
diff --git a/server/manuscript/src/index.js b/server/model-manuscript/src/index.js
similarity index 100%
rename from server/manuscript/src/index.js
rename to server/model-manuscript/src/index.js
diff --git a/server/manuscript/src/manuscript.js b/server/model-manuscript/src/manuscript.js
similarity index 99%
rename from server/manuscript/src/manuscript.js
rename to server/model-manuscript/src/manuscript.js
index 682b1f8627..dfba3ae900 100644
--- a/server/manuscript/src/manuscript.js
+++ b/server/model-manuscript/src/manuscript.js
@@ -248,10 +248,12 @@ class Manuscript extends BaseModel {
             keywords: { type: ['string', 'null'] },
           },
         },
+        submission: {},
       },
     }
   }
 
+  // TODO: Do this on the DB level with cascading deletes
   async $beforeDelete() {
     // const Review = require('../../review/src/review')
     const { Review, Team, File } = require('@pubsweet/models')
diff --git a/server/manuscript/src/migrations/1537450834-manuscript.sql b/server/model-manuscript/src/migrations/1537450834-manuscript.sql
similarity index 93%
rename from server/manuscript/src/migrations/1537450834-manuscript.sql
rename to server/model-manuscript/src/migrations/1537450834-manuscript.sql
index 9c4ec1ede1..1fe9713efa 100644
--- a/server/manuscript/src/migrations/1537450834-manuscript.sql
+++ b/server/model-manuscript/src/migrations/1537450834-manuscript.sql
@@ -8,5 +8,6 @@ CREATE TABLE manuscripts (
     authors JSONB,
     suggestions JSONB,
     meta JSONB,
+    submission JSONB,
     type TEXT NOT NULL
 );
\ No newline at end of file
diff --git a/server/manuscript/src/resolvers.js b/server/model-manuscript/src/resolvers.js
similarity index 89%
rename from server/manuscript/src/resolvers.js
rename to server/model-manuscript/src/resolvers.js
index 003b0a8e04..2d1e49a89a 100644
--- a/server/manuscript/src/resolvers.js
+++ b/server/model-manuscript/src/resolvers.js
@@ -7,6 +7,13 @@ const resolvers = {
       const { Team } = require('@pubsweet/models')
 
       const { meta, files } = vars.input
+
+      // We want the submission information to be stored as JSONB
+      // but we want the input to come in as a JSON string
+      const submission = vars.input.submission
+        ? JSON.parse(vars.input.submission)
+        : {}
+
       const emptyManuscript = {
         meta: Object.assign(meta, {
           notes: [
@@ -21,7 +28,9 @@ const resolvers = {
           ],
         }),
         status: 'new',
+        submission,
       }
+
       // eslint-disable-next-line
       const manuscript = await new ctx.connectors.Manuscript.model(
         emptyManuscript,
@@ -173,6 +182,14 @@ const resolvers = {
       return form
     },
   },
+  // We want submission into to come out as a stringified JSON, so that we don't have to
+  // change our queries if the submission form changes. We still want to store it as JSONB
+  // so that we can easily search through the information within.
+  Manuscript: {
+    submission(parent, args, ctx) {
+      return JSON.stringify(parent.submission)
+    },
+  },
 }
 
 module.exports = resolvers
diff --git a/server/manuscript/src/typeDefs.js b/server/model-manuscript/src/typeDefs.js
similarity index 97%
rename from server/manuscript/src/typeDefs.js
rename to server/model-manuscript/src/typeDefs.js
index 26c8cbdcc5..878abbd596 100644
--- a/server/manuscript/src/typeDefs.js
+++ b/server/model-manuscript/src/typeDefs.js
@@ -27,6 +27,7 @@ const typeDefs = `
     suggestions: Suggestions
     authors: [Author]
     meta: ManuscriptMeta
+    submission: String
   }
 
   type ManuscriptVersion implements Object {
@@ -42,11 +43,13 @@ const typeDefs = `
     suggestions: Suggestions
     authors: [Author]
     meta: ManuscriptMeta
+    submission: String
   }
 
   input ManuscriptInput {
     files: [FileInput]
     meta: ManuscriptMetaInput
+    submission: String
   }
 
   input ManuscriptMetaInput {
-- 
GitLab