Skip to content

Commit c28bda3

Browse files
GQL-125: Add RestoreCitationRevision mutation and retrieving collections associated to the citation records (#174)
* GQL-125: Add RestoreCitationRevision mutation * GQL-125: Adding tests * GQL-125: Fixing naming * GQL-125: Allowing associated collections to be returned from Citation * GQL-125: Updating tests to use Name
1 parent 5d82600 commit c28bda3

File tree

7 files changed

+470
-5
lines changed

7 files changed

+470
-5
lines changed

src/datasources/__tests__/citation.test.js

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import nock from 'nock'
22

33
import {
44
deleteCitation as citationSourceDelete,
5-
fetchCitations as citationSourceFetch
5+
fetchCitations as citationSourceFetch,
6+
restoreCitationRevision as citationSourceRestoreRevision
67
} from '../citation'
78

89
let requestInfo
@@ -314,6 +315,104 @@ describe('citation#fetch', () => {
314315
})
315316
})
316317

318+
describe('restoreCitationRevision', () => {
319+
const OLD_ENV = process.env
320+
321+
beforeEach(() => {
322+
vi.resetAllMocks()
323+
324+
vi.restoreAllMocks()
325+
326+
process.env = { ...OLD_ENV }
327+
328+
process.env.cmrRootUrl = 'http://example-cmr.com'
329+
330+
// Default requestInfo
331+
requestInfo = {
332+
name: 'citationDelete',
333+
alias: 'citationDelete',
334+
args: {
335+
conceptId: 'CIT100000-EDSC',
336+
revisionId: '1'
337+
},
338+
fieldsByTypeName: {
339+
CitationMutationResponse: {
340+
conceptId: {
341+
name: 'conceptId',
342+
alias: 'conceptId',
343+
args: {},
344+
fieldsByTypeName: {}
345+
},
346+
revisionId: {
347+
name: 'revisionId',
348+
alias: 'revisionId',
349+
args: {},
350+
fieldsByTypeName: {}
351+
}
352+
}
353+
}
354+
}
355+
})
356+
357+
afterEach(() => {
358+
process.env = OLD_ENV
359+
})
360+
361+
test('returns the CMR results', async () => {
362+
nock(/example-cmr/)
363+
.defaultReplyHeaders({
364+
'CMR-Request-Id': 'abcd-1234-efgh-5678'
365+
})
366+
.get('/search/citations.umm_json?concept_id=CIT100000-EDSC&all_revisions=true')
367+
.reply(200, {
368+
items: [{
369+
meta: {
370+
'concept-id': 'CIT100000-EDSC',
371+
'native-id': '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed',
372+
'revision-id': 1
373+
},
374+
umm: {
375+
Name: 'Tortor Elit Fusce Quam Risus'
376+
}
377+
}, {
378+
meta: {
379+
'concept-id': 'CIT100000-EDSC',
380+
'native-id': '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed',
381+
'revision-id': 2
382+
},
383+
umm: {
384+
Name: 'Adipiscing Cras Etiam Venenatis'
385+
}
386+
}]
387+
})
388+
389+
nock(/example-cmr/)
390+
.defaultReplyHeaders({
391+
'CMR-Request-Id': 'abcd-1234-efgh-5678'
392+
})
393+
.put('/ingest/providers/EDSC/citations/1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed')
394+
.reply(200, {
395+
'concept-id': 'CIT100000-EDSC',
396+
'revision-id': '3'
397+
})
398+
399+
const response = await citationSourceRestoreRevision({
400+
revisionId: '1',
401+
conceptId: 'CIT100000-EDSC'
402+
}, {
403+
headers: {
404+
'Client-Id': 'eed-test-graphql',
405+
'CMR-Request-Id': 'abcd-1234-efgh-5678'
406+
}
407+
}, requestInfo)
408+
409+
expect(response).toEqual({
410+
conceptId: 'CIT100000-EDSC',
411+
revisionId: '3'
412+
})
413+
})
414+
})
415+
317416
describe('citation#delete', () => {
318417
const OLD_ENV = process.env
319418

src/datasources/citation.js

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import citationKeyMap from '../utils/umm/citationKeyMap.json'
2+
import Citation from '../cmr/concepts/citation'
23

4+
import { cmrQuery } from '../utils/cmrQuery'
5+
import { findPreviousRevision } from '../utils/findPreviousRevision'
6+
import { getProviderFromConceptId } from '../utils/getProviderFromConceptId'
37
import { parseRequestedFields } from '../utils/parseRequestedFields'
4-
import Citation from '../cmr/concepts/citation'
58

69
export const fetchCitations = async (params, context, parsedInfo) => {
710
const { headers } = context
@@ -20,6 +23,56 @@ export const fetchCitations = async (params, context, parsedInfo) => {
2023
return citation.getFormattedResponse()
2124
}
2225

26+
export const restoreCitationRevision = async (args, context, parsedInfo) => {
27+
const { headers } = context
28+
29+
const requestInfo = parseRequestedFields(parsedInfo, citationKeyMap, 'citation')
30+
31+
const {
32+
ingestKeys
33+
} = requestInfo
34+
35+
const citation = new Citation(headers, requestInfo, args)
36+
37+
const {
38+
conceptId,
39+
revisionId
40+
} = args
41+
42+
const previousRevisions = await cmrQuery({
43+
conceptType: 'citations',
44+
options: {
45+
format: 'umm_json'
46+
},
47+
params: {
48+
conceptId,
49+
allRevisions: true
50+
}
51+
})
52+
53+
const { data: responseData } = previousRevisions
54+
55+
// Find the requested revision for the provided concept
56+
const previousRevision = findPreviousRevision(responseData, revisionId)
57+
58+
const { meta, umm } = previousRevision
59+
60+
const { 'native-id': nativeId } = meta
61+
62+
// Query CMR
63+
citation.ingest({
64+
nativeId,
65+
providerId: getProviderFromConceptId(conceptId),
66+
...umm
67+
}, ingestKeys, headers)
68+
69+
// Parse the response from CMR
70+
await citation.parseIngest(requestInfo)
71+
72+
// Return a formatted JSON response
73+
return citation.getFormattedIngestResponse()
74+
}
75+
2376
export const deleteCitation = async (args, context, parsedInfo) => {
2477
const { headers } = context
2578

src/graphql/handler.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ import {
5555

5656
import {
5757
deleteCitation as citationSourceDelete,
58-
fetchCitations as citationSourceFetch
58+
fetchCitations as citationSourceFetch,
59+
restoreCitationRevision as citationSourceRestoreRevision
5960
} from '../datasources/citation'
6061

6162
import {
@@ -235,6 +236,7 @@ export default startServerAndCreateLambdaHandler(
235236
associationSourceDelete,
236237
citationSourceDelete,
237238
citationSourceFetch,
239+
citationSourceRestoreRevision,
238240
collectionDraftProposalSource,
239241
collectionDraftSource,
240242
collectionSourceDelete,

src/resolvers/__tests__/__mocks__/mockServer.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ import {
3838

3939
import {
4040
deleteCitation as citationSourceDelete,
41-
fetchCitations as citationSourceFetch
41+
fetchCitations as citationSourceFetch,
42+
restoreCitationRevision as citationSourceRestoreRevision
4243
} from '../../../datasources/citation'
4344

4445
import {
@@ -108,6 +109,7 @@ export const buildContextValue = (extraContext) => ({
108109
associationSourceDelete,
109110
citationSourceDelete,
110111
citationSourceFetch,
112+
citationSourceRestoreRevision,
111113
collectionDraftProposalSource,
112114
collectionDraftSource,
113115
collectionSourceDelete,

0 commit comments

Comments
 (0)