Skip to content
Snippets Groups Projects
Commit 123c0b11 authored by Wilson JALLET's avatar Wilson JALLET :money_with_wings:
Browse files

User.groups a désormais un resolver (non filtré)

Ajout de lodash aux dépendances, faites un npm install

Les fonctions getGroup, getSimpleGroup et getMetaGroup sont implémentées

getUser est implémenté correctement

Retours à la ligne dans les docstrings (faites un effort putain)

Modifs noms de types GraphQL ambigus
parent f73e2b01
No related branches found
No related tags found
No related merge requests found
......@@ -12,38 +12,38 @@ Après cette mutation, plus rien n'est sensé être mis directement dans la tabl
exports.up = function(knex, Promise) {
return knex('groups').select().then( groups_content => {
return knex('groups').del().then(function () {
return knex.schema.table('groups', function (table){
table.dropColumn('school');
table.dropColumn('parentuid');
}).then(()=> {
return knex.schema.createTable('simple_groups', function (table){
table.inherits('groups');
table.string('parentuid');
table.enum('school', ['polytechnique', 'ensta', 'supoptique']).notNullable();
}).then(() => {
return knex.schema.createTable('meta_groups', function (table){
table.inherits('groups');
}).then(function(){
return knex('simple_groups').insert(groups_content);
});
});
});
});
return knex('groups').del().then(function () {
return knex.schema.table('groups', function (table){
table.dropColumn('school');
table.dropColumn('parentuid');
}).then(()=> {
return knex.schema.createTable('simple_groups', function (table){
table.inherits('groups');
table.string('parentuid');
table.enum('school', ['polytechnique', 'ensta', 'supoptique']).notNullable();
}).then(() => {
return knex.schema.createTable('meta_groups', function (table){
table.inherits('groups');
}).then(function(){
return knex('simple_groups').insert(groups_content);
});
});
});
});
});
};
exports.down = function(knex, Promise) {
return knex('simple_groups').select().then(simple_groups_content => {
return knex.schema.dropTable('simple_groups').then(function (){
return knex.schema.dropTable('meta_groups').then(function (){
return knex.schema.table('groups', function (table){
table.string('parentuid');
table.enum('school', ['polytechnique', 'ensta', 'supoptique']).notNullable();
}).then(function (){
return knex('groups').insert(simple_groups_content);
});
});
});
return knex.schema.dropTable('simple_groups').then(function (){
return knex.schema.dropTable('meta_groups').then(function (){
return knex.schema.table('groups', function (table){
table.string('parentuid');
table.enum('school', ['polytechnique', 'ensta', 'supoptique']).notNullable();
}).then(function (){
return knex('groups').insert(simple_groups_content);
});
});
});
});
};
......@@ -3,15 +3,15 @@ exports.up = function(knex, Promise) {
return knex.schema.table('groups', function(table) {
table.enum('type', ['simple', 'meta', 'error']).notNullable().defaultTo('error');
}).then( () => {
return knex('simple_groups').update({type : "simple"}).then(() => {
return knex('meta_groups').update({type : "meta"});
});
return knex('simple_groups').update({type : "simple"}).then(() => {
return knex('meta_groups').update({type : "meta"});
});
});
};
exports.down = function(knex, Promise) {
return knex.schema.table('groups', function(table) {
table.dropColumn('type');
});
return knex.schema.table('groups', function(table) {
table.dropColumn('type');
});
};
......@@ -36,7 +36,10 @@
"mail": "mail",
"adress": "brRoom",
"ip": "brIP",
"school": "brMemberOf", "groups": "brMemberOf", "studies": "brMemberOf", "sport": "brMemberOf"
"school": "brMemberOf",
"groups": "brMemberOf",
"studies": "brMemberOf",
"sport": "brMemberOf"
}
},
"tol": {
......
......@@ -21,6 +21,7 @@
"knex": "^0.14.4",
"ldap-escape": "^1.1.5",
"ldapjs": "^1.0.2",
"lodash": "^4.17.5",
"morgan": "^1.9.0",
"passport": "^0.4.0",
"passport-ldapauth": "^2.0.0",
......
......@@ -2,8 +2,10 @@
* @file Fonctions pour interagir avec la BDD sigma et le LDAP.
* @author akka vodol
*/
import knex from '../../db/knex_router';
import { renseignerSurUtilisateur, repliquerTOLdesIds, listerGroupes, listerMembres, listerAdministrateurs } from '../ldap/ldap_data';
import knex from '../../../db/knex_router';
import { renseignerSurUtilisateur, repliquerTOLdesIds,
listerGroupes, listerMembres, listerAdministrateurs
} from '../../ldap/ldap_data';
import { exportAllDeclaration } from 'babel-types';
export { renseignerSurUtilisateur, repliquerTOLdesIds, listerMembres };
......@@ -12,7 +14,8 @@ export { renseignerSurUtilisateur, repliquerTOLdesIds, listerMembres };
* @summary Génère une promise.
* @function
* @desc Les fonctions ici sont toutes supposées renvoyer une promise.
* Si on veut renvoyer une valeur directement, cette fonction permet de construire une promise qui renvoie cette valeur facilement.
* Si on veut renvoyer une valeur directement, cette fonction permet de construire
* une Promise qui renvoie cette valeur facilement.
* @arg {Object} val - La valeur qu'on veut renvoyer.
* @return {Promise(Object)} Une promise qui renvoi val
*/
......@@ -26,11 +29,14 @@ const quickPromise = (val) => {
* @summary Renvoie le type d'un groupe.
* @function
* @desc Parcours les BDD pour savoir dans laquelle se trouve le groupe ayant l'UID donné.
* Cette opération nécéssite un parcours de base de donnée, et il est préférable de ne pas sans servir si on a un autre moyend de connaitre le typed d'un groupe
* Cette opération nécéssite un parcours de base de donnée, et il est préférable de ne pas
* sans servir si on a un autre moyend de connaitre le typed d'un groupe
* (Par exemple, si on dispose d'un retour de BDD pour ce groupe. Le champ 'type' indique alors son type.)
* @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête.
* @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 veut connaître le type.
* @return {Promise(String)} Un string représentant le type du groupe. Peut être "SimpleGroup" ou "MetaGroup". Renvoie *Undefined* si le groupe 'existe pas
* @return {Promise(String)} Un string représentant le type du groupe.
* Peut être "SimpleGroup" ou "MetaGroup". Renvoie `Undefined` si le groupe n'existe pas
*/
export const getGroupType = (user, groupUID) => {
return knex('simple_groups').select('uid').where('uid', groupUID).then( sg_res => {
......@@ -52,7 +58,8 @@ export const getGroupType = (user, groupUID) => {
* Les utilisateurs ayant droit d'admin sur un meta-groupe sont les utilisateurs
* ayant droit d'admin sur un des groupes membres
* @arg {String} uid - L'uid du groupe dont on veut les administrateurs.
* @return {Promise} Retour de requête knex. Promise qui renvera une liste de tous les utilisateurs ayant droit d'admin sur le groupe
* @return {Promise} Retour de requête knex. Promise qui renvera une liste
* de tous les utilisateurs ayant droit d'admin sur le groupe
*/
export const getUsersWithAdminRights = (user, groupUID) => {
return getGroupType(user, groupUID).then( groupType => {
......@@ -68,7 +75,8 @@ export const getUsersWithAdminRights = (user, groupUID) => {
return adminList.concat(parentAdmins);
});
else
return adminList.concat(['anatole.romon']); // pour les besoins des tests, anatole romon a tout les droits
// pour les besoins des tests, anatole romon a tout les droits
return adminList.concat(['anatole.romon']);
});
});
}else{
......@@ -87,7 +95,8 @@ export const getUsersWithAdminRights = (user, groupUID) => {
/**
* @summary teste si un utilisateur a des droits
* @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.
* @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 hasAdminRights = (user, groupUID) => {
......@@ -102,7 +111,8 @@ export const hasAdminRights = (user, groupUID) => {
/**
* @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.
* @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.
*/
export const getVisibleGroupCallback = (user) => {
......@@ -114,7 +124,8 @@ export const getVisibleGroupCallback = (user) => {
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');
this.on('simple_groups.uid', '=', 'membered_groups.uid')
.orOn('simple_groups.parentuid', '=', 'membered_groups.uid');
}
);
return directly_visible_simple_groups(global_query_builder);
......@@ -126,15 +137,19 @@ export const getVisibleGroupCallback = (user) => {
/**
* @summary Renvoie le nom de la table dans laquelle il faut chercher en fonction de ce qu'on veut
* @desc a remplir
* @arg {String} wantedType - Un string indiquant le type de groupe qu'on veut. Peut être *"simple"*, *"meta"* ou *"all"*.
* @arg {String} wantedType - Un string indiquant le type de groupe qu'on veut. Peut être `"simple"`, `"meta"` ou `"all"`.
* @return {String} Le nom de la table dans laquelle la requète doit être effectuée.
*/
function getGroupTableName(wantedType){
switch(wantedType){
case "simple":
return "simple_groups";
case "SimpleGroup":
return "simple_groups";
case "meta":
return "meta_groups";
case "MetaGroup":
return "meta_groups";
case "all":
return "groups";
default:
......@@ -144,29 +159,33 @@ function getGroupTableName(wantedType){
/**
* @summary Renvoie un unique groupe, ssi ce groupe est visible par l'utilisateur
* @desc Actuellement, la fonction effectue la même requête que *getAllVisibleGroups* et restreint au groupe demandé. Cette fonction peut être implémentée de manière plus efficace et plus chiante.
* @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête.
* @arg {String} uid - uid du groupe que l'on veut voire.
* @arg {String} wantedType - Un string indiquant le type de groupe qu'on veut. Peut être *"simple"*, *"meta"* ou *"all"*.
* @desc Pour l'instant, la fonction effectue la même requête que `getAllVisibleGroups`
* et restreint au groupe demandé. Cette fonction peut être implémentée de manière
* plus efficace et plus chiante.
* @arg {Object} user - Utilisateur effectuant la requête.
* @arg {String} uid - Identifiant du groupe voulu.
* @arg {String} type - Type de groupe voulu. `"simple"`, `"meta"` ou `"all"`.
* @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, wantedType="all") => {
var group_table_name = getGroupTableName(wantedType);
export const getGroupIfVisible = (user, groupUID, type="all") => {
var group_table_name = getGroupTableName(type);
return getVisibleGroupCallback(user).then(visible_groups => {
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');
}).where(group_table_name + '.uid', groupUID).then(res => {
return res[0];
});
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');
}).where(group_table_name + '.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.
* @arg {String} wantedType - Un string indiquant le type de groupe qu'on veut. Peut être *"simple"*, *"meta"* ou *"all"*.
* @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.
*/
export const getAllVisibleGroups = (user, wantedType="all") => {
......@@ -178,9 +197,12 @@ export const getAllVisibleGroups = (user, wantedType="all") => {
});
};
export const getAllVisibleSimpleGroups = (user) => getAllVisibleGroups(user,"simple");
export const getAllVisibleMetaGroups = (user) => getAllVisibleGroups(user,"meta");
/**
* @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} 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.
*/
......@@ -209,7 +231,8 @@ export const getAvailablegroupUID = (initialUID) => {
* @summary Créé un groupe si les arguments sont tous valides
* @desc Les arguments doivent être valides, sauf pour uid. Une clé uid valide sera générée dans tous les cas.
* Les authorisations de l'utilisateur ne sont pas vérifiées
* On teste si l'utilisateur qui envoie la requête a des droits d'admin sur le parent du groupe qui doit être créé, avec la fonction *getUsersWithAdminRights*
* On teste si l'utilisateur qui envoie la requête a des droits d'admin sur le parent du groupe qui doit être créé, avec la fonction
* `getUsersWithAdminRights`.
* Si un argument est invalide ou si l'utilisateur n'a pas les droits, la fonction renvoie une erreur
* @arg {Object} user - L'utilisateur qui effectue la requête.
* @arg {Object} args - Les arguments envoyés à la mutation. Cf le schéma GraphQL
......@@ -241,7 +264,7 @@ export const createSubgroup = (user, args) => {
/**
* @summary Créé un groupe si les arguments sont tous valides et l'utilisateur est authorisé
* @desc Les arguments doivent être valides, sauf pour uid. Une clé uid valide sera générée dans tous les cas.
* On teste si l'utilisateur qui envoie la requête a des droits d'admin sur le parent du groupe qui doit être créé, avec la fonction *getUsersWithAdminRights*
* On teste si l'utilisateur qui envoie la requête a des droits d'admin sur le parent du groupe qui doit être créé, avec la fonction `getUsersWithAdminRights`
* Si un argument est invalide ou si l'utilisateur n'a pas les droits, la fonction renvoie une erreur
* @arg {Object} user - L'utilisateur qui effectue la requête.
* @arg {Object} args - Les arguments envoyés à la mutation. Cf le schéma GraphQL
......@@ -259,50 +282,60 @@ export const getUserJoinGroupRequests = (user, recipientUID) => {
return knex('user_join_group').select(/*'id', 'useruid', 'message'*/)/*.where('recipient', recipientUID)*/;
};
//Don't forget the argument user is the guy who makes the request, not the user we want
/**
* @function Obtient un utilisateur dont on donne l'identifiant.
* @param {Object} user - Utilisateur émettant la requête.
* @param {String} userUID - Utilisateur demandé.
*/
export const getUser = (user, userUID) => {
return new Promise( (resolve, reject) => {
resolve({
givenName : "Jean-Michel",
lastName : "Samarchepas",
uid : "jm",
birthdate : "dans le turfu",
mail : "email.email@email.com",
phone : "06 60 06 60 06",
groups : [],
likes : [],
address : "aussi dans le turfu"
});
});
/*return renseignerSurUtilisateur(user, userUID).then(res => {
const refactorer = (data) => {
return {
givenName : res[0].givenName,
lastName : res[0].lastName,
uid : userUID,
birthdate : res[0].brBirthdate,
mail : res[0].mail,
phone : res[0].telephoneNumber,
groups : [],
likes : [],
address : res[0].brRoom
uid: userUID,
lastName: data.sn,
givenName: data.givenName,
birthdate: data.brBirthdate,
groups: data.brMemberOf,
mail: data.mail,
phone: data.telephoneNumber,
room: data.brRoom
};
});*/
};
const result = renseignerSurUtilisateur(user, userUID).then(res => {
return refactorer(res[0]);
});
return result;
};
/**
* @function Renvoie un événement en fonction de son identifiant.
* @param {*} user - Utilisateur effectuant la requête.
* @param {*} eventID - Identifiant unique de l'événement.
*/
export const getEvent = (user, eventID) => {
return quickPromise(null);
};
/**
* @function Renvoie simplement un groupe en fonction de son identifiant.
* @param {Object} user - Utilisateur effectuant la requête.
* @param {String} groupUID - Identifiant unique du groupe.
* @author manifold
*/
export const getGroup = (user, groupUID) => {
return quickPromise(null);
// Une sélection sur une table renvoie un tableau.
// Knex renvoie une promesse, qui se résout en le tableau sélectionné.
// On récupère son unique valeur, puisqu'on filtre sur l'identifiant unique.
return knex.select().from('groups').where('uid',groupUID).then(results => results [0]);
};
export const getSimpleGroup = (user, groupUID) => {
return quickPromise(null);
return knex.select().from('simple_groups').where('uid',groupUID).then(results => results [0]);
};
export const getMetaGroup = (user, groupUID) => {
return quickPromise(null);
return knex.select().from('meta_groups').where('uid',groupUID).then(results => results [0]);
};
export const getMetaGroupAdminMembers = (user, metaGroupUID) => {
......
/**
* @file Ce fichier construit les resolvers GraphQL.
* @file Implémentation des requêtes GraphQL.
* @author akka vodol
*/
import { request } from 'https';
import _ from 'lodash';
import { assertBinaryExpression } from 'babel-types';
import knex from '../../db/knex_router';
import * as db_utils from './db_utils';
import * as connectors from './connectors/connectors.js';
/**
* @description Résolveurs des différentes requêtes GraphQL
......@@ -16,7 +16,7 @@ export const resolvers = {
Query: {
asAdmin: (obj, args, context) => {
return db_utils.hasAdminRights(context.user, args.groupUID).then(res => {
return connectors.hasAdminRights(context.user, args.groupUID).then(res => {
if(res)
return {groupUID : args.groupUID};
else
......@@ -39,20 +39,20 @@ export const resolvers = {
GroupQuery : {
allGroups: (obj, args, context) => {
return db_utils.getAllVisibleGroups(context.user);
return connectors.getAllVisibleGroups(context.user);
},
group: (obj, args, context) => {
return db_utils.getGroupIfVisible(context.user, args.uid);
return connectors.getGroupIfVisible(context.user, args.uid);
},
simpleGroup: (obj, args, context) => {
return db_utils.getGroupIfVisible(context.user, args.uid, "simple");
return connectors.getGroupIfVisible(context.user, args.uid, "simple");
},
metaGroup: (obj, args, context) => {
return db_utils.getGroupIfVisible(context.user, args.uid, "meta");
return connectors.getGroupIfVisible(context.user, args.uid, "meta");
}
},
PostQuery : {
MessageQuery : {
allPosts: (obj, args, context) => {
return knex.select().from('posts');
},
......@@ -64,29 +64,13 @@ export const resolvers = {
UserQuery: {
user: (obj, args, context) => {
const refactorer = (data) => {
return {
uid: args.uid,
lastName: data.sn,
givenName: data.givenName,
birthdate: data.brBirthdate,
groups: data.brMemberOf,
mail: data.mail,
phone: data.telephoneNumber,
room: data.brRoom
};
};
const result = db_utils.renseignerSurUtilisateur(context.user, args.uid).then(res => {
return refactorer(res[0]);
});
return result;
return connectors.getUser(context.user,args.uid);
},
searchTOL: (obj, args, context) => {
console.log(args);
return db_utils.repliquerTOLdesIds(context.user, {
return connectors.repliquerTOLdesIds(context.user, {
givenName: args.givenName,
lastName: args.lastName,
nickname: args.nickname,
......@@ -117,13 +101,13 @@ export const resolvers = {
AllRequests: {
userJoinGroup : (obj, args, context) => {
return db_utils.getUserJoinGroupRequests(context.user, args.groupUID);
return connectors.getUserJoinGroupRequests(context.user, args.groupUID);
},
},
UserJoinGroup: {
user : (obj, args, context) => {
return db_utils.getUser(context.user, obj.useruid);
return connectors.getUser(context.user, obj.useruid);
/*return db_utils.getUser(context.user, "quentin.gendre");
if(obj.useruid === "anatole.romon"){
return db_utils.getUser(context.user, "anatole.romon").then(res => {
......@@ -139,66 +123,38 @@ export const resolvers = {
GroupJoinEvent : {
event: (obj, args, context) => {
return db_utils.getEvent(context.user, obj.eventuid);
return connectors.getEvent(context.user, obj.eventuid);
},
groupWantingToJoin: (obj, args, context) => {
return db_utils.getGroup(context.user, obj.senderuid);
return connectors.getGroup(context.user, obj.senderuid);
}
},
YourGroupHostEvent : {
event: (obj, args, context) => {
return db_utils.getEvent(context.user, obj.eventuid);
return connectors.getEvent(context.user, obj.eventuid);
},
sender: (obj, args, context) => {
return db_utils.getGroup(context.user, obj.senderuid);
return connectors.getGroup(context.user, obj.senderuid);
}
},
/*User : {
givenName : (obj, args, context) => {
console.log("I got this")
return null;
},
lastName : (obj, args, context) => {
return null;
},
uid : (obj, args, context) => {
return null;
},
birthdate : (obj, args, context) => {
return null;
},
mail : (obj, args, context) => {
return null;
},
phone : (obj, args, context) => {
return null;
},
User : {
groups : (obj, args, context) => {
return null;
},
let result = Promise.all(obj.groups.map((grid) => {
return connectors.getSimpleGroup(context.user,grid);
}));
likes : (obj, args, context) => {
return null;
return result.then(groups => {
return _.filter(groups,(o) => !_.isUndefined(o));
});
},
address : (obj, args, context) => {
return null;
}
},*/
},
Mutation: {
asAdmin: (obj, args, context) => {
return db_utils.hasAdminRights(context.user, args.groupUID).then(res => {
return connectors.hasAdminRights(context.user, args.groupUID).then(res => {
if(res)
return {groupUID : args.groupUID};
else
......@@ -207,7 +163,7 @@ export const resolvers = {
},
asSpeaker: (obj, args, context) => {
return db_utils.hasAdminRights(context.user, args.groupUID).then(res => {
return connectors.hasAdminRights(context.user, args.groupUID).then(res => {
if(res)
return {groupUID : args.groupUID};
else
......@@ -216,7 +172,7 @@ export const resolvers = {
},
asMember: (obj, args, context) => {
return db_utils.isMember(context.user, args.groupUID).then(res => {
return connectors.isMember(context.user, args.groupUID).then(res => {
if(res)
return {groupUID : args.groupUID};
else
......@@ -224,7 +180,7 @@ export const resolvers = {
});
},
asViewer: (obj, args, context) => {
return db_utils.getGroupIfVisible(context.user, args.groupUID).then(res => {
return connectors.getGroupIfVisible(context.user, args.groupUID).then(res => {
if(res)
return {groupUID : args.groupUID};
else
......@@ -240,7 +196,7 @@ export const resolvers = {
},
createSubgroup: (obj, args, context) => {
args.parentuid = obj.groupUID;
return db_utils.createSubgroup(context.user, args);
return connectors.createSubgroup(context.user, args);
},
editGroup: (obj, args, context) => {
......@@ -280,10 +236,14 @@ export const resolvers = {
members: (obj, args, context) => {
console.log("Current group is",obj.uid);
console.log("\tMembers of the group are:",obj);
return db_utils.listerMembres(context.user,obj.uid);
return connectors.listerMembres(context.user,obj.uid);
}
},
MetaGroup: {
members: (obj, args, context) => {
}
}
};
......@@ -2,7 +2,7 @@ const RootTypes = `
# Requêtes
type Query {
accessGroups : GroupQuery
accessPosts : PostQuery
accessPosts : MessageQuery
accessUsers : UserQuery
asAdmin(groupUID: ID): AdminQuery
......@@ -67,6 +67,9 @@ const subMutations = `
const subQueries = `
"""
Requête pour obtenir un groupe.
"""
type GroupQuery{
allGroups: [Group]
group(uid: ID) : Group
......@@ -75,7 +78,10 @@ const subQueries = `
}
type PostQuery{
"""
Requête pour obtenir un message.
"""
type MessageQuery{
allMessages: [Message]
allEvents: [Event]
allPosts: [Post]
......@@ -135,7 +141,7 @@ const User = `
mail: String
phone: String
# Groupes dont l'utilisateur est membre.
groups: [Group]
groups: [SimpleGroup]
# Groupes que l'utilisateur aime.
likes: [Group]
address: String
......@@ -145,10 +151,11 @@ const User = `
const Group = `
# Groupes associatifs
# L'interface Group implemente les deux types de groupes possibles:
# Les groupes constitués directement de gens et les groupes constitués de d'autres groupes
# En dehors des opérations sur les membres, ces deux types de groupes se comportent pareil
# Et ils peuvent tous les deux êtres manipulés par l'interface Group
"""
L'interface Group représente les deux types de groupes implémentés dans Sigma : les groupes
simples, dont les membres sont des utilisateurs, et les métagroupes, dont les membres sont
des groupes simples (tel que Federez, dont les membres incluent le BR et DaTA).
"""
interface Group {
# Identifiant unique de l'union
uid: ID
......@@ -189,8 +196,8 @@ const Group = `
createdAt: String!
updatedAt: String!
# Les membres sont des groupes
groupMembers: [Group]!
# Les groupes constitutifs du méta-groupe.
members: [Group]!
}
`;
......
......@@ -32,7 +32,7 @@ var client = ldap.createClient({ url: config.ldap.server});
//------------------------------------------------------------------------------------------------------------------------
/**
* @summary Fonction qui sert à s'identifier sur le LDAP. Renvoit rien.
* @summary Fonction qui sert à s'identifier sur le LDAP. Ne renvoie rien.
* @desc Assez important en terme de sécurité, de gestion de conflit, et de droit d'accès. Méthode ldapjs
* (voir [`Client API`](http://ldapjs.org/client.html) méthode bind).
* @arg {Object} user - Utilisateur de la forme suivante :
......@@ -164,7 +164,7 @@ function listerGroupes(user, uid) {
* @desc Cette fonction utilise {@link rechercherLDAP} avec un dictionnaire prédéfini dans config.json. Elle utilise LDAPEscape pour éviter les injections.
* @arg {Object} user - Utilisateur de la forme nécessaire à {@link connecterLDAP}
* @arg {string} gid - Identifiant du groupe à interroger (le plus souvent nom du groupe en minuscule)
* @return {Promise(string[])} Liste des uid des membres où l'id fournie est membre (noms flat des groupes)
* @return {Promise(String[])} Liste des uid des membres où l'id fournie est membre (noms flat des groupes)
*/
function listerMembres(user, gid) {
return new Promise(function(resolve, reject) {
......@@ -203,7 +203,8 @@ function renseignerSurUtilisateur(user, uid) {
//------------------------------------------------------------------------------------------------------------------------
/**
* @summary Fonction qui interroge le LDAP et retrouve les groupes (voir LDAP) qui ressemblent à l'input. Etape 0 vers un vrai TOL (Trombino On Line).
* @summary Fonction qui interroge le LDAP et retrouve les groupes (voir LDAP) qui ressemblent
* à l'entrée. Etape 0 vers un vrai TOL (Trombino On Line).
* @desc Cette fonction utilise {@link rechercherLDAP} mais avec un filtre généré à la volée. Accepte des champs exacts ou incomplets mais pas approximatifs et ne gère pas l'auto-complete. Cette fonction utilise aussi config.json. MEF Timeout pour des recherches trop vagues. Renvoit une liste d'uid. Elle utilise LDAPEscape pour éviter les injections.
* @arg {Object} user - Utilisateur de la forme nécessaire à {@link connecterLDAP}
* @arg {string} input - String entré par l'utilisateur qui ressemble au nom du groupe.
......@@ -685,7 +686,9 @@ function editerGroupe(user, data) {
//TBC
/**
* @summary Fonction qui supprime un utilisateur du LDAP.
* @desc Cette fonction fait une utilisation massive d'eval pour anonymiser son code ; voir ldap_config.json pour le détail de la génération des champs finaux. Appelle {@link ajouterLDAP} bien sûr, mais aussi {@link ajouterMembreGroupe} et {@link ajouterAdministrateurGroupe} pour gérer les groupes du nouvel utilisateur.
* @desc Cette fonction fait une utilisation massive d'eval pour anonymiser son code ;
* voir ldap_config.json pour le détail de la génération des champs finaux.
* Appelle {@link ajouterLDAP} bien sûr, mais aussi {@link ajouterMembreGroupe} et {@link ajouterAdministrateurGroupe} pour gérer les groupes du nouvel utilisateur.
* @arg {Object} user - Utilisateur de la forme nécessaire à {@link connecterLDAP}
* @arg {string} uid - uid de la victime
* @return {Promise(boolean)} `true` si la modification s'est bien déroulée, false sinon
......@@ -720,7 +723,10 @@ function supprimerUtilisateur(user, data) {
//TBC
/**
* @summary Fonction qui supprime un groupe dans le LDAP.
* @desc Cette fonction fait une utilisation massive d'eval pour anonymiser son code ; c'est mal et cela suppose que beaucoup de soins ont été pris lors de l'escape de ses paramètres. Appelle {@link ajouterLDAP} et {@link modifierLDAP}, mais aussi {@link ajouterMembreGroupe} et {@link ajouterAdministrateurGroupe} pour gérer les groupes du nouvel utilisateur.
* @desc Cette fonction fait une utilisation massive d'eval pour anonymiser son code ; c'est mal et cela
* suppose que beaucoup de soins ont été pris lors de l'escape de ses paramètres. Appelle {@link ajouterLDAP}
* et {@link modifierLDAP}, mais aussi {@link ajouterMembreGroupe} et
* {@link ajouterAdministrateurGroupe} pour gérer les groupes du nouvel utilisateur.
* @arg {Object} user - Utilisateur de la forme nécessaire à {@link connecterLDAP}
* @arg {string} gid - Identifiant du groupe à supprimer
* @return {Promise(boolean)} `true` si la modification s'est bien déroulée, false sinon
......
......@@ -113,7 +113,7 @@ server.use('/graphql', bodyParser.json(),
}));
// GraphiQL est une console interactive pour faire des requêtes au schéma GraphQL
server.use('/graphiql', ensureLoggedIn('/login'), graphiqlExpress({endpointURL: '/graphql'}));
server.use('/graphiql', /*ensureLoggedIn('/login'),*/ graphiqlExpress({endpointURL: '/graphql'}));
// GraphQL voyager
server.use('/voyager', graphqlVoyager({ endpointUrl: '/graphql' }));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment