/**
* 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'
import tools from 'sesajstools'
const { hasProp } = tools // c'est pas un export nommé, faut 2 lignes
const filterString = (value) => typeof value === 'string' ? value : ''
const filterInt = (value) => Math.floor(Number(value)) || 0
/**
* Définition d'une référence à une ressource, que l'on peut rencontrer dans les feuilles d'un arbre
* Ce n'est pas une entité
* @param {Object} [values={}] L'objet qui sert à initialiser un nouvel objet Ref, accepte une Ressource
* @throws {Error} Si on passe des enfants sur un type non arbre
* @constructor
*/
function Ref (values) {
if (typeof values !== 'object') values = {}
if (values.aliasOf) {
/**
* La ressource référencée (baseId/oid)
* @type {string}
*/
this.aliasOf = values.aliasOf
if (values.rid) {
// c'est une ressource avec son rid, alias d'une autre (aliasOf),
// on note le rid de l'alias
/**
* Rid de la Ressource "alias" qui a servi à construire cette Ref
* Utile pour le normalize de sesatheque-client qui construit les urls
* (distinguer les urls d'affichage qui pointent vers l'original
* et celles de modif qui pointent sur l'alias)
* @type {string}
*/
this.aliasRid = values.rid
}
} else if (values.rid) {
this.aliasOf = values.rid
}
/**
* Titre
* @type {string}
*/
this.titre = filterString(values.titre)
/**
* Résumé (pour tous)
* @type {string}
*/
this.resume = filterString(values.resume)
/**
* Description (pour tous)
* @type {string}
*/
this.description = filterString(values.description)
/**
* Commentaires (pour le formateur)
* @type {string}
*/
this.commentaires = filterString(values.commentaires)
/**
* Le type qui permet de savoir à quel type de contenu s'attendre, ou quel picto afficher
* @type {string}
*/
this.type = filterString(values.type)
/**
* Un ou des id de catégorie(s) éventuel (pour un picto)
* @type {number[]}
*/
this.categories = Array.isArray(values.categories) ? values.categories : []
/**
* True si public (sinon il faut être authentifié pour lire la ressource)
* @type {boolean}
*/
this.public = true
if (hasProp(values, 'public') && !values.public) {
this.public = false
} else if (values.restriction) {
this.public = false
} else if (hasProp(values, 'publie') && !values.publie) {
this.public = false
}
if (!this.public) {
// la clé si non public
if (values.cle) {
/**
* Éventuelle clé de lecture, pour que des élèves puissent lire
* la ressource non publique si leur prof la leur affecte
* @type {string}
*/
this.cle = values.cle
}
// pour le partage, on transmet si on nous l'indique
if (hasProp(values, 'partage')) {
/**
* true si la ressource privée est partagée avec un ou des groupes
* @type {boolean}
* @default undefined
*/
this.partage = values.partage
}
// ou si c'est une ressources avec des groupes
if (values.groupes && values.groupes.length) this.partage = true
else if (values.groupesAuteurs && values.groupesAuteurs.length) this.partage = true
}
/**
* Un incrément ajouté à l'url pour contourner le cache du navigateur en cas de modif
* @type number
*/
this.inc = filterInt(values.inc)
// enfants ou parametres si y'en a (si on est un alias il devrait pas y en avoir,
// mais on vérifie pas, c'est au modèle de le gérer coté serveur)
if (this.type === 'arbre' && Array.isArray(values.enfants)) {
/**
* Liste d'enfants
* @type {Ref[]}
*/
this.enfants = values.enfants
} else if (this.type === 'sequenceModele' && values.parametres) {
/**
* Les paramètres pour le type sequenceModele, forcément un plain Object
* @type {Object}
*/
this.parametres = Object.assign({}, values.parametres)
}
}
/**
* Cast en string d'une ref (son titre avec aliasOf)
* @returns {string}
*/
Ref.prototype.toString = function () {
return `${this.titre} (${this.aliasOf})`
}
export default Ref