diff --git a/src/graphql/connectors/connectors.js b/src/graphql/connectors/connectors.js index 9981605456b1e984d51bed623c261609ed8639ec..8bc9ac6749b4c87fcdeb32733d8d999de3444876 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 0000000000000000000000000000000000000000..37d01691f665b3063bd46b4dfb18325d5b1fe295 --- /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 5539fc0896185343ef3fb4058e33f4540b0dca47..887bdf0ba135e7b17378fe9d2377d6775d853696 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 6e0fad9e9fa94bb479455bdfe017373067f5ea4a..392c1cae0640a133c2fc0b5b3a890691ce3c667f 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 5c580f7f582c5efc163f0d6d17233482a4d58ea2..3df330f52dda32f45ff1a25df67f86f678e8bbe6 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