Source: component/helper.js

/**
 * This file is part of Sesatheque.
 *   Copyright 2014-2015, Association Sésamath
 *
 * Sesatheque is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License version 3
 * as published by the Free Software Foundation.
 *
 * Sesatheque is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with Sesatheque (LICENCE.txt).
 * @see http://www.gnu.org/licenses/agpl.txt
 *
 *
 * Ce fichier fait partie de l'application Sésathèque, créée par l'association Sésamath.
 *
 * Sésathèque est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant
 * les termes de la GNU Affero General Public License version 3 telle que publiée par la
 * Free Software Foundation.
 * Sésathèque est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ;
 * sans même la garantie tacite de QUALITÉ MARCHANDE ou d'ADÉQUATION à UN BUT PARTICULIER.
 * Consultez la GNU Affero General Public License pour plus de détails.
 * Vous devez avoir reçu une copie de la GNU General Public License en même temps que Sésathèque
 * (cf LICENCE.txt et http://vvlibri.org/fr/Analyse/gnu-affero-general-public-license-v3-analyse
 * pour une explication en français)
 */
'use strict'
// un module avec des méthodes communes à nos services et contrôleurs
const { defaultPrefix, defaultTimeout } = require('./common')

// faut le gérer à l'exécution car
// - nos contrôleurs peuvent utiliser cet export avant l'appel de setErrorCallback par l'appli
// - si l'appli rappelle ssetErrorCallback faut le prendre en compte au runtime
let customErrorCallback

/**
 * Rappelle la cb imposée par setErrorCallback, ou à défaut l'erreur en text/plain
 * @param {Context} context
 * @param {Error|string} error
 */
function errorCallback (context, error) {
  console.error(error)
  if (customErrorCallback) customErrorCallback(context, error)
  else defaultErrorCallback(context, error)
}

/**
 * Gestionnaire par défaut des erreurs qui les affiche en plain-text
 * @param {Context} context
 * @param {Error} error
 */
function defaultErrorCallback (context, error) {
  // on ne met pas ça sinon l'appli shunte le context.plain et met son message d'erreur
  // context.status = 500
  context.plain('Erreur : ' + error.toString())
}

/**
 * Retourne la config de base, commune à $sesalabSsoServer et $sesalabSsoClient
 * @param {object} componentConfig
 * @param {string} baseUrl
 * @returns {{baseUrl: (string), timeout: (Integer), prefix: (string)}}
 */
function getBaseConfig (componentConfig, baseUrl) {
  if (!baseUrl) throw new Error('Paramètre de configuration application.baseUrl obligatoire pour le composant sesalab-sso')
  if (baseUrl.substr(-1) !== '/') baseUrl += '/'
  return {
    baseUrl: baseUrl,
    prefix: componentConfig.prefix || defaultPrefix,
    timeout: componentConfig.timeout || defaultTimeout
  }
}

/**
 * Affecte la callback d'erreur
 * @param {function} errorCb appelée avec (context, error)
 */
function setErrorCallback (errorCb) {
  if (typeof errorCb !== 'function') throw new Error('setErrorCallback prend une fonction en argument')
  customErrorCallback = errorCb
}

module.exports = {
  errorCallback,
  getBaseConfig,
  setErrorCallback
}