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