From 206774cfddcf7d82e890ab164b5b13f69831d7af Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Tue, 27 Feb 2024 14:23:40 +0000 Subject: [PATCH] fix: throw vendor down when request is rejected --- src/core/contractActivation.js | 3 +++ src/core/contractTermination.js | 3 +++ src/core/contractVerification.js | 9 ++++++++- src/core/findUserAddress.js | 3 +++ src/core/findUserPdl.js | 16 +++++++++++----- src/helpers/catch.js | 20 ++++++++++++++++++++ src/index.js | 23 +++++++++++++++-------- 7 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 src/helpers/catch.js diff --git a/src/core/contractActivation.js b/src/core/contractActivation.js index 465d6ef..6a93c62 100644 --- a/src/core/contractActivation.js +++ b/src/core/contractActivation.js @@ -5,6 +5,7 @@ const { parseTags, parseValue, parseServiceId } = require('../helpers/parsing') const { commanderCollectePublicationMesures } = require('../requests/sge') const xml2js = require('xml2js') const Sentry = require('@sentry/node') +const { catchRequestReject } = require('../helpers/catch') /** * @param {string} url @@ -59,6 +60,8 @@ async function activateContract( throw new Error(errors.CAPTCHA_RESOLUTION_FAILED) }) + catchRequestReject(response.body) + const parsedReply = await xml2js.parseStringPromise(response.body, { tagNameProcessors: [parseTags], valueProcessors: [parseValue], diff --git a/src/core/contractTermination.js b/src/core/contractTermination.js index 663278b..39862c1 100644 --- a/src/core/contractTermination.js +++ b/src/core/contractTermination.js @@ -5,6 +5,7 @@ const { parseTags, parseValue } = require('../helpers/parsing') const { commanderArretServiceSouscritMesures } = require('../requests/sge') const xml2js = require('xml2js') const Sentry = require('@sentry/node') +const { catchRequestReject } = require('../helpers/catch') /** * @param {string} url @@ -53,6 +54,8 @@ async function terminateContract( throw new Error(errors.VENDOR_DOWN) }) + catchRequestReject(response.body) + const parsedReply = await xml2js.parseStringPromise(response.body, { tagNameProcessors: [parseTags], valueProcessors: [parseValue], diff --git a/src/core/contractVerification.js b/src/core/contractVerification.js index bb35911..c002bce 100644 --- a/src/core/contractVerification.js +++ b/src/core/contractVerification.js @@ -11,6 +11,7 @@ const { rechercherServicesSouscritsMesures } = require('../requests/sge') const xml2js = require('xml2js') const { contractState } = require('./types/enum') const Sentry = require('@sentry/node') +const { catchRequestReject } = require('../helpers/catch') /** * @param {string} url @@ -45,6 +46,12 @@ async function verifyContract(url, apiAuthKey, appLogin, contractId, pointId) { throw new Error(errors.CAPTCHA_RESOLUTION_FAILED) }) + try { + catchRequestReject(response.body) + } catch (error) { + throw new Error(errors.CAPTCHA_RESOLUTION_FAILED) + } + const parsedReply = await xml2js.parseStringPromise(response.body, { tagNameProcessors: [parseTags], valueProcessors: [parseValue], @@ -79,7 +86,7 @@ async function verifyContract(url, apiAuthKey, appLogin, contractId, pointId) { section: 'verifyContract', }, }) - if (parsedReply.Envelope.Body.Fault) { + if (parsedReply?.Envelope?.Body?.Fault) { log( 'error', `Enedis issue ${parsedReply.Envelope.Body.Fault.detail.erreur.resultat.$.code}: ${parsedReply.Envelope.Body.Fault.faultstring}` diff --git a/src/core/findUserAddress.js b/src/core/findUserAddress.js index 4f7b51d..f5b5465 100644 --- a/src/core/findUserAddress.js +++ b/src/core/findUserAddress.js @@ -9,6 +9,7 @@ const { const xml2js = require('xml2js') const { consulterDonneesTechniquesContractuelles } = require('../requests/sge') const Sentry = require('@sentry/node') +const { catchRequestReject } = require('../helpers/catch') /** * Get user contract start date @@ -43,6 +44,8 @@ async function findUserAddress(url, apiAuthKey, userLogin, pointId) { throw new Error(errors.VENDOR_DOWN) }) + catchRequestReject(response.body) + const result = await xml2js.parseStringPromise(response.body, { tagNameProcessors: [parseTags], valueProcessors: [parseValue], diff --git a/src/core/findUserPdl.js b/src/core/findUserPdl.js index 137a8cc..5ad83f8 100644 --- a/src/core/findUserPdl.js +++ b/src/core/findUserPdl.js @@ -5,6 +5,7 @@ const { parseUserPdl, parseTags, parseValue } = require('../helpers/parsing') const { rechercherPoint } = require('../requests/sge') const xml2js = require('xml2js') const Sentry = require('@sentry/node') +const { catchRequestReject } = require('../helpers/catch') /** * @param {string} url @@ -60,12 +61,17 @@ async function findUserPdl( throw new Error(errors.VENDOR_DOWN) }) - const parsedReply = await xml2js.parseStringPromise(response.body, { - tagNameProcessors: [parseTags], - valueProcessors: [parseValue], - explicitArray: false, - }) + catchRequestReject(response.body) + const parsedReply = await xml2js + .parseStringPromise(response.body, { + tagNameProcessors: [parseTags], + valueProcessors: [parseValue], + explicitArray: false, + }) + .catch(error => { + log('error', 'Error while parsing XML: ' + error) + }) try { return parseUserPdl(parsedReply) } catch (error) { diff --git a/src/helpers/catch.js b/src/helpers/catch.js new file mode 100644 index 0000000..508cff5 --- /dev/null +++ b/src/helpers/catch.js @@ -0,0 +1,20 @@ +const { log } = require('cozy-konnector-libs') + +/** + * Throw an error if the response contains a "Request Rejected" + * Enedis might send a 429 status but the F5 always transform it to a 200 + * @param {string} response + * @example <html><head><title>Request Rejected</title></head> + * <body>The requested URL was rejected. Please consult with your administrator</body></html> + */ +function catchRequestReject(response) { + if (response.includes('Request Rejected')) { + const supportID = response.replace(/\D/g, '') + log('debug', response.slice(0, 100)) + log('error', `Support ID : ${supportID}`) + log('error', 'Request Rejected') + throw new Error('Request Rejected') + } +} + +module.exports = { catchRequestReject } diff --git a/src/index.js b/src/index.js index 5ddd206..e014d54 100644 --- a/src/index.js +++ b/src/index.js @@ -43,6 +43,7 @@ const Sentry = require('@sentry/node') // eslint-disable-next-line const Tracing = require('@sentry/tracing') // Needed for tracking performance in Sentry const { version } = require('../package.json') +const { catchRequestReject } = require('./helpers/catch') moment.locale('fr') // set the language moment.tz.setDefault('Europe/Paris') // set the timezone @@ -398,6 +399,8 @@ async function getOffPeakHours(url, apiAuthKey, userLogin, pointId) { return err }) + catchRequestReject(response.body) + const result = await xml2js.parseStringPromise(response.body, { tagNameProcessors: [parseTags], valueProcessors: [parseValue], @@ -426,14 +429,14 @@ async function getOffPeakHours(url, apiAuthKey, userLogin, pointId) { } /** - * Get hour data + * Get daily data * @param {string} url * @param {string} apiAuthKey * @param {string} userLogin * @param {string} pointId */ async function getData(url, apiAuthKey, userLogin, pointId) { - log('info', 'Fetching data') + log('info', 'Fetching daily data') const sgeHeaders = { 'Content-Type': 'text/xml;charset=UTF-8', apikey: apiAuthKey, @@ -459,6 +462,8 @@ async function getData(url, apiAuthKey, userLogin, pointId) { return err }) + catchRequestReject(response.body) + xml2js.parseString( response.body, { @@ -466,7 +471,7 @@ async function getData(url, apiAuthKey, userLogin, pointId) { valueProcessors: [parseValue], explicitArray: false, }, - processData() + processData('com.grandlyon.enedis.day') ) } @@ -502,6 +507,8 @@ async function getMaxPowerData(url, apiAuthKey, userLogin, pointId) { return err }) + catchRequestReject(response.body) + xml2js.parseString( response.body, { @@ -521,7 +528,7 @@ async function getMaxPowerData(url, apiAuthKey, userLogin, pointId) { * @param {string} pointId */ async function getDataHalfHour(url, apiAuthKey, userLogin, pointId) { - log('info', 'Fetching data') + log('info', 'Fetching half-hour data') const sgeHeaders = { 'Content-Type': 'text/xml;charset=UTF-8', apikey: apiAuthKey, @@ -562,6 +569,8 @@ async function getDataHalfHour(url, apiAuthKey, userLogin, pointId) { return err }) + catchRequestReject(response.body) + xml2js.parseString( response.body, { @@ -579,7 +588,7 @@ async function getDataHalfHour(url, apiAuthKey, userLogin, pointId) { * @param {string} doctype * @returns */ -function processData(doctype = 'com.grandlyon.enedis.day') { +function processData(doctype) { return async (err, result) => { if (err) { log('error', err) @@ -587,7 +596,7 @@ function processData(doctype = 'com.grandlyon.enedis.day') { throw err } // Return only needed part of info - log('info', doctype) + log('info', `Processing ${doctype} data`) try { const data = parseSgeXmlData(result) const processedDailyData = await storeData( @@ -595,8 +604,6 @@ function processData(doctype = 'com.grandlyon.enedis.day') { doctype, ['year', 'month', 'day', 'hour', 'minute'] ) - - log('info', 'Aggregate enedis daily data for month and year') if (doctype === 'com.grandlyon.enedis.day') { log('info', 'Aggregating...') await aggregateMonthAndYearData(processedDailyData) -- GitLab