'use strict'
const flow = require('an-flow')
/**
* Répond sur certaines requetes OPTIONS
* @private
* @param {Context} context
*/
function optionsOk (context) {
context.next(null, 'OK') // ne pas renvoyer de chaîne vide sinon 404
}
module.exports = function (component) {
component.controller('api/groupes', function (EntityGroupe, $groupeRepository, $accessControl, $json, $personneRepository, $groupe) {
const { addGestionnairesNames } = $groupe
/**
* Controleur de la route /api/groupe/
* @Controller controllerApiGroupe
*/
const controller = this
/**
* Récupère la liste des groupes dont on est admin
* @route GET /api/groupes/admin
*/
controller.get('admin', function (context) {
const groupesAdmin = []
const oid = $accessControl.getCurrentUserOid(context)
if (!oid) return $json.denied(context, "Il faut s'authentifier avant pour récupérer ses groupes")
flow().seq(function () {
$groupeRepository.fetchListManagedBy(oid, this)
}).seq(function (groupesManaged) {
if (groupesManaged && groupesManaged.length) {
groupesManaged.forEach(function (groupe) {
groupesAdmin.push({ name: groupe.nom, admin: true })
})
}
$json.sendOk(context, { groupesAdmin: groupesAdmin })
}).catch(function (error) {
console.error(error)
$json.sendKo(context, 'Une erreur est survenue dans la récupération des groupes')
})
})
controller.options('admin', optionsOk)
/**
* Récupère la liste des groupes dont on est membre
* @route GET /api/groupes/membre
*/
controller.get('membre', function (context) {
const groupesMembre = []
const done = {}
const oid = $accessControl.getCurrentUserOid(context)
if (!oid) return $json.denied(context, "Il faut s'authentifier avant pour récupérer ses groupes")
flow().seq(function () {
$groupeRepository.fetchListManagedBy(oid, this)
}).seq(function (groupesManaged) {
if (groupesManaged && groupesManaged.length) {
groupesManaged.forEach(function (groupe) {
groupesMembre.push({ name: groupe.nom, admin: true })
done[groupe.nom] = true
})
}
$accessControl.getCurrentUserGroupesMembre(context).forEach(function (groupeName) {
if (!done[groupeName]) {
groupesMembre.push({ name: groupeName, member: true })
done[groupeName] = true
}
})
$json.sendOk(context, { groupesMembre: groupesMembre })
}).catch(function (error) {
console.error(error)
$json.sendKo(context, 'Une erreur est survenue dans la récupération des groupes')
})
})
controller.options('membre', optionsOk)
/**
* Retourne la liste de tous les groupes du user courant, sous la forme d'un objet
* {groupes: {nom: groupe},groupesAdmin: string[], groupesMembre: string[], groupesSuivis: string[]}
* @route GET /api/groupes/perso
*/
controller.get('perso', function (context) {
const oid = $accessControl.getCurrentUserOid(context)
if (!oid) return $json.denied(context, 'Il faut être authentifié pour récupérer ses groupes')
const groupes = {}
const addGroupe = (groupe) => {
delete groupe.$loadState
groupes[groupe.nom] = groupe
}
const response = {
groupes,
groupesAdmin: []
}
flow().seq(function () {
$groupeRepository.fetchListManagedBy(oid, this)
}).seq(function (managedGroups) {
managedGroups.forEach((groupe) => {
addGroupe(groupe)
response.groupesAdmin.push(groupe.nom)
})
// on peut charger le user (pour avoir ses groupes à jour)
$personneRepository.load(oid, this)
}).seq(function (personne) {
const { groupesMembre, groupesSuivis } = personne
response.groupesMembre = groupesMembre
response.groupesSuivis = groupesSuivis
// les groupes qui manquent
const missing = new Set()
groupesMembre.concat(groupesSuivis).forEach(nom => {
if (!groupes[nom]) missing.add(nom)
})
if (!missing.size) return this()
const next = this
$groupeRepository.fetchListByNom(Array.from(missing), (error, groupes) => {
if (error) next(error)
groupes.forEach(addGroupe)
next()
})
}).seq(function () {
// on peut traiter la liste de tous les groupes
this(null, Object.values(groupes))
}).seqEach(function (groupe) {
addGestionnairesNames(context, groupe, this)
}).seq(function () {
$json.sendOk(context, response)
}).catch($json.sendKo.bind(null, context))
})
controller.options('perso', optionsOk)
/**
* Récupère la liste des groupes suivis
* @route GET /api/groupes/suivis
*/
controller.get('suivis', function (context) {
const groupesSuivis = []
const done = {}
const oid = $accessControl.getCurrentUserOid(context)
if (!oid) return $json.denied(context, "Il faut s'authentifier avant pour récupérer ses groupes suivis")
flow().seq(function () {
$groupeRepository.fetchListManagedBy(oid, this)
}).seq(function (groupesManaged) {
if (groupesManaged && groupesManaged.length) {
groupesManaged.forEach(function (groupe) {
groupesSuivis.push({ name: groupe.nom, admin: true })
done[groupe.nom] = true
})
}
$accessControl.getCurrentUserGroupesMembre(context).forEach(function (groupeName) {
if (!done[groupeName]) {
groupesSuivis.push({ name: groupeName, member: true })
done[groupeName] = true
}
})
$accessControl.getCurrentUserGroupesSuivis(context).forEach(function (groupeName) {
if (!done[groupeName]) {
// on ajoute les urls pour ne plus suivre
groupesSuivis.push({ name: groupeName, follower: true })
done[groupeName] = true
}
})
$json.sendOk(context, { groupesSuivis: groupesSuivis })
}).catch(function (error) {
console.error(error)
$json.sendKo(context, 'Une erreur est survenue dans la récupération des groupes')
})
})
controller.options('suivis', optionsOk)
/**
* Récupère la liste des groupes ouverts
* @route GET /api/groupes/ouverts
*/
controller.get('ouverts', function (context) {
const pid = $accessControl.getCurrentUserPid(context)
if (pid) {
flow().seq(function () {
$groupeRepository.loadOuvert(this)
}).seqEach(function (groupe) {
addGestionnairesNames(context, groupe, this)
}).seq(function (groupesOuverts) {
$json.sendOk(context, { groupes: groupesOuverts })
}).catch(function (error) {
console.error(error)
$json.sendKo(context, 'Une erreur est survenue lors de la récupération des groupes ouverts')
})
} else {
$json.denied(context, "Il faut s'authentifier avant pour récupérer les groupes ouverts")
}
})
controller.options('ouverts', optionsOk)
/**
* Récupère la liste des groupes publics
* @route GET /api/groupes/publics
*/
controller.get('publics', function (context) {
const pid = $accessControl.getCurrentUserPid(context)
if (pid) {
flow().seq(function () {
$groupeRepository.loadPublic(this)
}).seqEach(function (groupe) {
addGestionnairesNames(context, groupe, this)
}).seq(function (groupesPublics) {
$json.sendOk(context, { groupes: groupesPublics })
}).catch(function (error) {
console.error(error)
$json.sendKo(context, 'Une erreur est survenue lors de la récupération des groupes publics')
})
} else {
$json.denied(context, "Il faut s'authentifier avant pour récupérer les groupes ouverts")
}
})
controller.options('publics', optionsOk)
})
}