From e67afb22506111ff80c3b12c822d03b9f7143144 Mon Sep 17 00:00:00 2001
From: Audrey Hamelers <hamelers@ebi.ac.uk>
Date: Tue, 22 Jan 2019 17:13:55 +0000
Subject: [PATCH] WIP: working with journals. #190, #159, #194

---
 app/components/PubMedSearch.jsx               |  6 ++---
 app/components/dashboard/DashboardList.jsx    |  2 +-
 app/components/dashboard/operations.js        |  5 ++++
 app/components/submission-wizard/Citation.jsx |  4 ++--
 .../submission-wizard/CreatePage.jsx          | 11 ++++++---
 .../submission-wizard/operations.js           |  8 +++++++
 .../entities/journal/data-access.js           | 16 +++++++++++++
 .../entities/manuscript/data-access.js        |  6 ++---
 .../entities/manuscript/helpers/transform.js  | 23 +++++++++++++++++++
 .../xpub-model/entities/manuscript/index.js   | 18 ++++++++-------
 .../entities/manuscript/resolvers.js          |  1 -
 .../entities/manuscript/typeDefs.graphqls     |  1 +
 12 files changed, 80 insertions(+), 21 deletions(-)

diff --git a/app/components/PubMedSearch.jsx b/app/components/PubMedSearch.jsx
index c92222707..b4d36c1b5 100755
--- a/app/components/PubMedSearch.jsx
+++ b/app/components/PubMedSearch.jsx
@@ -143,7 +143,7 @@ class PubMedSearch extends React.Component {
       const indexedby = xml.match(/<IndexingSourceName(.*)<\/IndexingSourceName>/g)
       console.log(indexedby) */
       const date = new Date(result.sortpubdate)
-      const metadata = {
+      const citationData = {
         title: result.title,
         articleIds: [
           {
@@ -157,9 +157,9 @@ class PubMedSearch extends React.Component {
             date,
           },
         ],
-        unmatchedJournal: result.source,
+        nlmId: result.nlmuniqueid,
       }
-      this.props.citationData(metadata)
+      this.props.citationData(citationData)
     }
   }
   render() {
diff --git a/app/components/dashboard/DashboardList.jsx b/app/components/dashboard/DashboardList.jsx
index 3fbb90e97..eae4e0837 100644
--- a/app/components/dashboard/DashboardList.jsx
+++ b/app/components/dashboard/DashboardList.jsx
@@ -281,7 +281,7 @@ const DashboardList = ({
               <span>{manuscript.id}</span>
               {pmid && <span>PMID: {pmid.id}</span>}
               <span>
-                JOURNAL: {journal ? journal.journalTitle : unmatchedJournal}
+                JOURNAL: {journal ? journal.meta.nlmta : unmatchedJournal}
               </span>
               {releaseDelay && (
                 <span>
diff --git a/app/components/dashboard/operations.js b/app/components/dashboard/operations.js
index e1773ac5f..300b972fb 100644
--- a/app/components/dashboard/operations.js
+++ b/app/components/dashboard/operations.js
@@ -50,6 +50,11 @@ const DashboardFragment = gql`
     status
     updated
     formState
+    journal {
+      meta {
+        nlmta
+      }
+    }
     meta {
       title
       articleIds {
diff --git a/app/components/submission-wizard/Citation.jsx b/app/components/submission-wizard/Citation.jsx
index 987a3f74b..8cd791ec9 100755
--- a/app/components/submission-wizard/Citation.jsx
+++ b/app/components/submission-wizard/Citation.jsx
@@ -9,14 +9,14 @@ const Small = styled.span`
 `
 
 const Citation = props => {
-  const { articleIds, title, journalMeta, unmatchedJournal } = props.metadata
+  const { title, articleIds, unmatchedJournal } = props.metadata
   return (
     <p>
       <HTMLString string={title} />
       <Small>
         <span>
           <HTMLString
-            string={journalMeta ? journalMeta.title : unmatchedJournal}
+            string={props.journal ? props.journal.meta.nlmta : unmatchedJournal}
           />
         </span>
         {articleIds && articleIds.length > 0 && (
diff --git a/app/components/submission-wizard/CreatePage.jsx b/app/components/submission-wizard/CreatePage.jsx
index 3efab7ccb..41c2e2269 100755
--- a/app/components/submission-wizard/CreatePage.jsx
+++ b/app/components/submission-wizard/CreatePage.jsx
@@ -148,7 +148,7 @@ class Created extends React.Component {
   render() {
     const currentUser = this.context
     const { currentStep, status, error, checked } = this.state
-    const { id: mId, meta, files: allfiles } = this.props.manuscript
+    const { id: mId, meta, journal, files: allfiles } = this.props.manuscript
     const { notes } = meta
     const files = allfiles
       ? allfiles.filter(
@@ -161,6 +161,11 @@ class Created extends React.Component {
     return (
       <Mutation mutation={UPDATE_MANUSCRIPT}>
         {(updateManuscript, { data }) => {
+          const changeCitation = async meta => {
+            await updateManuscript({
+              variables: { data: { id: mId, meta } },
+            })
+          }
           const updateEmbargo = async releaseDelay => {
             await updateManuscript({
               variables: { data: { id: mId, meta: { releaseDelay } } },
@@ -208,7 +213,7 @@ class Created extends React.Component {
                         <React.Fragment>
                           <H2>Citation</H2>
                           <PubMedSearch
-                            citationData={this.createNewManuscriptVersion}
+                            citationData={changeCitation}
                             metadata={meta}
                           />
                         </React.Fragment>
@@ -218,7 +223,7 @@ class Created extends React.Component {
                             Citation selected
                           </H2>
                           <Confirm>
-                            <Citation metadata={meta} />
+                            <Citation journal={journal} metadata={meta} />
                             <Icon color="currentColor" size={5}>
                               check
                             </Icon>
diff --git a/app/components/submission-wizard/operations.js b/app/components/submission-wizard/operations.js
index f88e59e75..c52a14982 100644
--- a/app/components/submission-wizard/operations.js
+++ b/app/components/submission-wizard/operations.js
@@ -14,6 +14,14 @@ export const GET_MANUSCRIPT = gql`
       id
       status
       formState
+      journal {
+        journalTitle
+        meta {
+          nlmta
+          pmcStatus
+          pubmedStatus
+        }
+      }
       meta {
         title
         articleIds {
diff --git a/server/xpub-model/entities/journal/data-access.js b/server/xpub-model/entities/journal/data-access.js
index bf3773cf9..6ef633f05 100644
--- a/server/xpub-model/entities/journal/data-access.js
+++ b/server/xpub-model/entities/journal/data-access.js
@@ -27,6 +27,8 @@ class Journal extends EpmcBaseModel {
         'meta,nlmuniqueid': { type: ['string', 'null'] },
         'meta,pmcStatus': { type: 'boolean' },
         'meta,pubmedStatus': { type: 'boolean' },
+        'meta,firstYear': { type: 'string' },
+        'meta,endYear': { type: 'string' },
       },
     }
   }
@@ -58,6 +60,20 @@ class Journal extends EpmcBaseModel {
     return rowToEntity(rows[0])
   }
 
+  static async getIdByNlmId(nlmId) {
+    const row = await runQuery(
+      buildQuery
+        .select('journal.id')
+        .from('journal')
+        .where('meta,nlmuniqueid', nlmId)
+        .first(),
+    )
+    if (!row) {
+      throw new Error('journal not found')
+    }
+    return row.id
+  }
+
   static async selectAll() {
     const rows = await runQuery(buildQuery.select().from('journal'))
     return rows.map(rowToEntity)
diff --git a/server/xpub-model/entities/manuscript/data-access.js b/server/xpub-model/entities/manuscript/data-access.js
index 55af7439f..07a188bfb 100644
--- a/server/xpub-model/entities/manuscript/data-access.js
+++ b/server/xpub-model/entities/manuscript/data-access.js
@@ -213,7 +213,7 @@ class Manuscript extends EpmcBaseModel {
       manuscripts = await Manuscript.query()
         .select('manuscript.*')
         .where('manuscript.id', id)
-        .eager('[teams.users, notes, files]')
+        .eager('[journal, teams.users, notes, files]')
     } else {
       manuscripts = await Manuscript.query().where('id', id)
     }
@@ -237,7 +237,7 @@ class Manuscript extends EpmcBaseModel {
       const manuscripts = await Manuscript.query()
         .distinct('manuscript.id')
         .select('manuscript.*')
-        .eager('[teams.users, claiming]')
+        .eager('[teams.users, claiming, journal]')
         .whereIn('status', status)
       logger.debug('manuscripts: ', manuscripts)
       return manuscripts
@@ -270,7 +270,7 @@ class Manuscript extends EpmcBaseModel {
       .leftJoin('team', 'team.manuscript_id', 'manuscript.id')
       .groupBy('manuscript.id', 'team.user_id', 'team.role_name')
       .where('team.user_id', user)
-      .eager('[teams.users]')
+      .eager('[teams.users, journal]')
     return manuscripts
   }
 
diff --git a/server/xpub-model/entities/manuscript/helpers/transform.js b/server/xpub-model/entities/manuscript/helpers/transform.js
index 32d655dc2..8ee0cf7f0 100644
--- a/server/xpub-model/entities/manuscript/helpers/transform.js
+++ b/server/xpub-model/entities/manuscript/helpers/transform.js
@@ -28,12 +28,32 @@ const dManuscriptUpdate = (data, userId) => {
   if (data.claimedBy) {
     properties.claimedBy = data.claimedBy
   }
+  if (data.journalId) {
+    properties.journalId = data.journalId
+  }
   if (userId) {
     properties.updatedBy = userId
   }
   return new Manuscript(properties)
 }
 
+const gJournal = model => {
+  const journal = {
+    journalTitle: model.journalTitle,
+    meta: {
+      publisherName: model['meta,publisherName'],
+      issn: model['meta,issn'],
+      nlmta: model['meta,nlmta'],
+      nlmuniqueid: model['meta,nlmuniqueid'],
+      pmcStatus: model['meta,pmcStatus'],
+      pubmedStatus: model['meta,pubmedStatus'],
+      firstYear: model['meta,firstYear'],
+      endYear: model['meta,endYear'],
+    },
+  }
+  return journal
+}
+
 // Transform from Database model to GraphQL data
 const gManuscript = model => {
   const manuscript = {}
@@ -41,6 +61,9 @@ const gManuscript = model => {
   manuscript.updated = model.updated
   manuscript.status = model.status
   manuscript.formState = model.formState
+  if (model.journal) {
+    manuscript.journal = gJournal(model.journal)
+  }
   manuscript.meta = {}
   if (model['meta,title']) {
     manuscript.meta.title = model['meta,title']
diff --git a/server/xpub-model/entities/manuscript/index.js b/server/xpub-model/entities/manuscript/index.js
index f0bd12fcb..dfa41dbef 100755
--- a/server/xpub-model/entities/manuscript/index.js
+++ b/server/xpub-model/entities/manuscript/index.js
@@ -9,7 +9,7 @@ const FileAccess = require('../file/data-access')
 const NoteAccess = require('../note/data-access')
 const ReviewAccess = require('../review/data-access')
 const Team = require('../team/data-access')
-const UserAccess = require('../user/data-access')
+const Journal = require('../journal/data-access')
 const { dManuscriptUpdate, gManuscript } = require('./helpers/transform')
 
 const mergeObjects = (...inputs) =>
@@ -134,18 +134,20 @@ const Manuscript = {
     return savedMan
   },
 
-  update: async (input, userId, eager = false) => {
+  update: async (input, userId) => {
     const originalMan = await ManuscriptAccess.selectById(input.id)
     if (!originalMan) {
       throw new Error('Manuscript not found')
     }
-
-    const manuscriptUpdate = dManuscriptUpdate(input, userId)
-    lodash.assign(originalMan, manuscriptUpdate)
-    const updatedMan = await originalMan.save()
-    if (eager) {
-      updatedMan.claiming = await UserAccess.findById(userId)
+    const newInput = input
+    if (input.meta.nlmId) {
+      input.journalId = await Journal.getIdByNlmId(input.meta.nlmId)
+      delete newInput.meta.nlmId
     }
+    const manuscriptUpdate = dManuscriptUpdate(newInput, userId)
+    lodash.assign(originalMan, manuscriptUpdate)
+    await originalMan.save()
+    const updatedMan = await ManuscriptAccess.selectById(input.id, true)
     return gManuscript(updatedMan)
   },
 
diff --git a/server/xpub-server/entities/manuscript/resolvers.js b/server/xpub-server/entities/manuscript/resolvers.js
index 98e891f3b..2edd1c7f6 100644
--- a/server/xpub-server/entities/manuscript/resolvers.js
+++ b/server/xpub-server/entities/manuscript/resolvers.js
@@ -80,7 +80,6 @@ const resolvers = {
       const updatedMan = await ManuscriptManager.update(
         { id, claimedBy: user },
         user,
-        true,
       )
       return updatedMan
     },
diff --git a/server/xpub-server/entities/manuscript/typeDefs.graphqls b/server/xpub-server/entities/manuscript/typeDefs.graphqls
index eb5374a60..54d9d236d 100644
--- a/server/xpub-server/entities/manuscript/typeDefs.graphqls
+++ b/server/xpub-server/entities/manuscript/typeDefs.graphqls
@@ -39,6 +39,7 @@ input ManuscriptMetaInput {
   fundingGroup: [FundingGroupInput]
   releaseDelay: String
   unmatchedJournal: String
+  nlmId: String
 }
 
 input ArticleIdInput {
-- 
GitLab