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