Source: ressource/EntityExternalRef.js


'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')
  })
}