diff --git a/db/seeds/01_create_groups.js b/db/seeds/01_create_groups.js index fb2d49459c027fc55830236aced3132281aeb598..65f5cdbe23e29d9b0ee6249191f3ea8f6d2bd291 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 6b431f7322b76a167affb16fd27e738b756b80aa..62d736096af6296b0f58bfd2a7b67e539ee6d030 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 d7b681cd619ad33549c7016c9bfdff526486346d..af922178fc3b7386590b202d9c5c1551a8a856df 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) => {