diff --git a/src/graphql/db_utils.js b/src/graphql/db_utils.js index bdbaa2d39cc9af4a07080b34aad6e6c0028793b9..e9e094026ee6dee13f6e8e8b5bcbc3d1de7b3002 100644 --- a/src/graphql/db_utils.js +++ b/src/graphql/db_utils.js @@ -98,41 +98,29 @@ export const hasAdminRights = (user, groupUID) => { }); }; + /** - * @summary Renvoie tous les groupes visibles par l'utilisateur user - * @desc Cette fonction effectue une requête knex. Elle gère l'arête de parenté. + * @summary Renvoie une liste des id de tous les groupes visibles par l'utilisateur + * @desc Cette fonction génère un callback qui créé une table contenant les uid de tous les groupes visibles * @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête. - * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. + * @return {Promise(Callback)} callback contruisant une requête knex pour une table de tous les id visibles. */ -export const getAllVisibleGroups = (user) => { - +export const getVisibleGroupCallback = (user) => { return listerGroupes(user, user.uid).then(group_ids => { - if (typeof group_ids == "undefined") - throw "invalid user"; - var membered_groups = qb => qb.select().from('simple_groups').whereIn('uid', group_ids.concat(['kes'])); - /* membered_groups est un callback qui reçoit un argument qb représentant un objet de requête (un truc qui s'utilise comme knex()) - * et effectue dessus la requête pour obtenir une table de tous les groupes dont user est membre - * with est ensuite utilisé pour donner à ce retour de requête l'alias 'membered_groups'. - * Cette table peut ainsi être JOIN avec la table groups. La condition de Join est donnée selon une syntaxe recopiée depuis la Doc Knex - * On récupère tous les groupes tels que le groupe est dans membered_groups ou le parent est dans membered_groups - */ - return knex.with('membered_groups', membered_groups).distinct('simple_groups.*').select().from('simple_groups').innerJoin('membered_groups', - function () { - this.on('simple_groups.uid', '=', 'membered_groups.uid').orOn('simple_groups.parentuid', '=', 'membered_groups.uid'); - } - ); + return function (global_query_builder){ + if (typeof group_ids == "undefined") + throw "invalid user"; + var membered_groups = qb => qb.select('simple_groups.uid').from('simple_groups').whereIn('uid', group_ids.concat(['kes'])); + var directly_visible_simple_groups = qb => qb.with('membered_groups', membered_groups).select('simple_groups.uid').from('simple_groups').distinct() + .innerJoin('membered_groups', + function () { + this.on('simple_groups.uid', '=', 'membered_groups.uid').orOn('simple_groups.parentuid', '=', 'membered_groups.uid'); + } + ); + return directly_visible_simple_groups(global_query_builder); + } }); -}; - - -/** - * @summary Teste si un utilisateur est membre d'un groupe - * @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête. - * @arg {Object} groupUID - L'id du groupe dont on veu savoir si l'utilisateur est membre. - * @return {Promise(Boolean)} Boolean indiquant si l'utilisateur est membre du groupe. - */ -export const isMember = (user, groupUID) => { - return listerGroupes(user, user.uid).then(group_ids => group_ids && group_ids.indexOf(groupUID) != -1); + }; /** @@ -143,20 +131,39 @@ export const isMember = (user, groupUID) => { * @return {Promise(group)} Retour de requête knex. Le groupe demandé, si l'utilisateur a le droit de la voire. */ export const getGroupIfVisible = (user, groupUID) => { - return listerGroupes(user, user.uid).then(group_ids => { - if (typeof group_ids == "undefined") - throw "invalid user"; - var membered_groups = qb => qb.select().from('simple_groups').whereIn('uid', group_ids.concat(['kes'])); - return knex.with('membered_groups', membered_groups).distinct('groups.*').select().from('simple_groups').innerJoin('membered_groups', - function () { - this.on('groups.uid', '=', 'membered_groups.uid').orOn('groups.parentuid', '=', 'membered_groups.uid'); - } - ).where('groups.uid', groupUID).then(res => { + return getVisibleGroupCallback(user).then(visible_groups => { + return knex.with('visible_groups', visible_groups).select('groups.*').from('groups').innerJoin('visible_groups', function (){ + this.on('visible_groups.uid', '=', 'groups.uid'); + }).where('groups.uid', groupUID).then(res => { return res[0]; }); }); }; +/** + * @summary Renvoie tous les groupes visibles par l'utilisateur user + * @desc Cette fonction effectue une requête knex. Elle gère l'arête de parenté. + * @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête. + * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. + */ +export const getAllVisibleGroups = (user) => { + return getVisibleGroupCallback(user).then(visible_groups => { + return knex.with('visible_groups', visible_groups).select('groups.*').from('groups').innerJoin('visible_groups', function (){ + this.on('visible_groups.uid', '=', 'groups.uid'); + }); + }); +}; + +/** + * @summary Teste si un utilisateur est membre d'un groupe + * @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête. + * @arg {Object} groupUID - L'id du groupe dont on veu savoir si l'utilisateur est membre. + * @return {Promise(Boolean)} Boolean indiquant si l'utilisateur est membre du groupe. + */ +export const isMember = (user, groupUID) => { + return listerGroupes(user, user.uid).then(group_ids => group_ids && group_ids.indexOf(groupUID) != -1); +}; + /** * @summary Attribue un UID qui n'a pas encore été utilisé à un groupe * @desc RASifie le string initialUID si necessaire (ramené à de l'ASCCI sans espace), puis si l'uid est deja pris rajoute un n a la fin et reteste