Source: cli/archive.js


'use strict'
const flow = require('an-flow')
const taskLog = require('an-log')('sesatheque-cli')
const { application: { baseId } } = require('../config')

function listVersions (oid, done) {
  if (typeof done !== 'function' || !oid) {
    taskLog.error('argument invalides')
    listVersions().help()
    return
  }
  const rid = `${baseId}/${oid}`
  lassi.service('EntityArchive').match('rid').equals(rid).sort('version').grab((error, archives) => {
    if (error) return done(error)
    if (archives.length) {
      console.log(`La ressource ${oid} est archivée avec les versions ${archives.map(a => a.version).join(' ')}`)
    } else {
      console.log(`La ressource ${oid} n’a pas d’archives`)
    }
    done()
  })
}

listVersions.help = () => console.log('La commande listVersions prend un oid de ressource en argument')

function print (oid, version, done) {
  if (typeof done !== 'function') {
    taskLog.error('arguments invalides')
    restore.help()
    return
  }
  if (!oid || !version) return done(new Error('arguments invalides'))
  const rid = `${baseId}/${oid}`
  const query = lassi.service('EntityArchive').match('rid').equals(rid)
  if (version === 'last') query.sort('version', 'desc')
  else query.match('version').equals(version)
  query.grabOne((error, archive) => {
    if (error) return done(error)
    if (!archive) {
      console.log(`La ressource ${oid} archivée en version ${version} :`)
      console.log(JSON.stringify(archive, null, 2))
    } else {
      console.log(`La ressource ${oid} n’a pas d’archive en version ${version}`)
    }
    done()
  })
}
print.help = () => console.log('La commande restore prend un oid de ressource en premier argument et la version à restaurer en 2e (mettre last pour récupérer la dernière)')

/**
 * Restore une version depuis les archives
 * @param {string} [oid]
 * @param {errorCallback} done
 */
function restore (oid, version, done) {
  const EntityRessource = lassi.service('EntityRessource')
  const EntityArchive = lassi.service('EntityArchive')
  const $ressourceRepository = lassi.service('$ressourceRepository')
  if (typeof done !== 'function') {
    taskLog.error('arguments invalides')
    restore.help()
    return
  }
  if (!oid || !version) return done(new Error('arguments invalides'))
  let ressource
  let archive

  flow().seq(function () {
    EntityRessource.match('oid').equals(oid).grabOne(this)
  }).seq(function (_ressource) {
    if (!_ressource) return done(new Error(`La ressource ${oid} n’existe pas`))
    ressource = _ressource
    if (version === 'last') {
      EntityArchive
        .match('rid').equals(ressource.rid)
        .sort('version', 'desc')
        .grabOne(this)
    } else {
      EntityArchive
        .match('rid').equals(ressource.rid)
        .match('version').equals(version)
        .grabOne(this)
    }
  }).seq(function (_archive) {
    if (!_archive) return done(new Error(`Il n’y a pas d'archive de la ressource ${oid} en version ${version}`))
    archive = _archive
    $ressourceRepository.archive(ressource, this)
  }).seq(function () {
    const overrides = {
      oid: ressource.oid,
      // on garde comme parent l'archive restaurée, qui ne sera donc pas en version - 1
      version: ressource.version + 1,
      inc: ressource.inc + 1,
      dateArchivage: undefined
    }
    const ressourceRestored = Object.assign({}, archive, overrides)
    $ressourceRepository.save(ressourceRestored, this)
  }).seq(function (freshRessource) {
    taskLog(`Archive ${archive.oid} de la ressource ${oid}`)
    done()
  }).catch(done)
}

restore.help = () => console.log('La commande restore prend un oid de ressource en premier argument et la version à restaurer en 2e (mettre last pour récupérer la dernière)')

module.exports = {
  listVersions,
  print,
  restore
}