Source: fetch.js


/**
 * Module léger ne contenant les méthodes utiles pour récupérer des données sur une sésathèque
 * @service fetch
 */

import { getBaseUrl, getComponents } from './sesatheques'
import { callApiUrl, getDataUrl } from './internals'

// on réexporte ça qui pourrait servir
/**
 * @see sesatheques.addSesatheque
 * @method addSesatheque
 * @memberOf fetch
 */
/**
 * @see sesatheques.exists
 * @method exists
 * @memberOf fetch
 */
export { addSesatheque, addSesatheques, exists } from './sesatheques'

// @#§! de jsdoc, impossible de lui faire générer le lien !
/**
 * Ré-export de {@link internals#callApiUrl}
 * @method callApiUrl
 * @memberOf fetch
 */
export { callApiUrl }

/**
 * Limite arbitrairement haute pour les fetch qui remontent des listes
 * alors que l'appelant ne gère pas encore de pagination
 */
export const highLimit = 100

/**
 * Appellera next avec la Ressource voulue
 * @param {string} baseId
 * @param {string} id
 * @param {ressourceCallback} next sera appelé avec (error, ressource)
 */
export function fetchPrivateRef (baseId, id, next) {
  const url = getDataUrl(baseId, id, { isPublic: false, isRef: true })
  callApiUrl(url, next)
}

/**
 * Appellera next avec la Ressource voulue
 * @param {string} baseId
 * @param {string} id
 * @param {ressourceCallback} next sera appelé avec (error, ressource)
 */
export function fetchPrivateRessource (baseId, id, next) {
  const url = getDataUrl(baseId, id, { isPublic: false })
  callApiUrl(url, next)
}

/**
 * Appellera next avec la Ref voulue
 * @param {string} baseId
 * @param {string} id
 * @param {refCallback} next sera appelé avec (error, ref)
 */
export function fetchPublicRef (baseId, id, next) {
  const url = getDataUrl(baseId, id, { isPublic: true, isRef: true })
  callApiUrl(url, next)
}

/**
 * Appellera next avec la Ressource publique voulue
 * @param {string} baseId
 * @param {string} id
 * @param {ressourceCallback} next sera appelé avec (error, ressource)
 */
export function fetchPublicRessource (baseId, id, next) {
  const url = getDataUrl(baseId, id, { isPublic: true })
  callApiUrl(url, next)
}

/**
 * Appellera next avec la Ref voulue, préférer fetchPublicRef si on sait la ref publique
 * (et ce sera fetchPublicRef qui sera appelé si on a pas de token pour cette baseId)
 * @param {string} [baseId] facultatif si id est un rid (voire un baseId/origine/idOrigine)
 * @param {string} id
 * @param {refCallback} next sera appelé avec (error, ref)
 */
export function fetchRef (baseId, id, next) {
  if (typeof id === 'function') {
    next = id
    id = baseId
    baseId = undefined
  }
  const url = getDataUrl(baseId, id, { isRef: true })
  callApiUrl(url, next)
}

/**
 * Appellera next avec la Ressource voulue, préférer fetchPublicRessource si on sait la ref publique
 * (et ce sera fetchPublicRessource qui sera appelé si on a pas de token pour cette baseId)
 * @param {string} [baseId] facultatif si id est un rid (voire un baseId/origine/idOrigine)
 * @param {string} id
 * @param {ressourceCallback} next sera appelé avec (error, ressource)
 */
export function fetchRessource (baseId, id, next) {
  if (typeof id === 'function') {
    next = id
    id = baseId
    baseId = undefined
  }
  const url = getDataUrl(baseId, id, { isRef: false })
  callApiUrl(url, next)
}

/**
 * Idem client.getListePerso, mais en utilisant les cookies sur le domaine courant, à n'utiliser que sur une page de la sésathèque concernée
 * (construit pour editgraphe)
 * @param {Object} [options]
 * @param {number} [options.skip]
 * @param {number} [options.limit]
 * @param {function} next
 */
export function fetchPersoOnCurrent (options, next) {
  function getList (url, liste = []) {
    // le getUrl de client n'est pas utilisable ici car on a pas de baseId,
    // on est sur une url /truc
    callApiUrl(url, { responseType: 'json', withCredentials: true }, function (error, response) {
      if (error) return next(error)
      if (!response.liste) return next(Error('Le serveur n’a pas renvoyé la réponse attendue'))
      liste = liste.concat(response.liste)
      if (liste.length > globalLimit) liste = liste.slice(0, globalLimit)
      else if (liste.length < globalLimit && response.nextUrl) return getList(response.nextUrl, liste)
      // on a fini
      sendList(liste)
    })
  }

  function sendList (liste) {
    const currentUrl = window.parent.location.href
    if (
      typeof window === 'undefined' ||
      window.parent === window ||
      !/\/ressource\/modifier\//.test(currentUrl)
    ) {
      return next(null, liste)
    }

    // on est en iframe sur de l'édition, faut filtrer la ressource courante de la liste
    // (pour l'édition j3p qui appelle cette fonction depuis une iframe de la sesathèque)
    return next(null, liste.filter(item => {
      if (!item.aliasOf) return true
      const [baseId, id] = getComponents(item.aliasOf)
      const urlModif = getBaseUrl(baseId) + 'ressource/modifier/' + id
      return currentUrl.indexOf(urlModif) !== 0
    }))
  }

  if (typeof options === 'function') {
    next = options
    options = {}
  }
  const initialSkip = (Number.isInteger(options.skip) && options.skip > 0) ? options.skip : 0
  const globalLimit = (Number.isInteger(options.limit) && options.limit > 0) ? options.limit : highLimit
  const limit = Math.min(50, globalLimit)
  getList(`${document.location.origin}/api/liste/perso?limit=${limit}&skip=${initialSkip}&orderBy=dateMiseAJour&order=desc`)
}