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