diff --git a/index.js b/index.js index 9043f7cbc0937bffd9ba8f038fea8be188bd0957..2cef00d7afe94cfbefcdd97880fc5ab312302365 100644 --- a/index.js +++ b/index.js @@ -18,19 +18,15 @@ const xml2js = __webpack_require__(1513) const { buildAgregatedData } = __webpack_require__(1554) const { parseSgeXmlData, - parseSgeXmlTechnicalData, formateDataForDoctype, parseTags, parseValue, - parseUserPdl, + parseContractStartDate, } = __webpack_require__(1555) const { consulterDonneesTechniquesContractuelles, consultationMesuresDetailleesMaxPower, consultationMesuresDetaillees, - rechercherPoint, - commanderCollectePublicationMesures, - commanderArretServiceSouscritMesures, } = __webpack_require__(1556) const { updateBoConsent, @@ -38,7 +34,12 @@ const { getBoConsent, deleteBoConsent, } = __webpack_require__(1557) -const { getInseeCode } = __webpack_require__(1558) +const { verifyUserIdentity } = __webpack_require__(1558) +const { activateContract } = __webpack_require__(1598) +const { verifyContract } = __webpack_require__(1599) +const { terminateContract } = __webpack_require__(1601) +const { getAccount, saveAccountData } = __webpack_require__(1602) +const { iSLocal } = __webpack_require__(1603) moment.locale('fr') // set the language moment.tz.setDefault('Europe/Paris') // set the timezone @@ -53,26 +54,35 @@ let startDailyDateString = startDailyDate.format('YYYY-MM-DD') const startLoadDate = moment().subtract(7, 'day') const endDate = moment() const endDateString = endDate.format('YYYY-MM-DD') +const ACCOUNT_ID = iSLocal() ? 'default_account_id' : 'enedis-sge-grandlyon' module.exports = new BaseKonnector(start) +module.exports = { getContractStartDate } -// The start function is run by the BaseKonnector instance only when it got all the account -// information (fields). When you run this connector yourself in "standalone" mode or "dev" mode, -// the account information come from ./konnector-dev-config.json file -// cozyParameters are static parameters, independents from the account. Most often, it can be a -// secret api key. +/** + * The start function is run by the BaseKonnector instance only when it got all the account + * information (fields). When you run this connector yourself in "standalone" mode or "dev" mode, + * the account information come from ./konnector-dev-config.json file + * cozyParameters are static parameters, independents from the account. Most often, it can be a + * secret api key. + * @param {fields} fields + * @param {{secret: fields}} cozyParameters + */ async function start(fields, cozyParameters) { log('info', 'Gathering data ...') + let pointId = fields.pointId let baseUrl = fields.wso2BaseUrl let apiAuthKey = fields.apiToken - let loginUtilisateur = fields.loginUtilisateur + //TODO switch variable to english + let sgeLogin = fields.sgeLogin log('info', 'Authenticating ...') //TODO: Verify if condition is working in local and on build version if (cozyParameters && Object.keys(cozyParameters).length !== 0) { log('debug', 'Found COZY_PARAMETERS') + pointId = cozyParameters.secret.pointId baseUrl = cozyParameters.secret.wso2BaseUrl apiAuthKey = cozyParameters.secret.apiToken - loginUtilisateur = cozyParameters.secret.loginUtilisateur + sgeLogin = cozyParameters.secret.sgeLogin } /** @@ -85,112 +95,124 @@ async function start(fields, cozyParameters) { */ log('info', 'User Logging...') - if (await isFirstStart()) { - if ( - !(await verifyUserIdentity(fields, baseUrl, apiAuthKey, loginUtilisateur)) - ) { - throw errors.LOGIN_FAILED - } - await createBoConsent() - //TODO: remove because useless ? Done later in code - // const startDate = await getDataStartDate( - // baseUrl, - // apiAuthKey, - // loginUtilisateur, - // fields.pointId - // ) - await commanderCollectePublicationMesures() - await updateBoConsent() + if (await isFirstStart(await getAccount('default_account_id'))) { + const user = await verifyUserIdentity(fields, baseUrl, apiAuthKey, sgeLogin) + + let consent = await createBoConsent( + pointId, + user.name, + user.address, + user.postalCode, + user.inseeCode + ) + await getContractStartDate(baseUrl, apiAuthKey, sgeLogin, pointId) + + const contractStartDate = moment().format('YYYY-MM-DD') + //TODO: consent time ? 5 years? + const contractEndDate = moment() + .add(1, 'year') + .format('YYYY-MM-DD') + + let serviceId = await verifyContract( + baseUrl, + apiAuthKey, + sgeLogin, + fields.contractId, + user.pointId + ) + if (!serviceId) { + serviceId = await activateContract( + baseUrl, + apiAuthKey, + sgeLogin, + fields.contractId, + user.name, + user.pointId, + contractStartDate, + contractEndDate + ) + } + consent = await updateBoConsent(consent, serviceId) + // Save bo id into account + const accountData = await getAccount(ACCOUNT_ID) + console.log( + '🚀 ~ file: index.js ~ line 132 ~ start ~ accountData', + accountData + ) + + await saveAccountData(this.accountId, { + ...accountData.data, + consentId: consent.id, + }) } else { - await getBoConsent() - if (!(await verifyUserIdentity(fields))) { + // AlternateStart + const accountData = await getAccount(ACCOUNT_ID) + const userConsent = await getBoConsent(accountData.data.consentId) + const user = await verifyUserIdentity(fields, baseUrl, apiAuthKey, sgeLogin) + if (user.name !== userConsent.name || !user) { + log('error', `Invalid or not found consent for user`) await deleteBoConsent() - await commanderArretServiceSouscritMesures() + if (userConsent.serviceId) { + await terminateContract( + baseUrl, + apiAuthKey, + sgeLogin, + fields.contractId, + fields.pointId, + userConsent.serviceId + ) + } else { + log('error', `No service id retrieved from BO`) + throw errors.VENDOR_DOWN + } throw errors.TERMS_VERSION_MISMATCH } } log('info', 'Successfully logged in') - await gatherData(baseUrl, apiAuthKey, loginUtilisateur, fields.pointId) -} - -/** - * Verify user identity - * @param {object} fields - * @param {string} baseUrl - * @param {string} apiAuthKey - * @param {string} loginUtilisateur - */ -async function verifyUserIdentity( - fields, - baseUrl, - apiAuthKey, - loginUtilisateur -) { - const inseeCode = await getInseeCode(fields.postalCode) - if (!inseeCode) throw errors.USER_ACTION_NEEDED - - const pdl = await findUserPdl( - `${baseUrl}/enedis_SDE_recherche-point/1.0`, - apiAuthKey, - loginUtilisateur, - fields.name, - fields.addresse, - fields.postalCode, - inseeCode - ) - - if (fields.pointId != pdl) { - log('error', 'PointId does not match') - return false - } - return true + await gatherData(baseUrl, apiAuthKey, sgeLogin, fields.pointId) } /** * Main method for gathering data * @param {string} baseUrl * @param {string} apiAuthKey - * @param {string} loginUtilisateur + * @param {string} sgeLogin * @param {number} pointId */ -async function gatherData(baseUrl, apiAuthKey, loginUtilisateur, pointId) { +async function gatherData(baseUrl, apiAuthKey, sgeLogin, pointId) { log('info', 'Querying data...') - await getDataStartDate( - `${baseUrl}/enedis_SGE_ConsultationDonneesTechniquesContractuelles/1.0`, - apiAuthKey, - loginUtilisateur, - pointId - ) + await getContractStartDate(baseUrl, apiAuthKey, sgeLogin, pointId) await getData( `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees/1.0`, apiAuthKey, - loginUtilisateur, + sgeLogin, pointId ) await getMaxPowerData( `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees/1.0`, apiAuthKey, - loginUtilisateur, + sgeLogin, pointId ) await getDataHalfHour( `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees/1.0`, apiAuthKey, - loginUtilisateur, + sgeLogin, pointId ) log('info', 'Querying data: done') } /** - * + * //TODO: Move * @param {string} url * @param {string} apiAuthKey * @param {string} userLogin * @param {number} pointId + * @returns {Promise<void>} */ -async function getDataStartDate(url, apiAuthKey, userLogin, pointId) { +async function getContractStartDate(url, apiAuthKey, userLogin, pointId) { log('info', 'Fetching data start date') const sgeHeaders = { 'Content-Type': 'text/xml;charset=UTF-8', @@ -198,13 +220,12 @@ async function getDataStartDate(url, apiAuthKey, userLogin, pointId) { } const { response } = await soapRequest({ - url: url, + url: `${url}/enedis_SGE_ConsultationDonneesTechniquesContractuelles/1.0`, headers: sgeHeaders, xml: consulterDonneesTechniquesContractuelles(pointId, userLogin), }).catch(err => { - log('error', 'technicalDataResponse') - log('error', err) - return err + log('error', 'Error while fetching contract start date : ' + err) + throw errors.VENDOR_DOWN }) xml2js.parseString( @@ -413,12 +434,11 @@ function processStartDate() { } // update start Date with contract openning date try { - startDailyDate = moment(parseSgeXmlTechnicalData(result), 'YYYY-MM-DD') + startDailyDate = moment(parseContractStartDate(result), 'YYYY-MM-DD') startDailyDateString = startDailyDate.format('YYYY-MM-DD') - } catch (err) { - log('error', err) - //TODO: custom error ? - throw err + } catch (error) { + log('error', 'Error while processing contract start date: ' + error) + throw errors.NOT_EXISTING_DIRECTORY } } } @@ -476,48 +496,14 @@ async function agregateMonthAndYearData(data) { /** * @returns {boolean} */ -function isFirstStart() { - console.log('isFirstStart') - //TODO: Implement - return true -} - -/** - * @return {Promise<string>} User Pdl - */ -async function findUserPdl( - url, - apiAuthKey, - appLogin, - name, - addresse, - postalCode, - inseeCode -) { - log('info', 'Fetching user data') - const sgeHeaders = { - 'Content-Type': 'text/xml;charset=UTF-8', - apikey: apiAuthKey, +function isFirstStart(account) { + console.log(account) + if (account && account.data && account.data.consentId) { + log('info', 'Konnector not first start') + return false } - const { response } = await soapRequest({ - url: url, - headers: sgeHeaders, - xml: rechercherPoint(appLogin, name, postalCode, inseeCode, addresse), - }).catch(err => { - log('error', 'rechercherPointResponse') - log('error', err) - throw errors.LOGIN_FAILED - //TODO: handling code error SGT4F6 and SGT432 into USER_ACTIon_NEEDED - }) - - const parsedReply = await xml2js.parseStringPromise(response.body, { - tagNameProcessors: [parseTags], - valueProcessors: [parseValue], - explicitArray: false, - }) - - //TODO: handle errors - return parseUserPdl(parsedReply) + log('info', 'Konnector first start') + return true } @@ -148186,7 +148172,7 @@ const fs = __webpack_require__(149); const path = __webpack_require__(142); -let manifest = typeof {"version":"1.0.1","name":"Enedis SGE","type":"konnector","language":"node","icon":"icon.png","slug":"enedis-sge-grandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git","editor":"Cozy","vendor_link":"Link to the target website","categories":["energy"],"frequency":"daily","fields":{"pointId":{"type":"text"}},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts","verbs":["GET"]},"files":{"type":"io.cozy.files"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"files":{"description":"Cozy files"},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"files":{"description":"Cozy files"},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"} === 'undefined' ? {} : {"version":"1.0.1","name":"Enedis SGE","type":"konnector","language":"node","icon":"icon.png","slug":"enedis-sge-grandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git","editor":"Cozy","vendor_link":"Link to the target website","categories":["energy"],"frequency":"daily","fields":{"pointId":{"type":"text"}},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts","verbs":["GET"]},"files":{"type":"io.cozy.files"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"files":{"description":"Cozy files"},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"files":{"description":"Cozy files"},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"}; +let manifest = typeof {"version":"1.0.1","name":"Enedis SGE","type":"konnector","language":"node","icon":"icon.png","slug":"enedis-sge-grandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git","editor":"Cozy","vendor_link":"Link to the target website","categories":["energy"],"frequency":"daily","fields":{"pointId":{"type":"text"}},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts"},"files":{"type":"io.cozy.files"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"files":{"description":"Cozy files"},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"files":{"description":"Cozy files"},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"} === 'undefined' ? {} : {"version":"1.0.1","name":"Enedis SGE","type":"konnector","language":"node","icon":"icon.png","slug":"enedis-sge-grandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git","editor":"Cozy","vendor_link":"Link to the target website","categories":["energy"],"frequency":"daily","fields":{"pointId":{"type":"text"}},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts"},"files":{"type":"io.cozy.files"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"files":{"description":"Cozy files"},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"files":{"description":"Cozy files"},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"}; if (process.env.NODE_ENV !== undefined && process.env.NODE_ENV !== 'none' && process.env.NODE_ENV !== 'production') { try { @@ -223477,12 +223463,12 @@ function parseUserPdl(result) { } /** - * Return start date + * Return User contract start date * @param {string} result * @returns {string} */ -function parseSgeXmlTechnicalData(result) { - log('info', 'Parsing technical data') +function parseContractStartDate(result) { + log('info', 'Parsing contract start date') const json = JSON.stringify(result) return JSON.parse(json)['Envelope']['Body'][ 'consulterDonneesTechniquesContractuellesResponse' @@ -223491,6 +223477,32 @@ function parseSgeXmlTechnicalData(result) { ] } +/** + * Return User contract start date + * @param {string} result + * @returns {Contract[]} + */ +function parseContracts(result) { + log('info', 'Parsing contract') + const json = JSON.stringify(result) + return JSON.parse(json)['Envelope']['Body'][ + 'rechercherServicesSouscritsMesuresResponse' + ]['servicesSouscritsMesures']['serviceSouscritMesures'] +} + +/** + * Return User contract start date + * @param {string} result + * @returns {number} + */ +function parseServiceId(result) { + log('info', 'Parsing serviceId') + const json = JSON.stringify(result) + return JSON.parse(json)['Envelope']['Body'][ + 'commanderCollectePublicationMesuresResponse' + ]['serviceSouscritId'] +} + /** * Parsing SGE xml reply to get only mesure data * @param {string} result @@ -223552,11 +223564,13 @@ function parseValue(value, name) { module.exports = { parseSgeXmlData, - parseSgeXmlTechnicalData, formateDataForDoctype, parseTags, parseValue, parseUserPdl, + parseContracts, + parseContractStartDate, + parseServiceId, } @@ -223699,7 +223713,6 @@ function rechercherPoint(appLogin, name, postalCode, inseeCode, address) { 'info', `Query rechercherPoint - postal code / insee code: ${postalCode} / ${inseeCode}` ) - //TODO: handle address return `<?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v2="http://www.enedis.fr/sge/b2b/services/rechercherpoint/v2.0" @@ -223812,7 +223825,7 @@ function commanderCollectePublicationMesures( * @param {string} appLogin * @param {string} contractId * @param {string} pointId - * @param {string} serviceSouscritId + * @param {number} serviceSouscritId * @returns {*} */ function commanderArretServiceSouscritMesures( @@ -223864,40 +223877,66 @@ module.exports = { /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // @ts-check -const { log } = __webpack_require__(1) +const { log, errors } = __webpack_require__(1) /** - * + * @param {number} pointId + * @param {string} name + * @param {string} address + * @param {string} postalCode + * @param {string} inseeCode + * @returns {Consent} */ -function createBoConsent() { +function createBoConsent(pointId, name, address, postalCode, inseeCode) { //TODO: Implement log('info', `Query createBoConsent`) - throw new Error('Function not implemented.') + return { + id: 1, + pointId, + name, + address, + postalCode, + inseeCode, + } } /** - * + * @param {Consent} consent + * @param {number} serviceId + * @returns {Consent} */ -function updateBoConsent() { +function updateBoConsent(consent, serviceId) { //TODO: Implement log('info', `Query updateBoConsent`) - throw new Error('Function not implemented.') + return { + ...consent, + serviceId: serviceId, + } } /** - * + * @param {number} boId + * @returns {Consent} */ -function getBoConsent() { +function getBoConsent(boId) { //TODO: Implement log('info', `Query getBoConsent`) - throw new Error('Function not implemented.') + return { + pointId: 1234, + name: 'SUBTIL', + address: 'mad', + postalCode: '69007', + inseeCode: '69383', + serviceId: 1234, + } + // throw errors.VENDOR_DOWN } /** * */ function deleteBoConsent() { //TODO: deleteBoConsent - log('info', `Query createBoConsent`) + log('info', `Query deleteBoConsent`) throw new Error('Function not implemented.') } @@ -223914,8 +223953,123 @@ module.exports = { /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // @ts-check -const { default: axios } = __webpack_require__(1559) -const { log } = __webpack_require__(1) +const { log, errors } = __webpack_require__(1) +const { findUserPdl } = __webpack_require__(1559) +const { getInseeCode } = __webpack_require__(1560) + +/** + * Verify user identity + * @param {object} fields + * @param {string} baseUrl + * @param {string} apiAuthKey + * @param {string} loginUtilisateur + * @returns {Promise<User>} + */ +async function verifyUserIdentity( + fields, + baseUrl, + apiAuthKey, + loginUtilisateur +) { + const inseeCode = await getInseeCode(fields.postalCode) + + const pdl = await findUserPdl( + `${baseUrl}/enedis_SDE_recherche-point/1.0`, + apiAuthKey, + loginUtilisateur, + fields.name, + fields.address, + fields.postalCode, + inseeCode + ) + + if (fields.pointId != pdl) { + log('error', 'PointId does not match') + throw errors.LOGIN_FAILED + } + + return { + name: fields.name, + pointId: fields.pointId, + inseeCode, + postalCode: fields.postalCode, + address: fields.address, + } +} + +module.exports = { verifyUserIdentity } + + +/***/ }), +/* 1559 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// @ts-check +const { log, errors } = __webpack_require__(1) +const soapRequest = __webpack_require__(1331) +const { parseUserPdl, parseTags, parseValue } = __webpack_require__(1555) +const { rechercherPoint } = __webpack_require__(1556) +const xml2js = __webpack_require__(1513) + +/** + * @param {string} url + * @param {string} apiAuthKey + * @param {string} appLogin + * @param {string} name + * @param {string} address + * @param {string} postalCode + * @param {string} inseeCode + * @return {Promise<string | null>} User Pdl + */ +async function findUserPdl( + url, + apiAuthKey, + appLogin, + name, + address, + postalCode, + inseeCode +) { + log('info', 'Fetching user data') + const sgeHeaders = { + 'Content-Type': 'text/xml;charset=UTF-8', + apikey: apiAuthKey, + } + + const { response } = await soapRequest({ + url: url, + headers: sgeHeaders, + xml: rechercherPoint(appLogin, name, postalCode, inseeCode, address), + }).catch(err => { + log('error', 'rechercherPointResponse') + log('error', err) + throw errors.LOGIN_FAILED + }) + + const parsedReply = await xml2js.parseStringPromise(response.body, { + tagNameProcessors: [parseTags], + valueProcessors: [parseValue], + explicitArray: false, + }) + + try { + return parseUserPdl(parsedReply) + } catch (error) { + log('error', 'Error while parsing user PDL: ' + error) + throw errors.LOGIN_FAILED + } +} + +module.exports = { findUserPdl } + + +/***/ }), +/* 1560 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// @ts-check +const { default: axios } = __webpack_require__(1561) +const { log, errors } = __webpack_require__(1) const API_URL = 'https://apicarto.ign.fr/api/codes-postaux/communes' @@ -223923,7 +224077,7 @@ const API_URL = 'https://apicarto.ign.fr/api/codes-postaux/communes' * Return inseeCode given a postalCode * @param {string} postalCode * @param {string} [city] - * @return {Promise<string | null>} inseeCode + * @return {Promise<string>} inseeCode */ async function getInseeCode(postalCode, city) { try { @@ -223933,7 +224087,7 @@ async function getInseeCode(postalCode, city) { if (response.data.length === 1) { return response.data[0].codeCommune } else { - if (!city) return null + if (!city) throw errors.USER_ACTION_NEEDED const filteredResponse = response.data.filter( town => town.nomCommune.toLowerCase() === city.toLowerCase() @@ -223945,7 +224099,7 @@ async function getInseeCode(postalCode, city) { 'error', `Query getInseeCode failed for postalCode ${postalCode} / ${city}` ) - return null + throw errors.USER_ACTION_NEEDED } } @@ -223955,23 +224109,23 @@ module.exports = { /***/ }), -/* 1559 */ +/* 1561 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -module.exports = __webpack_require__(1560); +module.exports = __webpack_require__(1562); /***/ }), -/* 1560 */ +/* 1562 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); -var bind = __webpack_require__(1562); -var Axios = __webpack_require__(1563); -var mergeConfig = __webpack_require__(1591); -var defaults = __webpack_require__(1568); +var utils = __webpack_require__(1563); +var bind = __webpack_require__(1564); +var Axios = __webpack_require__(1565); +var mergeConfig = __webpack_require__(1593); +var defaults = __webpack_require__(1570); /** * Create an instance of Axios @@ -224004,14 +224158,14 @@ var axios = createInstance(defaults); axios.Axios = Axios; // Expose Cancel & CancelToken -axios.CanceledError = __webpack_require__(1581); -axios.CancelToken = __webpack_require__(1593); -axios.isCancel = __webpack_require__(1590); -axios.VERSION = (__webpack_require__(1586).version); -axios.toFormData = __webpack_require__(1572); +axios.CanceledError = __webpack_require__(1583); +axios.CancelToken = __webpack_require__(1595); +axios.isCancel = __webpack_require__(1592); +axios.VERSION = (__webpack_require__(1588).version); +axios.toFormData = __webpack_require__(1574); // Expose AxiosError class -axios.AxiosError = __webpack_require__(1570); +axios.AxiosError = __webpack_require__(1572); // alias for CanceledError for backward compatibility axios.Cancel = axios.CanceledError; @@ -224020,10 +224174,10 @@ axios.Cancel = axios.CanceledError; axios.all = function all(promises) { return Promise.all(promises); }; -axios.spread = __webpack_require__(1594); +axios.spread = __webpack_require__(1596); // Expose isAxiosError -axios.isAxiosError = __webpack_require__(1595); +axios.isAxiosError = __webpack_require__(1597); module.exports = axios; @@ -224032,13 +224186,13 @@ module.exports["default"] = axios; /***/ }), -/* 1561 */ +/* 1563 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var bind = __webpack_require__(1562); +var bind = __webpack_require__(1564); // utils is a library of generic helper functions non-specific to axios @@ -224509,7 +224663,7 @@ module.exports = { /***/ }), -/* 1562 */ +/* 1564 */ /***/ ((module) => { "use strict"; @@ -224527,19 +224681,19 @@ module.exports = function bind(fn, thisArg) { /***/ }), -/* 1563 */ +/* 1565 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); -var buildURL = __webpack_require__(1564); -var InterceptorManager = __webpack_require__(1565); -var dispatchRequest = __webpack_require__(1566); -var mergeConfig = __webpack_require__(1591); -var buildFullPath = __webpack_require__(1576); -var validator = __webpack_require__(1592); +var utils = __webpack_require__(1563); +var buildURL = __webpack_require__(1566); +var InterceptorManager = __webpack_require__(1567); +var dispatchRequest = __webpack_require__(1568); +var mergeConfig = __webpack_require__(1593); +var buildFullPath = __webpack_require__(1578); +var validator = __webpack_require__(1594); var validators = validator.validators; /** @@ -224694,13 +224848,13 @@ module.exports = Axios; /***/ }), -/* 1564 */ +/* 1566 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); function encode(val) { return encodeURIComponent(val). @@ -224771,13 +224925,13 @@ module.exports = function buildURL(url, params, paramsSerializer) { /***/ }), -/* 1565 */ +/* 1567 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); function InterceptorManager() { this.handlers = []; @@ -224832,17 +224986,17 @@ module.exports = InterceptorManager; /***/ }), -/* 1566 */ +/* 1568 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); -var transformData = __webpack_require__(1567); -var isCancel = __webpack_require__(1590); -var defaults = __webpack_require__(1568); -var CanceledError = __webpack_require__(1581); +var utils = __webpack_require__(1563); +var transformData = __webpack_require__(1569); +var isCancel = __webpack_require__(1592); +var defaults = __webpack_require__(1570); +var CanceledError = __webpack_require__(1583); /** * Throws a `CanceledError` if cancellation has been requested. @@ -224926,14 +225080,14 @@ module.exports = function dispatchRequest(config) { /***/ }), -/* 1567 */ +/* 1569 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); -var defaults = __webpack_require__(1568); +var utils = __webpack_require__(1563); +var defaults = __webpack_require__(1570); /** * Transform the data for a request or a response @@ -224955,17 +225109,17 @@ module.exports = function transformData(data, headers, fns) { /***/ }), -/* 1568 */ +/* 1570 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); -var normalizeHeaderName = __webpack_require__(1569); -var AxiosError = __webpack_require__(1570); -var transitionalDefaults = __webpack_require__(1571); -var toFormData = __webpack_require__(1572); +var utils = __webpack_require__(1563); +var normalizeHeaderName = __webpack_require__(1571); +var AxiosError = __webpack_require__(1572); +var transitionalDefaults = __webpack_require__(1573); +var toFormData = __webpack_require__(1574); var DEFAULT_CONTENT_TYPE = { 'Content-Type': 'application/x-www-form-urlencoded' @@ -224981,10 +225135,10 @@ function getDefaultAdapter() { var adapter; if (typeof XMLHttpRequest !== 'undefined') { // For browsers use XHR adapter - adapter = __webpack_require__(1573); + adapter = __webpack_require__(1575); } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { // For node use HTTP adapter - adapter = __webpack_require__(1583); + adapter = __webpack_require__(1585); } return adapter; } @@ -225082,7 +225236,7 @@ var defaults = { maxBodyLength: -1, env: { - FormData: __webpack_require__(1587) + FormData: __webpack_require__(1589) }, validateStatus: function validateStatus(status) { @@ -225108,13 +225262,13 @@ module.exports = defaults; /***/ }), -/* 1569 */ +/* 1571 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); module.exports = function normalizeHeaderName(headers, normalizedName) { utils.forEach(headers, function processHeader(value, name) { @@ -225127,13 +225281,13 @@ module.exports = function normalizeHeaderName(headers, normalizedName) { /***/ }), -/* 1570 */ +/* 1572 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); /** * Create an Error with the specified message, config, error code, request and response. @@ -225220,7 +225374,7 @@ module.exports = AxiosError; /***/ }), -/* 1571 */ +/* 1573 */ /***/ ((module) => { "use strict"; @@ -225234,13 +225388,13 @@ module.exports = { /***/ }), -/* 1572 */ +/* 1574 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); /** * Convert a data object to FormData @@ -225313,23 +225467,23 @@ module.exports = toFormData; /***/ }), -/* 1573 */ +/* 1575 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); -var settle = __webpack_require__(1574); -var cookies = __webpack_require__(1575); -var buildURL = __webpack_require__(1564); -var buildFullPath = __webpack_require__(1576); -var parseHeaders = __webpack_require__(1579); -var isURLSameOrigin = __webpack_require__(1580); -var transitionalDefaults = __webpack_require__(1571); -var AxiosError = __webpack_require__(1570); -var CanceledError = __webpack_require__(1581); -var parseProtocol = __webpack_require__(1582); +var utils = __webpack_require__(1563); +var settle = __webpack_require__(1576); +var cookies = __webpack_require__(1577); +var buildURL = __webpack_require__(1566); +var buildFullPath = __webpack_require__(1578); +var parseHeaders = __webpack_require__(1581); +var isURLSameOrigin = __webpack_require__(1582); +var transitionalDefaults = __webpack_require__(1573); +var AxiosError = __webpack_require__(1572); +var CanceledError = __webpack_require__(1583); +var parseProtocol = __webpack_require__(1584); module.exports = function xhrAdapter(config) { return new Promise(function dispatchXhrRequest(resolve, reject) { @@ -225542,13 +225696,13 @@ module.exports = function xhrAdapter(config) { /***/ }), -/* 1574 */ +/* 1576 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var AxiosError = __webpack_require__(1570); +var AxiosError = __webpack_require__(1572); /** * Resolve or reject a Promise based on response status. @@ -225574,13 +225728,13 @@ module.exports = function settle(resolve, reject, response) { /***/ }), -/* 1575 */ +/* 1577 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); module.exports = ( utils.isStandardBrowserEnv() ? @@ -225634,14 +225788,14 @@ module.exports = ( /***/ }), -/* 1576 */ +/* 1578 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var isAbsoluteURL = __webpack_require__(1577); -var combineURLs = __webpack_require__(1578); +var isAbsoluteURL = __webpack_require__(1579); +var combineURLs = __webpack_require__(1580); /** * Creates a new URL by combining the baseURL with the requestedURL, @@ -225661,7 +225815,7 @@ module.exports = function buildFullPath(baseURL, requestedURL) { /***/ }), -/* 1577 */ +/* 1579 */ /***/ ((module) => { "use strict"; @@ -225682,7 +225836,7 @@ module.exports = function isAbsoluteURL(url) { /***/ }), -/* 1578 */ +/* 1580 */ /***/ ((module) => { "use strict"; @@ -225703,13 +225857,13 @@ module.exports = function combineURLs(baseURL, relativeURL) { /***/ }), -/* 1579 */ +/* 1581 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); // Headers whose duplicates are ignored by node // c.f. https://nodejs.org/api/http.html#http_message_headers @@ -225763,13 +225917,13 @@ module.exports = function parseHeaders(headers) { /***/ }), -/* 1580 */ +/* 1582 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); module.exports = ( utils.isStandardBrowserEnv() ? @@ -225838,14 +225992,14 @@ module.exports = ( /***/ }), -/* 1581 */ +/* 1583 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var AxiosError = __webpack_require__(1570); -var utils = __webpack_require__(1561); +var AxiosError = __webpack_require__(1572); +var utils = __webpack_require__(1563); /** * A `CanceledError` is an object that is thrown when an operation is canceled. @@ -225867,7 +226021,7 @@ module.exports = CanceledError; /***/ }), -/* 1582 */ +/* 1584 */ /***/ ((module) => { "use strict"; @@ -225880,26 +226034,26 @@ module.exports = function parseProtocol(url) { /***/ }), -/* 1583 */ +/* 1585 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); -var settle = __webpack_require__(1574); -var buildFullPath = __webpack_require__(1576); -var buildURL = __webpack_require__(1564); +var utils = __webpack_require__(1563); +var settle = __webpack_require__(1576); +var buildFullPath = __webpack_require__(1578); +var buildURL = __webpack_require__(1566); var http = __webpack_require__(80); var https = __webpack_require__(81); -var httpFollow = (__webpack_require__(1584).http); -var httpsFollow = (__webpack_require__(1584).https); +var httpFollow = (__webpack_require__(1586).http); +var httpsFollow = (__webpack_require__(1586).https); var url = __webpack_require__(63); var zlib = __webpack_require__(83); -var VERSION = (__webpack_require__(1586).version); -var transitionalDefaults = __webpack_require__(1571); -var AxiosError = __webpack_require__(1570); -var CanceledError = __webpack_require__(1581); +var VERSION = (__webpack_require__(1588).version); +var transitionalDefaults = __webpack_require__(1573); +var AxiosError = __webpack_require__(1572); +var CanceledError = __webpack_require__(1583); var isHttps = /https:?/; @@ -226311,7 +226465,7 @@ module.exports = function httpAdapter(config) { /***/ }), -/* 1584 */ +/* 1586 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var url = __webpack_require__(63); @@ -226320,7 +226474,7 @@ var http = __webpack_require__(80); var https = __webpack_require__(81); var Writable = (__webpack_require__(82).Writable); var assert = __webpack_require__(91); -var debug = __webpack_require__(1585); +var debug = __webpack_require__(1587); // Create handlers that pass events from native requests var events = ["abort", "aborted", "connect", "error", "socket", "timeout"]; @@ -226915,7 +227069,7 @@ module.exports.wrap = wrap; /***/ }), -/* 1585 */ +/* 1587 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var debug; @@ -226936,7 +227090,7 @@ module.exports = function () { /***/ }), -/* 1586 */ +/* 1588 */ /***/ ((module) => { module.exports = { @@ -226944,15 +227098,15 @@ module.exports = { }; /***/ }), -/* 1587 */ +/* 1589 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // eslint-disable-next-line strict -module.exports = __webpack_require__(1588); +module.exports = __webpack_require__(1590); /***/ }), -/* 1588 */ +/* 1590 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var CombinedStream = __webpack_require__(147); @@ -226965,7 +227119,7 @@ var fs = __webpack_require__(149); var Stream = (__webpack_require__(82).Stream); var mime = __webpack_require__(139); var asynckit = __webpack_require__(150); -var populate = __webpack_require__(1589); +var populate = __webpack_require__(1591); // Public API module.exports = FormData; @@ -227459,7 +227613,7 @@ FormData.prototype.toString = function () { /***/ }), -/* 1589 */ +/* 1591 */ /***/ ((module) => { // populates missing values @@ -227475,7 +227629,7 @@ module.exports = function(dst, src) { /***/ }), -/* 1590 */ +/* 1592 */ /***/ ((module) => { "use strict"; @@ -227487,13 +227641,13 @@ module.exports = function isCancel(value) { /***/ }), -/* 1591 */ +/* 1593 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); /** * Config-specific merge-function which creates a new config-object @@ -227594,14 +227748,14 @@ module.exports = function mergeConfig(config1, config2) { /***/ }), -/* 1592 */ +/* 1594 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var VERSION = (__webpack_require__(1586).version); -var AxiosError = __webpack_require__(1570); +var VERSION = (__webpack_require__(1588).version); +var AxiosError = __webpack_require__(1572); var validators = {}; @@ -227687,13 +227841,13 @@ module.exports = { /***/ }), -/* 1593 */ +/* 1595 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var CanceledError = __webpack_require__(1581); +var CanceledError = __webpack_require__(1583); /** * A `CancelToken` is an object that can be used to request cancellation of an operation. @@ -227813,7 +227967,7 @@ module.exports = CancelToken; /***/ }), -/* 1594 */ +/* 1596 */ /***/ ((module) => { "use strict"; @@ -227847,13 +228001,13 @@ module.exports = function spread(callback) { /***/ }), -/* 1595 */ +/* 1597 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var utils = __webpack_require__(1561); +var utils = __webpack_require__(1563); /** * Determines whether the payload is an error thrown by Axios @@ -227866,6 +228020,259 @@ module.exports = function isAxiosError(payload) { }; +/***/ }), +/* 1598 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// @ts-check +const { log, errors } = __webpack_require__(1) +const soapRequest = __webpack_require__(1331) +const { parseTags, parseValue, parseServiceId } = __webpack_require__(1555) +const { commanderCollectePublicationMesures } = __webpack_require__(1556) +const xml2js = __webpack_require__(1513) + +/** + * @param {string} url + * @param {string} apiAuthKey + * @param {string} appLogin + * @param {string} name + * @param {string} pointId + * @param {string} startDate + * @param {string} endDate + * @return {Promise<number>} User contractId + */ +async function activateContract( + url, + apiAuthKey, + appLogin, + contractId, + name, + pointId, + startDate, + endDate +) { + log('info', 'activateContract') + const sgeHeaders = { + 'Content-Type': 'text/xml;charset=UTF-8', + apikey: apiAuthKey, + } + + const { response } = await soapRequest({ + url: url, + headers: sgeHeaders, + xml: commanderCollectePublicationMesures( + appLogin, + contractId, + pointId, + name, + startDate, + endDate + ), + }).catch(err => { + log('error', 'commanderCollectePublicationMesures') + log('error', err) + throw errors.LOGIN_FAILED + }) + + const parsedReply = await xml2js.parseStringPromise(response.body, { + tagNameProcessors: [parseTags], + valueProcessors: [parseValue], + explicitArray: false, + }) + + try { + return parseServiceId(parsedReply) + } catch (error) { + log('error', 'Error while parsing user PDL: ' + error) + throw errors.LOGIN_FAILED + } +} + +module.exports = { activateContract } + + +/***/ }), +/* 1599 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// @ts-check +const { log, errors } = __webpack_require__(1) +const soapRequest = __webpack_require__(1331) +const { parseTags, parseValue, parseContracts } = __webpack_require__(1555) +const { rechercherServicesSouscritsMesures } = __webpack_require__(1556) +const xml2js = __webpack_require__(1513) +const { contractState } = __webpack_require__(1600) + +/** + * @param {string} url + * @param {string} apiAuthKey + * @param {string} appLogin + * @param {string} pointId + * @return {Promise<number | null>} User contractId + */ +async function verifyContract(url, apiAuthKey, appLogin, contractId, pointId) { + log('info', 'verifyContract') + const sgeHeaders = { + 'Content-Type': 'text/xml;charset=UTF-8', + apikey: apiAuthKey, + } + + const { response } = await soapRequest({ + url: `${url}/enedis_SGE_RechercheServicesMesures/1.0`, + headers: sgeHeaders, + xml: rechercherServicesSouscritsMesures(appLogin, contractId, pointId), + }).catch(err => { + log('error', 'rechercherServicesSouscritsMesures') + log('error', err) + throw errors.LOGIN_FAILED + }) + + const parsedReply = await xml2js.parseStringPromise(response.body, { + tagNameProcessors: [parseTags], + valueProcessors: [parseValue], + explicitArray: false, + }) + + try { + const currentContract = parseContracts(parsedReply)[0] + if (currentContract.etatCode === contractState.ACTIF) + return currentContract.serviceSouscritId + return null + } catch (error) { + log('error', 'Error while parsing user contract: ' + error) + throw errors.LOGIN_FAILED + } +} + +module.exports = { verifyContract } + + +/***/ }), +/* 1600 */ +/***/ ((module) => { + +/** + * Enum for contract-state values. + * @readonly + * @enum {number} + */ +const contractState = { + TERMINE: 'TERMINE', + ACTIF: 'ACTIF', +} + +module.exports = { contractState } + + +/***/ }), +/* 1601 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// @ts-check +const { log, errors } = __webpack_require__(1) +const soapRequest = __webpack_require__(1331) +const { parseTags, parseValue } = __webpack_require__(1555) +const { commanderArretServiceSouscritMesures } = __webpack_require__(1556) +const xml2js = __webpack_require__(1513) + +/** + * @param {string} url + * @param {string} apiAuthKey + * @param {string} appLogin + * @param {string} pointId + * @param {number} serviceId + * @return {Promise<string>} User contractId + */ +async function terminateContract( + url, + apiAuthKey, + appLogin, + contractId, + pointId, + serviceId +) { + log('info', 'activateContract') + const sgeHeaders = { + 'Content-Type': 'text/xml;charset=UTF-8', + apikey: apiAuthKey, + } + + const { response } = await soapRequest({ + url: url, + headers: sgeHeaders, + xml: commanderArretServiceSouscritMesures( + appLogin, + contractId, + pointId, + serviceId + ), + }).catch(err => { + log('error', 'commanderArretServiceSouscritMesures') + log('error', err) + throw errors.VENDOR_DOWN + }) + + const parsedReply = await xml2js.parseStringPromise(response.body, { + tagNameProcessors: [parseTags], + valueProcessors: [parseValue], + explicitArray: false, + }) + + try { + // We don't need any action on reply for now + return parsedReply + } catch (error) { + log('error', 'Error while parsing user contract termination: ' + error) + throw errors.VENDOR_DOWN + } +} + +module.exports = { terminateContract } + + +/***/ }), +/* 1602 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +const { log, updateOrCreate } = __webpack_require__(1) +const { iSLocal } = __webpack_require__(1603) +const cozyClient = __webpack_require__(485) + +async function saveAccountData(accountId, accountData) { + log('info', `saveAccountData: ${accountId}`) + + let account = await getAccount(accountId) + + account = await updateOrCreate( + [{ ...account, data: accountData }], + 'io.cozy.accounts' + ) + return account +} + +async function getAccount(accountId) { + log('info', `getAccount: ${accountId}`) + //TODO: refactor with usageof cozy-libs. Not working during implementation + const accounts = await cozyClient.data.findAll('io.cozy.accounts') + return accounts.filter(account => + iSLocal() ? account._id === accountId : account.account_type === accountId + )[0] +} + +module.exports = { getAccount, saveAccountData } + + +/***/ }), +/* 1603 */ +/***/ ((module) => { + +function iSLocal() { + return process.env.NODE_ENV === 'development' || process.env.NODE_ENV +} + +module.exports = { iSLocal } + + /***/ }) /******/ ]); /************************************************************************/ diff --git a/manifest.konnector b/manifest.konnector index e26d1d5f5e99005e71c97dea70c3171a24e71b9e..f9b5284b932f869a6be001de1545d259e1414de5 100644 --- a/manifest.konnector +++ b/manifest.konnector @@ -20,8 +20,7 @@ "screenshots": [], "permissions": { "accounts": { - "type": "io.cozy.accounts", - "verbs": ["GET"] + "type": "io.cozy.accounts" }, "files": { "type": "io.cozy.files" diff --git a/package.json b/package.json index 5b69af56f7f1e5d173be72544c09999b3de759d1..87eab8c4ab9a44615f57bef7762ab4a9456bd7d2 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,6 @@ "build", "data" ], - "husky": { - "hooks": { - "pre-commit": "yarn lint" - } - }, "scripts": { "start": "node ./src/index.js", "dev": "cozy-konnector-dev", @@ -49,7 +44,7 @@ "xml2js": "^0.4.23" }, "devDependencies": { - "cozy-jobs-cli": "1.19.0", + "cozy-jobs-cli": "1.18.2", "cozy-konnector-build": "1.3.4", "eslint-config-cozy-app": "1.3.3", "eslint-plugin-prettier": "^4.0.0",