Skip to content
Snippets Groups Projects
Commit f2c24e1f authored by Audrey Hamelers's avatar Audrey Hamelers
Browse files

WIP: #239 duplicate check

parent eb364b62
No related branches found
No related tags found
2 merge requests!45Shared data model,!60Dev
......@@ -22,7 +22,7 @@ import {
SectionHeader as Header,
} from '../ui'
import { UserContext } from '../App'
import { GET_MANUSCRIPT } from './operations'
import { GET_MANUSCRIPT, CHECK_DUPES } from './operations'
import UploadFiles, { SubmissionTypes } from '../upload-files'
import PubMedSearch from '../citation-search'
import { FileThumbnails } from '../preview-files'
......@@ -94,7 +94,7 @@ class Submit extends React.Component {
`${name.title ? `${name.title} ` : ''}${name.givenNames} ${name.surname}`
render() {
const currentUser = this.context
const { manuscript } = this.props
const { manuscript, duplicates } = this.props
const {
id: mId,
meta,
......@@ -159,14 +159,26 @@ class Submit extends React.Component {
</div>
),
error:
// TODO: Add test for duplicate articles!
currentUser.admin && status === 'submitted' && unmatchedJournal ? (
<ErrorMessage>
<Icon color="currentColor" size={2}>
alert_circle
</Icon>
Journal is not in the NLM Catalog.
</ErrorMessage>
(currentUser.admin && status === 'submitted' && unmatchedJournal) ||
duplicates ? (
<React.Fragment>
{unmatchedJournal && (
<ErrorMessage>
<Icon color="currentColor" size={2}>
alert_circle
</Icon>
Journal is not in the NLM Catalog.
</ErrorMessage>
)}
{duplicates && (
<ErrorMessage>
<Icon color="currentColor" size={2}>
alert_circle
</Icon>
Submission is likely a duplicate.
</ErrorMessage>
)}
</React.Fragment>
) : null,
}
const manuscriptFiles = {
......@@ -405,7 +417,36 @@ class Submit extends React.Component {
const SubmitWithMutations = ManuscriptMutations(Submit)
const SubmitWithHeader = SubmissionHeader(SubmitWithMutations)
const SubmitPage = ({ match, ...props }) => (
const DupeCheckSubmitPage = ({ manuscript, ...props }) => {
const { id, meta } = manuscript
const pmid = meta.articleIds
? meta.articleIds.find(id => id.pubIdType === 'pmid').id
: null
return (
<Query query={CHECK_DUPES} variables={{ id, pmid, title: meta.title }}>
{({ data, loading }) => {
if (loading) {
return (
<Loading>
<LoadingIcon />
</Loading>
)
}
const duplicates =
data.checkDuplicates.length > 0 && data.checkDuplicates
return (
<SubmitWithHeader
duplicates={duplicates}
manuscript={manuscript}
{...props}
/>
)
}}
</Query>
)
}
const SubmitPage = ({ match, currentUser, ...props }) => (
<Query
fetchPolicy="cache-and-network"
query={GET_MANUSCRIPT}
......@@ -419,7 +460,22 @@ const SubmitPage = ({ match, ...props }) => (
</Loading>
)
}
return <SubmitWithHeader manuscript={data.manuscript} {...props} />
if (currentUser.admin) {
return (
<DupeCheckSubmitPage
currentUser={currentUser}
manuscript={data.manuscript}
{...props}
/>
)
}
return (
<SubmitWithHeader
currentUser={currentUser}
manuscript={data.manuscript}
{...props}
/>
)
}}
</Query>
)
......
......@@ -93,6 +93,15 @@ export const GET_MANUSCRIPT = gql`
${ManuscriptFragment}
`
export const CHECK_DUPES = gql`
query($id: ID!, $pmid: String, $title: String!) {
checkDuplicates(id: $id, pmid: $pmid, title: $title) {
...ManuscriptFragment
}
}
${ManuscriptFragment}
`
export const CREATE_MANUSCRIPT = gql`
mutation CreateManuscript {
createManuscript {
......
......@@ -241,13 +241,6 @@ class Manuscript extends EpmcBaseModel {
return manuscripts && manuscripts.length > 0 ? manuscripts[0] : null
}
/* static async selectByIdAndUser(id, user) {
const manuscripts = await Manuscript.query()
.where('id', id)
.andWhere('updated_by', user)
return manuscripts[0]
} */
static async selectByStatus(statuses, page = 0, pageSize = PAGE_SIZE, user) {
const manuscripts =
page === -1
......@@ -337,12 +330,10 @@ class Manuscript extends EpmcBaseModel {
? await Manuscript.query()
.whereJsonSupersetOf('meta,article_ids', [{ id }])
.whereNull('deleted')
.first()
: await Manuscript.query()
.whereJsonSupersetOf('meta,article_ids', [{ id }])
.whereIn('id', manuscriptIds)
.whereNull('deleted')
.first()
return manuscript
}
......
......@@ -59,7 +59,8 @@ const Manuscript = {
if (id.toUpperCase().startsWith('EMS')) {
manuscript = await ManuscriptAccess.selectById(id)
} else {
manuscript = await ManuscriptAccess.searchArticleIds(id, userId)
const manuscripts = await ManuscriptAccess.searchArticleIds(id, userId)
manuscript = manuscripts.pop()
}
return {
manuscript,
......@@ -68,6 +69,35 @@ const Manuscript = {
: [{ message: `No manuscript found with ID: ${id}` }],
}
},
checkDuplicates: async (id, pmid, title, user) => {
let manuscripts = []
if (pmid) {
const idMatches = await ManuscriptAccess.searchArticleIds(pmid, user)
manuscripts = manuscripts.concat(
idMatches.reduce((other, each) => {
if (each.id !== id) {
other.push(each)
}
return other
}, []),
)
}
const titleMatches = await ManuscriptAccess.searchByTitleOrLastname(
title,
0,
10,
user,
)
manuscripts = manuscripts.concat(
titleMatches.results.reduce((other, each) => {
if (each.id !== id && !manuscripts.some(m => m.id === each.id)) {
other.push(each)
}
return other
}, []),
)
return manuscripts
},
countByStatus: async () => {
const { states } = config
const counts = await states.map(async type => {
......
......@@ -19,6 +19,12 @@ const resolvers = {
return ManuscriptManager.all(user)
},
async checkDuplicates(_, { id, pmid, title }, { user }) {
if (!user) {
throw new Error('You are not authenticated!')
}
return ManuscriptManager.checkDuplicates(id, pmid, title, user)
},
async countByStatus(_, vars, { user }) {
if (!user) {
throw new Error('You are not authenticated!')
......
......@@ -23,6 +23,7 @@ extend type Query {
manuscripts: [Manuscript]!
adminManuscripts: [Manuscript]!
countByStatus: [Count]!
checkDuplicates(id: ID!, pmid: String, title: String!): [Manuscript]
searchArticleIds(id: String!): ManuscriptResult!
findByStatus(query: String!, page: Int, pageSize: Int): ManuscriptSearchResult!
searchManuscripts(query: String!, page: Int, pageSize: Int): ManuscriptSearchResult!
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment