From 83d664056b73ecf0fd88fee94b4a312492b79124 Mon Sep 17 00:00:00 2001 From: felixleo22 Date: Fri, 20 Oct 2023 10:51:30 +0200 Subject: [PATCH 1/4] fix: fail enrich if graphql is on error --- src/enrich/lib/csv.js | 21 ++++++++++++++++----- src/enrich/lib/json.js | 19 +++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/enrich/lib/csv.js b/src/enrich/lib/csv.js index 950f11e5..8fe788f8 100644 --- a/src/enrich/lib/csv.js +++ b/src/enrich/lib/csv.js @@ -239,8 +239,7 @@ async function enrichInFile(data, enrichConfig, state) { response = await requestGraphql(data, args, index, state.apikey); } catch (err) { logger.error(`[graphql] Cannot request graphql service at ${config.get('graphql.host')}/graphql`, JSON.stringify(err?.response?.data?.errors)); - await fail(state); - return; + throw err; } // enrichment @@ -336,7 +335,14 @@ async function processEnrichCSV(id, index, args, state, prefix, separator) { data = []; await parser.pause(); - await enrichInFile(copyData, enrichConfig, state); + try { + await enrichInFile(copyData, enrichConfig, state); + } catch (err) { + logger.error(`[job csv] Cannot enrich in file [${enrichedFile}]`, err); + await fail(state); + return; + } + await parser.resume(); } }, @@ -349,9 +355,14 @@ async function processEnrichCSV(id, index, args, state, prefix, separator) { enrichConfig.headers = await enrichHeaderCSV(headers, args); await writeHeaderCSV(headers, separator, enrichedFile); } - await enrichInFile(data, enrichConfig, state); + try { + await enrichInFile(data, enrichConfig, state); + } catch (err) { + logger.error(`[job csv] Cannot enrich in file [${enrichedFile}]`, err); + await fail(state); + return; + } } - logger.info(`[job csv] ${state.enrichedLines}/${state.linesRead} enriched lines`); } diff --git a/src/enrich/lib/json.js b/src/enrich/lib/json.js index 129965a2..e1cc757d 100644 --- a/src/enrich/lib/json.js +++ b/src/enrich/lib/json.js @@ -140,8 +140,7 @@ async function enrichInFile(data, enrichConfig, state) { response = await requestGraphql(data, args, index, state.apikey); } catch (err) { logger.error(`[graphql] Cannot request graphql service at ${config.get('graphql.host')}/graphql`, JSON.stringify(err?.response?.data?.errors)); - await fail(state); - return; + throw err; } // enrichment const enrichedData = enrichArray(data, response); @@ -221,14 +220,26 @@ async function processEnrichJSON(id, index, args, prefix, state) { } if (data.length === 1000) { - await enrichInFile(data, enrichConfig, state); + try { + await enrichInFile(data, enrichConfig, state); + } catch (err) { + logger.error(`[job jsonl] Cannot enrich in file [${enrichedFile}]`, err); + await fail(state); + return; + } data = []; } } // last insertion if (data.length !== 0) { - await enrichInFile(data, enrichConfig, state); + try { + await enrichInFile(data, enrichConfig, state); + } catch (err) { + logger.error(`[job jsonl] Cannot enrich in file [${enrichedFile}]`, err); + await fail(state); + return; + } } logger.info(`[job jsonl] ${state.enrichedLines}/${state.linesRead} enriched lines`); } From b7aa5e9451e8f837a4c1ad36585fc47a6d1e40fc Mon Sep 17 00:00:00 2001 From: felixleo22 Date: Fri, 20 Oct 2023 12:57:10 +0200 Subject: [PATCH 2/4] fix: log countDOI --- src/graphql/app.js | 6 +++++- src/graphql/lib/middlewares/args.js | 24 ++++++++++++++++++++++++ src/graphql/lib/resolvers/getByDOI.js | 10 ++++------ src/graphql/lib/resolvers/unpaywall.js | 10 ++++------ 4 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 src/graphql/lib/middlewares/args.js diff --git a/src/graphql/app.js b/src/graphql/app.js index 50524fc7..a3379ef1 100644 --- a/src/graphql/app.js +++ b/src/graphql/app.js @@ -9,6 +9,7 @@ const { expressMiddleware } = require('@apollo/server/express4'); const { pingRedis, startConnectionRedis } = require('./lib/services/redis'); +const getNumberOfDOI = require('./lib/middlewares/args'); const auth = require('./lib/middlewares/auth'); const logger = require('./lib/logger'); @@ -55,7 +56,10 @@ const server = new ApolloServer({ await server.start(); app.use('/graphql', cors(), json(), auth, expressMiddleware(server, { - context: async ({ req }) => req, + context: async ({ req }) => { + req.countDOI = getNumberOfDOI(req); + return req; + }, })); app.listen(3000, async () => { diff --git a/src/graphql/lib/middlewares/args.js b/src/graphql/lib/middlewares/args.js new file mode 100644 index 00000000..765a35d2 --- /dev/null +++ b/src/graphql/lib/middlewares/args.js @@ -0,0 +1,24 @@ +function getNumberOfDOI(req) { + const patternBetweenBracket = /.*?(\[.*?\]).*?$/i; + // BODY + // { + // query: 'query ($dois: [ID!]!) {GetByDOI(dois: $dois) {doi, is_oa}}', + // variables: { dois: [ '10.1186/s40510-015-0109-6' ] } + // } + if (req?.body?.variables?.dois) { + return req.body.variables.dois.length || '-'; + } + // BODY + // query: '{GetByDOI(dois:["10.1186/s40510-015-0109-6","Coin Coin"]){doi, is_oa}}' + if (req?.body?.query) { + const match = patternBetweenBracket.exec(req?.body?.query); + const listOfDOI = JSON.parse(match[1]); + return listOfDOI.length || '-'; + } + // query: '{ GetByDOI(dois:["10.1186/s40510-015-0109-6"]) { doi, is_oa } } + const match = patternBetweenBracket.exec(req.query.query); + const listOfDOI = JSON.parse(match[1]); + return listOfDOI.length || '-'; +} + +module.exports = getNumberOfDOI; diff --git a/src/graphql/lib/resolvers/getByDOI.js b/src/graphql/lib/resolvers/getByDOI.js index 9ed3a2e3..d9e1f9f8 100644 --- a/src/graphql/lib/resolvers/getByDOI.js +++ b/src/graphql/lib/resolvers/getByDOI.js @@ -39,8 +39,8 @@ function flatten(obj) { return flattened; } -async function GetByDOI(parent, args, req, info) { - const apikey = req.get('X-API-KEY'); +async function GetByDOI(parent, args, contextValue, info) { + const apikey = contextValue.get('X-API-KEY'); if (!apikey) { throw Error('Not authorized'); @@ -80,9 +80,9 @@ async function GetByDOI(parent, args, req, info) { } } - let index = req?.get('index'); + let index = contextValue?.get('index'); - const { attributes } = req; + const { attributes } = contextValue; if (!index) { index = config.get('elasticsearch.indexAlias'); @@ -101,8 +101,6 @@ async function GetByDOI(parent, args, req, info) { const dois = []; - req.countDOI = args?.dois?.length; - // Normalize request args.dois.forEach((doi) => { dois.push(doi.toLowerCase()); diff --git a/src/graphql/lib/resolvers/unpaywall.js b/src/graphql/lib/resolvers/unpaywall.js index d7b6c238..6c99ee16 100644 --- a/src/graphql/lib/resolvers/unpaywall.js +++ b/src/graphql/lib/resolvers/unpaywall.js @@ -39,8 +39,8 @@ function flatten(obj) { return flattened; } -async function unpaywall(parent, args, req, info) { - const apikey = req.get('X-API-KEY'); +async function unpaywall(parent, args, contextValue, info) { + const apikey = contextValue.get('X-API-KEY'); if (!apikey) { throw Error('Not authorized'); @@ -80,9 +80,9 @@ async function unpaywall(parent, args, req, info) { } } - let index = req?.get('index'); + let index = contextValue?.get('index'); - const { attributes } = req; + const { attributes } = contextValue; if (!index) { index = config.get('elasticsearch.indexAlias'); @@ -101,8 +101,6 @@ async function unpaywall(parent, args, req, info) { const dois = []; - req.countDOI = args?.dois?.length; - // Normalize request args.dois.forEach((doi) => { dois.push(doi.toLowerCase()); From fb19b19f491bd00a990d30c1934cf44801502973 Mon Sep 17 00:00:00 2001 From: felixleo22 Date: Fri, 20 Oct 2023 13:03:06 +0200 Subject: [PATCH 3/4] chore: 1.3.2 --- package.json | 2 +- src/apikey/package.json | 2 +- src/enrich/package.json | 2 +- src/fakeUnpaywall/package.json | 2 +- src/frontend/package.json | 2 +- src/graphql/package.json | 2 +- src/health/package.json | 2 +- src/mail/package.json | 2 +- src/update/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 9dda997a..7170d15e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ezunpaywall", - "version": "1.2.2", + "version": "1.3.2", "description": "", "author": "felixleo22", "license": "CeCILL", diff --git a/src/apikey/package.json b/src/apikey/package.json index 1c5e0d00..605d4239 100644 --- a/src/apikey/package.json +++ b/src/apikey/package.json @@ -1,6 +1,6 @@ { "name": "ezunpaywall-apikey", - "version": "1.3.0", + "version": "1.3.2", "description": "", "main": "app.js", "author": "felixleo22", diff --git a/src/enrich/package.json b/src/enrich/package.json index 7739805a..0cc7d361 100644 --- a/src/enrich/package.json +++ b/src/enrich/package.json @@ -1,6 +1,6 @@ { "name": "ezunpaywall-enrich", - "version": "1.3.0", + "version": "1.3.2", "description": "", "main": "app.js", "author": "felixleo22", diff --git a/src/fakeUnpaywall/package.json b/src/fakeUnpaywall/package.json index e994bf4c..2a686b45 100644 --- a/src/fakeUnpaywall/package.json +++ b/src/fakeUnpaywall/package.json @@ -1,6 +1,6 @@ { "name": "fakeunpaywall", - "version": "1.3.0", + "version": "1.3.2", "description": "", "main": "app.js", "author": "felixleo22", diff --git a/src/frontend/package.json b/src/frontend/package.json index a2ab7e59..c01f0dae 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "1.3.0", + "version": "1.3.2", "private": true, "scripts": { "build": "nuxt build", diff --git a/src/graphql/package.json b/src/graphql/package.json index b289e47c..fec45fff 100644 --- a/src/graphql/package.json +++ b/src/graphql/package.json @@ -1,6 +1,6 @@ { "name": "ezunpaywall-graphql-api", - "version": "1.3.0", + "version": "1.3.2", "description": "", "main": "app.js", "author": "felixleo22", diff --git a/src/health/package.json b/src/health/package.json index 46fe14ca..51027d87 100644 --- a/src/health/package.json +++ b/src/health/package.json @@ -1,6 +1,6 @@ { "name": "ezunpaywall-health", - "version": "1.3.0", + "version": "1.3.2", "description": "", "main": "app.js", "author": "felixleo22", diff --git a/src/mail/package.json b/src/mail/package.json index c5dc1d4d..1058008e 100644 --- a/src/mail/package.json +++ b/src/mail/package.json @@ -1,6 +1,6 @@ { "name": "mail", - "version": "1.3.0", + "version": "1.3.2", "description": "", "main": "app.js", "scripts": { diff --git a/src/update/package.json b/src/update/package.json index d246881f..5906b819 100644 --- a/src/update/package.json +++ b/src/update/package.json @@ -1,6 +1,6 @@ { "name": "ezunpaywall-update", - "version": "1.3.0", + "version": "1.3.2", "description": "", "main": "app.js", "author": "felixleo22", From bb9e946375df5a0d9379525b7868fad49d48271c Mon Sep 17 00:00:00 2001 From: felixleo22 Date: Fri, 20 Oct 2023 13:25:13 +0200 Subject: [PATCH 4/4] fix: update middleware args --- src/graphql/app.js | 1 + src/graphql/lib/middlewares/args.js | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/graphql/app.js b/src/graphql/app.js index a3379ef1..51272931 100644 --- a/src/graphql/app.js +++ b/src/graphql/app.js @@ -58,6 +58,7 @@ const server = new ApolloServer({ app.use('/graphql', cors(), json(), auth, expressMiddleware(server, { context: async ({ req }) => { req.countDOI = getNumberOfDOI(req); + return req; }, })); diff --git a/src/graphql/lib/middlewares/args.js b/src/graphql/lib/middlewares/args.js index 765a35d2..2e372ffd 100644 --- a/src/graphql/lib/middlewares/args.js +++ b/src/graphql/lib/middlewares/args.js @@ -6,19 +6,27 @@ function getNumberOfDOI(req) { // variables: { dois: [ '10.1186/s40510-015-0109-6' ] } // } if (req?.body?.variables?.dois) { - return req.body.variables.dois.length || '-'; + return req.body.variables.dois.length; } // BODY // query: '{GetByDOI(dois:["10.1186/s40510-015-0109-6","Coin Coin"]){doi, is_oa}}' if (req?.body?.query) { const match = patternBetweenBracket.exec(req?.body?.query); - const listOfDOI = JSON.parse(match[1]); - return listOfDOI.length || '-'; + if (match?.length >= 1) { + const listOfDOI = JSON.parse(match[1]); + return listOfDOI.length; + } } // query: '{ GetByDOI(dois:["10.1186/s40510-015-0109-6"]) { doi, is_oa } } - const match = patternBetweenBracket.exec(req.query.query); - const listOfDOI = JSON.parse(match[1]); - return listOfDOI.length || '-'; + if (req?.query?.query) { + const match = patternBetweenBracket.exec(req.query.query); + if (match?.length >= 1) { + const listOfDOI = JSON.parse(match[1]); + return listOfDOI.length; + } + } + + return 0; } module.exports = getNumberOfDOI;