From e0d06925fe18d63d2097ccacae0ff786354a89df Mon Sep 17 00:00:00 2001
From: anatole <anatole.romon@polytechnique.edu>
Date: Thu, 8 Mar 2018 18:20:49 +0100
Subject: [PATCH] RASification des modifs

---
 src/graphql/connectors/connectors.js | 151 +++++++--------------------
 src/graphql/connectors/selectors.js  |  91 ++++++++++++++++
 src/graphql/resolvers.js             |   4 +-
 src/graphql/typeDefs/actions.js      |   4 +-
 src/graphql/typeDefs/objects.js      |   8 +-
 5 files changed, 139 insertions(+), 119 deletions(-)
 create mode 100644 src/graphql/connectors/selectors.js

diff --git a/src/graphql/connectors/connectors.js b/src/graphql/connectors/connectors.js
index 9981605..8bc9ac6 100644
--- a/src/graphql/connectors/connectors.js
+++ b/src/graphql/connectors/connectors.js
@@ -7,7 +7,7 @@ import { renseignerSurUtilisateur, repliquerTOLdesIds,
     listerGroupes, listerMembres, listerAdministrateurs 
 } from '../../ldap/ldap_data';
 import { exportAllDeclaration } from 'babel-types';
-
+import * as selectors from './selectors'
 export { renseignerSurUtilisateur, repliquerTOLdesIds, listerMembres };
 
 /*
@@ -147,40 +147,11 @@ export const getUsersWithAdminRights = (user, groupUID) => {
  * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire.
  * rights user
  */
