From e56df0d681b4acdef62013b6862a230b0558c930 Mon Sep 17 00:00:00 2001
From: anatole <anatole.romon@polytechnique.edu>
Date: Mon, 5 Mar 2018 14:27:23 +0100
Subject: [PATCH] travail sur les membres

---
 db/seeds/01_create_groups.js         |  7 ++++
 src/graphql/connectors/connectors.js | 62 +++++++++++++++++++++++++---
 src/graphql/resolvers.js             |  8 +++-
 3 files changed, 70 insertions(+), 7 deletions(-)

diff --git a/db/seeds/01_create_groups.js b/db/seeds/01_create_groups.js
index fb2d494..65f5cdb 100644
--- a/db/seeds/01_create_groups.js
+++ b/db/seeds/01_create_groups.js
@@ -21,6 +21,13 @@ exports.seed = function(knex, Promise) {
           school: 'polytechnique',
           parentuid: 'kes',
           type : 'simple'
+        },{
+          name: 'Faërix',
+          uid: 'faerix',
+          website: 'faerix.net',
+          school: 'polytechnique',
+          parentuid: 'kes',
+          type : 'simple'
         },{
           name: 'Bôbar',
           uid: 'bob',
diff --git a/src/graphql/connectors/connectors.js b/src/graphql/connectors/connectors.js
index 6b431f7..62d7360 100644
--- a/src/graphql/connectors/connectors.js
+++ b/src/graphql/connectors/connectors.js
@@ -264,8 +264,9 @@ export async function getAllVisibleGroups(user){
  * @return {Promise(Boolean)} Boolean indiquant si l'utilisateur est membre du groupe.
  * @rights user
  */
-export const isMember = (user, groupUID) => {
-    return listerGroupes(user, user.uid).then(group_ids => group_ids && group_ids.indexOf(groupUID) != -1);
+export async function isMember(user, groupUID){
+    let member_list = await getGroupMemberUsers(user, groupUID);
+    return member_list && member_list.indexOf(groupUID) != -1;
 };
 
 /**
@@ -462,8 +463,7 @@ export const getMetaGroupAdminMembers = (user, metaGroupUID) => {
 };
 
 /**
- * @function getMetaGroupMembers
- * @summary Renvoie tous les membres d'un meta-groupe.
+ * @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
@@ -478,4 +478,56 @@ export async function getMetaGroupMembersCallback(user, metaGroupUID){
             .innerJoin('meta_group_membership', 'groups.uid', 'meta_group_membership.member_uid')
             .where('meta_group_membership.union_uid', '=', metaGroupUID);
     };
-};
\ No newline at end of file
+};
+
+/**
+ * @summary Renvoie un callback qui génère tous les membres admin 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 admin members of a group
+ * @author akka vodol 
+ * @rights member(metaGroupUID)
+ */
+export async function getMetaGroupAdminMembersCallback(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)
+            .where('meta_group_membership.status', '=', 'admin');
+    };
+};
+
+/**
+ * @summary Renvoie les membres d'un groupe quelquonque.
+ * @param {Object} user - Utilisateur effectuant la requête.
+ * @param {String} metaGroupUID - Identifiant unique du groupe.
+ * @return {Promise(List)} Une liste des uid de tous les membres du groupe
+ * @author akka vodol 
+ * @rights member(metaGroupUID)
+ */
+export async function getGroupMemberUsers(user, GroupUID){
+    switch( await getGroupType(user, GroupUID) ){
+    case "simple":
+        return listerMembres(user, GroupUID);
+    case "meta":
+        return getMetaGroupMemberUsers(user, GroupUID);
+    default:
+        return undefined;
+    }
+};
+
+/**
+ * @summary Renvoie les membres d'un meta groupe.
+ * @param {Object} user - Utilisateur effectuant la requête.
+ * @param {String} metaGroupUID - Identifiant unique du groupe.
+ * @return {Promise(List)} Une liste des uid de tous les membres du groupe
+ * @author akka vodol 
+ * @rights member(metaGroupUID)
+ */
+export async function getMetaGroupMemberUsers(user, metaGroupUID){
+    let member_group_list = await getMetaGroupMembersCallback(user, metaGroupUID).then(cb => cb(knex));
+    let members = [];
+    for(memberGroup of await member_group_list){
+        members = members.concat(getGroupMemberUsers(user, metaGroupUID));
+    }
+};
diff --git a/src/graphql/resolvers.js b/src/graphql/resolvers.js
index d7b681c..af92217 100644
--- a/src/graphql/resolvers.js
+++ b/src/graphql/resolvers.js
@@ -23,8 +23,12 @@ export const resolvers = {
                 throw "You do not have admin rights over this group";
         },
 
-        asMember: function (obj, args, context){
-            return {groupUID : args.groupUID};
+        asMember: async function (obj, args, context){
+            if(await connectors.isMember(context.user, args.groupUID) 
+                || connectors.hasAdminRights(context.user, args.groupUID))
+                return {groupUID : args.groupUID};
+            else
+                throw "You do not have member rights over this group";
         },
 
         accessGroups: (obj, args, context) => {
-- 
GitLab