Skip to content
Snippets Groups Projects
grdf.js 3.68 KiB
Newer Older
  • Learn to ignore specific revisions
  • // @ts-check
    const { default: Axios } = require('axios')
    const { errors, log } = require('cozy-konnector-libs')
    const qs = require('qs')
    
    const Sentry = require('@sentry/node')
    
    
    /**
     *
     * @param {string} client_id
     * @param {string} client_secret
     * @returns {Promise<{ access_token: string, scope: string, token_type: string, expires_in: number }>}
     */
    async function getAuthToken(client_id, client_secret) {
      log('info', 'getAuthToken')
      const body = {
        scope: '/adict/v2',
        grant_type: 'client_credentials',
        client_id: client_id,
        client_secret: client_secret
      }
      try {
        const response = await Axios({
          method: 'POST',
          url:
            'https://sofit-sso-oidc.grdf.fr/openam/oauth2/realms/externeGrdf/access_token',
          headers: { 'content-type': 'application/x-www-form-urlencoded' },
          data: qs.stringify(body)
        })
    
        return response.data
      } catch (error) {
        log('error', 'Error inside getAuthToken', error)
    
        Sentry.captureException('Error while getting auth token', {
          tags: {
            section: 'getAuthToken'
          }
        })
    
        throw errors.VENDOR_DOWN
      }
    }
    
    /**
     *
     * @param {string} bearerToken
     * @param {string} pce
     * @returns {Promise<GRDFConsent[]>}
     */
    async function getConsents(bearerToken, pce) {
      try {
    
        const response = await fetch('https://api.grdf.fr/adict/v2/droits_acces', {
    
          headers: {
            Authorization: `Bearer ${bearerToken}`,
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({ id_pce: [pce] })
    
        const rawData = await response.text()
        const consents = []
        if (rawData !== null && rawData !== '') {
          // @ts-ignore
          rawData.match(/.+/g).map(rawConsent => {
            const consent = JSON.parse(rawConsent)
            if (consent.id_droit_acces) {
              consents.push(consent)
            }
          })
        }
    
        log('info', `Found ${consents.length} consents for pce`)
    
        const etatDroitsAcces = consents.map(consent => consent.etat_droit_acces)
        log('info', `Droits d'accès des consentements trouvés: ${etatDroitsAcces}`)
        return consents
      } catch (error) {
        log('error', 'Error while getting consent')
        log('error', error)
    
        Sentry.captureException('Error while getting consent', {
          tags: {
            section: 'getConsents'
          }
        })
    
        throw errors.VENDOR_DOWN
      }
    }
    
    async function createGRDFConsent({
      bearerToken,
      pce,
      email,
      lastname,
      postalCode,
      startDate,
      endDate
    }) {
      try {
        log('info', `Creating GRDF consent from ${startDate} to ${endDate}`)
        const response = await Axios({
          method: 'PUT',
          url: `https://api.grdf.fr/adict/v2/pce/${pce}/droit_acces`,
          headers: { Authorization: `Bearer ${bearerToken}` },
          data: {
            role_tiers: 'AUTORISE_CONTRAT_FOURNITURE',
            raison_sociale: '',
            nom_titulaire: lastname,
            code_postal: postalCode,
            courriel_titulaire: email,
            // numero_telephone_mobile_titulaire: '',
            date_debut_droit_acces: startDate,
            perim_donnees_conso_debut: startDate,
            date_fin_droit_acces: endDate,
            perim_donnees_conso_fin: endDate,
            perim_donnees_contractuelles: 'Vrai',
            perim_donnees_techniques: 'Vrai',
            perim_donnees_informatives: 'Vrai',
            perim_donnees_publiees: 'Vrai'
          }
        })
        log('info', response.data.message_retour_traitement)
        return true
      } catch (error) {
        log('error', `Failed to create GRDF consent`)
        log('error', error.response.data)
    
        Sentry.captureException('Failed to create GRDF consent', {
          tags: {
            section: 'createGRDFConsent'
          }
        })
    
        throw errors.USER_ACTION_NEEDED_CGU_FORM
      }
    }
    
    module.exports = { createGRDFConsent, getAuthToken, getConsents }