-export const hasAdminRights = (user, groupUID) => {
+export async function hasAdminRights(user, groupUID){
     if(user.uid == "anatole.romon")
-        return quickPromise(true);
-    return getUsersWithAdminRights(user, groupUID).then(adminList => {
-        return (typeof adminList != "undefined" && adminList.indexOf(user.uid) != -1);
-    });
-};
-
-
-/**
- * @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(Callback)} callback contruisant une requête knex pour une table de tous les id visibles.
- * @rights user
- */
-export const getVisibleGroupCallback = (user) => {
-    return listerGroupes(user, user.uid).then(group_ids => {
-        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);
-        };
-    });
-    
+        return true;
+    let adminList = await getUsersWithAdminRights(user, groupUID);
+    return (typeof adminList != "undefined" && adminList.indexOf(user.uid) != -1);
 };
 
 /**
@@ -219,7 +190,7 @@ function getGroupTableName(wantedType){
  */
 export async function getGroupIfVisible(user, groupUID, type="all"){
     let group_table_name = getGroupTableName(type);
-    let visible_groups = await getVisibleGroupCallback(user);
+    let visible_groups = await selectors.visibleGroups(user);
     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');
@@ -229,18 +200,30 @@ export async function getGroupIfVisible(user, groupUID, type="all"){
 export const getSimpleGroupIfVisible = (user, groupUID) => getGroupIfVisible(user, groupUID, "simple");
 export const getMetaGroupIfVisible = (user, groupUID) => getGroupIfVisible(user, groupUID, "meta");
 
+/**
+ * @summary Renvoie tous les groupes simples visibles par l'utilisateur user
+ * @desc Cette fonction effectue une requête knex. 
+ * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. 
+ * @arg {String} wantedType - Type de groupe voulu : `"simple"`, `"meta"` ou `"all"`. 
+ * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire.
+ * @rights user
+ */
 export async function getAllVisibleSimpleGroups (user){
-    let visible_groups = await getVisibleGroupCallback(user);
-    return knex.with('visible_groups', visible_groups).select().from("simple_groups").innerJoin('visible_groups', function (){
-        this.on('visible_groups.uid', '=', 'simple_groups.uid');
-    });
-}
+    let visible_groups = await selectors.visibleGroups(user);
+    return getSimpleGroupsFromCallbacks(user, visible_groups);
+};
 
+/**
+ * @summary Renvoie tous les meta groupes visibles par l'utilisateur user
+ * @desc Cette fonction effectue une requête knex. 
+ * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. 
+ * @arg {String} wantedType - Type de groupe voulu : `"simple"`, `"meta"` ou `"all"`. 
+ * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire.
+ * @rights user
+ */
 export async function getAllVisibleMetaGroups (user){
-    let visible_groups = await getVisibleGroupCallback(user);
-    return knex.with('visible_groups', visible_groups).select().from("meta_groups").innerJoin('visible_groups', function (){
-        this.on('visible_groups.uid', '=', 'meta_groups.uid');
-    });
+    let visible_groups = await selectors.visibleGroups(user);
+    return getMetaGroupsFromCallbacks(user, visible_groups);
 }
 
 /**
@@ -252,9 +235,8 @@ export async function getAllVisibleMetaGroups (user){
  * @rights user
  */
 export async function getAllVisibleGroups(user){
-    let all_simple_groups = await getAllVisibleSimpleGroups(user);
-    let all_meta_groups = await getAllVisibleMetaGroups(user);
-    return all_simple_groups.concat(all_meta_groups);
+    let visible_groups = await selectors.visibleGroups(user);
+    return getGroupsFromCallbacks(user, visible_groups);
 }
 
 /**
@@ -420,17 +402,7 @@ export const getUser = (user, userUID) => {
     return result;
 };
 
-export async function getVisibleAnnouncementsCallback(user){
-    return query_builder => {
-        return query_builder;
-    };
-};
 
-export async function getVisibleEventsCallback(user){
-    return query_builder => {
-        return query_builder;
-    };
-};
 
 /**
  * @summary Renvoie un message en fonction de son identifiant.
@@ -462,7 +434,7 @@ export async function getMessage(user, messageID){
  */
 export async function getMessageIfVisible(user, messageID){
     let announcement = await knex
-        .with('visible_announcements', await getVisibleAnnouncementsCallback(user))
+        .with('visible_announcements', await selectors.visibleAnnouncements(user))
         .select().from('visible_announcements').where('id', messageID);
     if(announcement){
         let res = announcement[0];
@@ -470,7 +442,7 @@ export async function getMessageIfVisible(user, messageID){
         return res;
     }
     let event = await knex
-        .with('visible_events', await getVisibleEventsCallback(user))
+        .with('visible_events', await selectors.visibleEvents(user))
         .select().from('visible_events').where('id', messageID);
     if(event){
         let res = event[0];
@@ -481,12 +453,6 @@ export async function getMessageIfVisible(user, messageID){
 };
 
 
-export async function getMessageHostsCallback(user, messageID){
-    return function(query_builder){
-        return query_builder.select('group').from('group_message_relationships')
-            .where('message', messageID);
-    }
-}
 
 export async function getMessageHosts(user, messageID){
 
@@ -532,23 +498,6 @@ export const getMetaGroupAdminMembers = (user, metaGroupUID) => {
     return quickPromise([]);
 };
 
-/**
- * @summary Renvoie un callback qui génère tous les membres d'un meta-groupe.
- * @param {Object} user - Utilisateur effectuant la requête.
- * @param {String} metaGroupUID - Identifiant unique du groupe.
- * @return {Promise(callback)} a callback to build a query for the members of a group
- * It doesn't need to be a promise, but I figure having all of my functions return promises is 
- * easier than keeping track of which functions do and do not return promises.
- * @author akka vodol 
- * @rights member(metaGroupUID)
- */
-export async function getMetaGroupMembersCallback(user, metaGroupUID){
-    return function(query_builder){
-        return query_builder.distinct().select().from('groups')
-            .innerJoin('meta_group_membership', 'groups.uid', 'meta_group_membership.member_uid')
-            .where('meta_group_membership.union_uid', '=', metaGroupUID);
-    };
-};
 
 /**
  * @summary Renvoie un callback qui génère tous les membres admin d'un meta-groupe.
@@ -595,45 +544,25 @@ export async function getGroupMemberUsers(user, GroupUID){
  * @rights member(metaGroupUID)
  */
 export async function getMetaGroupMemberUsers(user, metaGroupUID){
-    let member_group_list = await getMetaGroupMembersCallback(user, metaGroupUID).then(cb => cb(knex));
+    let member_group_list = await selectors.metaGroupMembers(user, metaGroupUID).then(cb => cb(knex));
     let members = [];
     for(memberGroup of await member_group_list){
         members = members.concat(getGroupMemberUsers(user, metaGroupUID));
     }
 };
 
-function recursive_callback_intersecter(callbackList){
-    let cb = callbackList.pop();
-    if(callbackList){
-        let intersecter = recursive_callback_intersecter(callbackList);
-        return function(query_builder){
-            return knex.with('callback_set', cb)
-                        .with('intersection', intersection)
-                        .select('intersection.uid').from('intersection')
-                        .innerJoin('callback_set', function(){
-                            this.on('callback_set.uid', '=', 'intersection.uid');
-                        });
-        }
-    }else{
-        return cb;
-    }
-}
 
-export async function getSimpleGroupsFromCallbacks (user, cbList){
-    
-    let intersection = await recursive_callback_intersecter(cbList);
-    return knex.with('intersection', intersection).select().from("simple_groups")
-        .innerJoin('intersection', function (){
-        this.on('intersection.uid', '=', 'simple_groups.uid');
+export async function getSimpleGroupsFromCallbacks (user, selection){
+    return knex.with('selection', selection).select().from("simple_groups")
+        .innerJoin('selection', function (){
+        this.on('selection.uid', '=', 'simple_groups.uid');
     });
 }
 
-export async function getMetaGroupsFromCallbacks (user, cbList){
-    
-    let intersection = await recursive_callback_intersecter(cbList);
-    return knex.with('intersection', intersection).select().from("meta_groups")
-        .innerJoin('intersection', function (){
-        this.on('intersection.uid', '=', 'meta_groups.uid');
+export async function getMetaGroupsFromCallbacks (user, selection){
+    return knex.with('selection', selection).select().from("meta_groups")
+        .innerJoin('selection', function (){
+        this.on('selection.uid', '=', 'meta_groups.uid');
     });
 }
 
diff --git a/src/graphql/connectors/selectors.js b/src/graphql/connectors/selectors.js
new file mode 100644
index 0000000..37d0169
--- /dev/null
+++ b/src/graphql/connectors/selectors.js
@@ -0,0 +1,91 @@
+/**
+ * @file Des callbacks qui sélectionnent un sous-ensemble de groupes.
+ * @author akka vodol
+ */
+
+import { renseignerSurUtilisateur, repliquerTOLdesIds, 
+    listerGroupes, listerMembres, listerAdministrateurs 
+} from '../../ldap/ldap_data';
+
+/**
+ * @summary 2Renvoie 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(Callback)} callback contruisant une requête knex pour une table de tous les id visibles.
+ * @rights user
+ */
+export async function  visibleGroups(user){
+    //let group_ids = await listerGroupes(user, user.uid);
+    let group_ids = ["br, kes, faerix"];
+    console.log("we got this far");
+    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);
+    };
+};
+
+export async function visibleAnnouncements(user){
+    return query_builder => {
+        return query_builder;
+    };
+};
+
+export async function visibleEvents(user){
+    return query_builder => {
+        return query_builder;
+    };
+};
+
+export async function messageHosts(user, messageID){
+    return function(query_builder){
+        return query_builder.select('group').as('uid').from('group_message_relationships')
+            .where('message', messageID);
+    }
+};
+
+/**
+ * @summary Renvoie un callback qui génère tous les membres d'un meta-groupe.
+ * @param {Object} user - Utilisateur effectuant la requête.
+ * @param {String} metaGroupUID - Identifiant unique du groupe.
+ * @return {Promise(callback(groups))} a callback to build a query for the members of a group
+ * It doesn't need to be a promise, but I figure having all of my functions return promises is 
+ * easier than keeping track of which functions do and do not return promises.
+ * @author akka vodol 
+ * @rights member(metaGroupUID)
+ */
+export async function metaGroupMembers(user, metaGroupUID){
+    return function(query_builder){
+        return query_builder.distinct().select().from('groups')
+            .innerJoin('meta_group_membership', 'groups.uid', 'meta_group_membership.member_uid')
+            .where('meta_group_membership.union_uid', '=', metaGroupUID);
+    };
+};
+
+
+function callbackIntersection(callbackList){
+    let cb = callbackList.pop();
+    if(callbackList){
+        let intersection = callbackIntersection(callbackList);
+        return function(query_builder){
+            return knex.with('callback_set', cb)
+                        .with('intersection', intersection)
+                        .select('intersection.uid').from('intersection')
+                        .innerJoin('callback_set', function(){
+                            this.on('callback_set.uid', '=', 'intersection.uid');
+                        });
+        }
+    }else{
+        return cb;
+    }
+};
\ No newline at end of file
diff --git a/src/graphql/resolvers.js b/src/graphql/resolvers.js
index 5539fc0..887bdf0 100644
--- a/src/graphql/resolvers.js
+++ b/src/graphql/resolvers.js
@@ -70,8 +70,8 @@ export const resolvers = {
         allPosts: (obj, args, context) => {
             return knex.select().from('posts');
         },
-        post: (obj, args, context) => {
-            const result = knex.select().from('posts').where('id','=',args.id);
+        message: (obj, args, context) => {
+            const result = knex.select().from('messages').where('id','=',args.id);
             return result.then((res) => res[0]);
         },
     },
diff --git a/src/graphql/typeDefs/actions.js b/src/graphql/typeDefs/actions.js
index 6e0fad9..392c1ca 100644
--- a/src/graphql/typeDefs/actions.js
+++ b/src/graphql/typeDefs/actions.js
@@ -132,5 +132,5 @@ const subQueries = `
     }
 `;
 
-const actionDefs = [RootTypes, subQueries ];
-export default typeDefs;
+const actionDefs = [RootTypes, subQueries, subMutations ];
+export default actionDefs;
diff --git a/src/graphql/typeDefs/objects.js b/src/graphql/typeDefs/objects.js
index 5c580f7..3df330f 100644
--- a/src/graphql/typeDefs/objects.js
+++ b/src/graphql/typeDefs/objects.js
@@ -136,8 +136,8 @@ const Event = `
         # Personnes qui participent à l'événement.
         participatingGroups: [Group]
         participatingUsers: [User]
-        description: String
-        asAnnouncement : Announcment
+        content: String
+        asAnnouncement : Announcement
     }
 `;
 
@@ -187,5 +187,5 @@ const Requests = `
 
 `;
 
-const objectDefs = [Group, User, Message, Post, Announcement, Event, subMutations, Requests];
-export default typeDefs;
\ No newline at end of file
+const objectDefs = [Group, User, Message, Post, Announcement, Event, Requests];
+export default objectDefs;
\ No newline at end of file
-- 
GitLab