diff --git a/src/graphql/db_utils.js b/src/graphql/db_utils.js index e9e094026ee6dee13f6e8e8b5bcbc3d1de7b3002..e550585944069bf6faa937e14f9f6c0405f91bfa 100644 --- a/src/graphql/db_utils.js +++ b/src/graphql/db_utils.js @@ -27,7 +27,7 @@ const quickPromise = (val) => { * @function * @desc Parcours les BDD pour savoir dans laquelle se trouve le groupe ayant l'UID donné. * Cette opération nécéssite un parcours de base de donnée, et il est préférable de ne pas sans servir si on a un autre moyend de connaitre le typed d'un groupe - * (Par exemple, si on dispose d'un retour de BDD pour ce groupe. L'existence du champ School indique alors son type.) + * (Par exemple, si on dispose d'un retour de BDD pour ce groupe. Le champ 'type' indique alors son type.) * @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 veut connaître le type. * @return {Promise(String)} Un string représentant le type du groupe. Peut être "SimpleGroup" ou "MetaGroup". Renvoie *Undefined* si le groupe 'existe pas @@ -118,38 +118,62 @@ export const getVisibleGroupCallback = (user) => { } ); return directly_visible_simple_groups(global_query_builder); - } + }; }); }; +/** + * @summary Renvoie le nom de la table dans laquelle il faut chercher en fonction de ce qu'on veut + * @desc a remplir + * @arg {String} wantedType - Un string indiquant le type de groupe qu'on veut. Peut être *"simple"*, *"meta"* ou *"all"*. + * @return {String} Le nom de la table dans laquelle la requète doit être effectuée. + */ +function getGroupTableName(wantedType){ + switch(wantedType){ + case "simple": + return "simple_groups"; + case "meta": + return "meta_groups"; + case "all": + return "groups"; + default: + throw "invalid type request : " + wantedType + "is not a valid group type"; + } +} + /** * @summary Renvoie un unique groupe, ssi ce groupe est visible par l'utilisateur * @desc Actuellement, la fonction effectue la même requête que *getAllVisibleGroups* et restreint au groupe demandé. Cette fonction peut être implémentée de manière plus efficace et plus chiante. * @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête. * @arg {String} uid - uid du groupe que l'on veut voire. + * @arg {String} wantedType - Un string indiquant le type de groupe qu'on veut. Peut être *"simple"*, *"meta"* ou *"all"*. * @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) => { +export const getGroupIfVisible = (user, groupUID, wantedType="all") => { + var group_table_name = getGroupTableName(wantedType); 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 knex.with('visible_groups', visible_groups).select().from(group_table_name).innerJoin('visible_groups', function (){ + this.on('visible_groups.uid', '=', group_table_name + '.uid'); + }).where(group_table_name + '.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. + * @arg {String} wantedType - Un string indiquant le type de groupe qu'on veut. Peut être *"simple"*, *"meta"* ou *"all"*. * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. */ -export const getAllVisibleGroups = (user) => { +export const getAllVisibleGroups = (user, wantedType="all") => { + var group_table_name = getGroupTableName(wantedType); 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'); + return knex.with('visible_groups', visible_groups).select().from(group_table_name).innerJoin('visible_groups', function (){ + this.on('visible_groups.uid', '=', group_table_name + '.uid'); }); }); }; diff --git a/src/graphql/resolvers.js b/src/graphql/resolvers.js index 0a179394a3b0d6601ccab95d9a5c6e6099d7f6f4..aee354d4948dce8e2644117fd13615543f7fe915 100644 --- a/src/graphql/resolvers.js +++ b/src/graphql/resolvers.js @@ -45,7 +45,10 @@ export const resolvers = { return db_utils.getGroupIfVisible(context.user, args.uid); }, simpleGroup: (obj, args, context) => { - return db_utils.getGroupIfVisible(context.user, args.uid); + return db_utils.getGroupIfVisible(context.user, args.uid, "simple"); + }, + metaGroup: (obj, args, context) => { + return db_utils.getGroupIfVisible(context.user, args.uid, "meta"); } }, @@ -260,10 +263,15 @@ export const resolvers = { Group: { __resolveType: (obj) => { - if(obj.school) + + switch(obj.type){ + case "simple": return "SimpleGroup"; - else + case "meta": return "MetaGroup"; + default: + return undefined; + } } },