'use strict'
const { application: { baseId: myBaseId }, sesatheques } = require('../config')
const { exists, getBaseIdFromRid } = require('sesatheque-client/dist/server/sesatheques')
module.exports = function entityExternalRefFactory (component) {
component.entity('EntityExternalRef', function () {
const EntityExternalRef = this
/**
* entity EntityExternalRef cf [Entity](lassi/Entity.html)
* registry pour les sésathèques qui veulent être notifiées lors d'un changement sur une ressource
* @entity EntityExternalRef
* @extends Entity
* @throws s'il manque baseId ou rid, ou si l'un des deux est incohérent (rid doit pointer sur une de nos ressources, baseId ne doit pas être la nôtre)
*/
EntityExternalRef.construct(function (data) {
if (!data || !data.baseId || !data.rid) throw Error('Il faut passer au moins baseId et rid pour créer une EntityExternalRef')
const { baseId, rid } = data
if (getBaseIdFromRid(rid) !== myBaseId) throw Error(`Cette EntityExternalRef ne doit pas être gérée ici (${myBaseId}, alors que rid vaut ${rid}`)
if (!exists(baseId)) throw Error(`${baseId} inconnue`)
if (!sesatheques.some(s => s.baseId === baseId)) throw Error(`${baseId} n’est pas déclaré en config, impossible de mettre un listener ici pour la prévenir en cas de modif de ${rid} ${JSON.stringify(data)}`)
/**
* Oid de ce "listener", concaténation de baseId et rid (avec séparateur -), permet d'imposer l'unicité baseId/rid
* en attendant que lassi gère des index unique combinés
* @type {string}
*/
this.oid = `${baseId}-${rid.replace('/', '-')}`
/**
* baseId de la sésathèque qui veut être prévenue lors d'une modif du rid ici
* @type {string}
*/
this.baseId = baseId
/**
* rid de la ressource à surveiller ici
* (l'oid suffirait, mais on tient à ce que ceux qui nous causent passent le rid complet
* pour vérifier qu'on est bien la sésathèque qu'ils croient, et faudra leur renvoyer
* donc conserver le rid évite de déstructurer au stockage et restructurer à l'envoi de l'info)
* @type {string}
*/
this.rid = rid
if (data.dateCreation) {
this.dateCreation = typeof data.dateCreation === 'string' ? new Date(data.dateCreation) : data.dateCreation
} else {
this.dateCreation = new Date()
}
})
EntityExternalRef.validateJsonSchema({
type: 'object',
properties: {
oid: { type: 'string' },
baseId: { type: 'string' },
rid: { type: 'string' },
dateCreation: { instanceof: 'Date' }
},
additionalProperties: false,
required: ['oid', 'baseId', 'rid', 'dateCreation']
})
EntityExternalRef
.defineIndex('baseId')
.defineIndex('rid')
})
}