Source: getUrls.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 tools from 'sesajstools'
import { getBaseUrl, getRidComponents } from './sesatheques'

const { hasProp } = tools

/**
 * Retourne les urls d'une ressource ou d'une ref (en tenant compte de _droits si ça existe)
 * Une url vide signifie qu'on sait que le user courant aurait un denied dessus (n'arrive pas si _droits n'existe pas)
 * @param {Ressource|Ref} ressource
 * @param {string} [myBaseUrl] Si fourni, les urls locales à cette sésathèque seront relatives
 * @return {{baseUrl: string, dataUrl: string, describeUrl: string, displayUrl: string, editUrl: string}}
 */
export default function getUrls (ressource, myBaseUrl) {
  const aliasOf = ressource.aliasOf || ressource.rid
  const isRessourceAlias = ressource.aliasOf && ressource.rid
  if (!aliasOf) throw Error('ressource invalide (ni aliasOf ni rid)')
  const [baseId, oid] = getRidComponents(aliasOf)
  let baseUrl = getBaseUrl(baseId) // peut pas être undefined (ça throw)
  if (baseUrl === myBaseUrl) baseUrl = '/'
  // si c'est pas fourni on suppose qu'on aurait le droit et on fournit les url,
  // ça mettra du 401/403 si on les utilise et que c'était pas vrai
  const droits = ressource._droits || 'RW'
  const props = {
    dataUrl: '',
    describeUrl: '',
    displayUrl: '',
    editUrl: ''
  }
  const isPublic = hasProp(ressource, 'public') ? ressource.public : !ressource.restriction

  if (droits.includes('R')) {
    // dataUrl & displayUrl
    if (isPublic) {
      props.dataUrl = `${baseUrl}api/public/${oid}`
      props.displayUrl = `${baseUrl}public/voir/${oid}`
    } else if (ressource.cle) {
      props.dataUrl = `${baseUrl}api/public/cle/${ressource.cle}`
      props.displayUrl = `${baseUrl}public/voir/cle/${ressource.cle}`
    } else {
      props.dataUrl = `${baseUrl}api/ressource/${oid}`
      props.displayUrl = `${baseUrl}ressource/voir/${oid}`
    }
    // describeUrl
    props.describeUrl = `${baseUrl}ressource/decrire/${oid}`
  }
  // editUrl
  if (droits.includes('W')) {
    // si c'est une ressource qui est un alias, on veut éditer l'alias et pas l'original
    if (isRessourceAlias) {
      const [bid, id] = getRidComponents(ressource.rid)
      let burl = getBaseUrl(bid)
      if (burl === myBaseUrl) burl = '/'
      props.editUrl = `${burl}ressource/modifier/${id}`
    } else {
      props.editUrl = `${baseUrl}ressource/modifier/${oid}`
    }
  }

  return props
}