Source: cli/purgeEc2.js


'use strict'

const flow = require('an-flow')
const taskLog = require('an-log')('sesatheque-cli')

const getDesc = (arbre) => `${arbre.oid} ${arbre.origine}/${arbre.idOrigine} ${arbre.titre}`

/**
 * Supprime les contenus ec2 dans l'arbre, retourne le nb d'ec2 virés
 * @param arbre
 */
function cleanEc2 (arbre) {
  // pour le log
  if (!Array.isArray(arbre.enfants)) {
    taskLog.error(`KO, arbre sans propriété enfants ${getDesc(arbre)}`)
    return false
  }

  let nbSuppr = 0
  const getCleanEnfants = branche => branche.enfants.map(e => {
    if (e.type === 'ec2') {
      nbSuppr++
      return null
    }
    if (e.type === 'arbre' && Array.isArray(e.enfants)) {
      const nb = e.enfants.length
      e.enfants = getCleanEnfants(e)
      if (nb && !e.enfants.length) return null // un dossier dont on a viré tous les enfants, on le vire aussi
    }
    return e
  }).filter(e => e)

  arbre.enfants = getCleanEnfants(arbre)
  return nbSuppr
}

/**
 * Purge les ressources ec2 dans tous les arbres
 * @param {string} [oid]
 * @param {errorCallback} done
 */
function purgeEc2 (oid, done) {
  function grab (next) {
    let nb = 0
    flow().seq(function () {
      taskLog(`traitement des arbres de ${offset} à ${offset + limit} sur ${nbArbres}`)
      EntityRessource.match('type').equals('arbre').sort('dateCreation').grab({ limit, offset }, this)
    }).seqEach(function (arbre) {
      nb++
      processOne(arbre, this)
    }).seq(function () {
      nbArbres += nb
      if (nb === limit) {
        offset += limit
        grab(next)
      } else {
        next()
      }
    }).catch(next)
  } // grab

  function processOne (arbre, next) {
    const nbSuppr = cleanEc2(arbre)
    if (!nbSuppr) return next(null, arbre)
    nbArbresModif++
    taskLog(`${nbSuppr} ressource ec2 supprimées dans l’arbre ${getDesc(arbre)}`)
    $ressourceRepository.save(arbre, next)
  }

  if (typeof oid === 'function') {
    done = oid
    oid = undefined
  }
  if (typeof done !== 'function') throw new Error('Erreur interne, pas de callback de commande')
  let offset = 0
  const limit = 10
  let nbArbres = 0
  let nbArbresModif = 0
  const EntityRessource = lassi.service('EntityRessource')
  const $ressourceRepository = lassi.service('$ressourceRepository')
  if (oid) {
    flow().seq(function () {
      EntityRessource
        .match('type').equals('arbre')
        .match('oid').equals(oid)
        .grabOne(this)
    }).seq(function (arbre) {
      if (!arbre) {
        taskLog.error(`La ressource ${oid} n’existe pas ou n’est pas un arbre`)
        return done()
      }
      taskLog(`Starting purgeEc2 ${oid}`)
      processOne(arbre, this)
    }).seq(function () {
      taskLog(`fin du rafraichissement de l’arbre ${oid}, il ${nbArbresModif ? 'a' : 'n’a pas'} été modifié.`)
      done()
    }).catch(done)
  } else {
    flow().seq(function () {
      EntityRessource.match('type').equals('arbre').count(this)
    }).seq(function (nb) {
      nbArbres = nb
      taskLog(`Starting purgeEc2 avec ${nb} arbres`)
      grab(this)
    }).seq(function () {
      taskLog(`fin du nettoyage de ${nbArbres} arbres, dont ${nbArbresModif} modifiés`)
      done()
    }).catch(done)
  }
}

purgeEc2.help = function refreshArbresHelp () {
  taskLog('La commande purgeEc2 prend un oid en argument pour nettoyer l’arbre de ses ressources ec2, sans argument elle nettoie tous les arbres')
}

module.exports = {
  purgeEc2
}