diff --git a/src/graphql/schema.js b/src/graphql/schema.js index 2bbf77ac1cbea1d10d437560e5aeb8343a52cdf3..4ed74cb141dfa85beade5462cde9801801763c3b 100644 --- a/src/graphql/schema.js +++ b/src/graphql/schema.js @@ -8,67 +8,8 @@ import { makeExecutableSchema } from 'graphql-tools'; import { request } from 'https'; import { assertBinaryExpression } from 'babel-types'; -import { Group, User, Post, Event as schemaEvent } from './typeDefs'; +import typeDefs from './typeDefs'; -const RootTypes = ` - # Requêtes - type Query { - allGroups: [Group] - group(uid: ID) : Group - user(uid: ID) : [User] - allEvents: [Event] - } - - type Mutation { - asAdmin(groupid: String): AdminMutation - asMember(groupid: String): MemberMutation - asViewer(groupid: String): ViewerMutation - - createGroup( - uid: ID = null - name: String - website: String - description: String - school: String - parentuid : String - ): Group - } - - type AdminMutation { - - test: Boolean - - createSubgroup( - uid: ID = null, - name: String, - website: String, - description: String, - school: String, - ): Group - - addUser(userid : String): User - removeUser(userid : String): User - addAdmin(userid : String): User - removeAdmin(userid : String): User - - editGroup( - name: String, - website: String, - description: String, - school: String, - ): Group - - } - - type MemberMutation { - leave: Group - } - - type ViewerMutation { - requestJoin: Group - } - -`; /** * @summary Renvoie tous les utilisateurs ayant des droits d'administrateur sur un groupe. @@ -87,7 +28,7 @@ const getUsersWithAdminRights = (user, groupUID) => { return adminList.concat(parentAdmins); }); else - return adminList; + return adminList.concat(['anatole.romon']); // pour les besoins des tests, anatole romon a tout les droits }); }); }; @@ -98,8 +39,8 @@ const getUsersWithAdminRights = (user, groupUID) => { * @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. */ -const hasAdminRights = (user, groupuid) => { - return getUsersWithAdminRights(user, groupuid).then(adminList => { +const hasAdminRights = (user, groupUID) => { + return getUsersWithAdminRights(user, groupUID).then(adminList => { return (typeof adminList != "undefined" && adminList.indexOf(user.uid) != -1); }); }; @@ -111,6 +52,7 @@ const hasAdminRights = (user, groupuid) => { * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire. */ const getAllVisibleGroups = (user) => { + console.log(user); return listerGroupes(user, user.uid).then(group_ids => { if(typeof group_ids == "undefined") @@ -149,17 +91,50 @@ const getGroupIfVisible = (user, uid) => { * @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 */ -const getAvailableGroupUID = (initialUID) => { +const getAvailablegroupUID = (initialUID) => { let rasUID = initialUID.replace(' ', '_').replace(/\W/g, '').toLowerCase(); return knex.from('groups').where('uid', rasUID).then(res =>{ if(res.length == 0){ return(rasUID); }else{ - return(getAvailableGroupUID(rasUID + 'n')); + return(getAvailablegroupUID(rasUID + 'n')); } }); }; +/** + * @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* + * 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 + * @return {Promise} Retour de requête knex. Le groupe qui vient d'être créé. En cas d'echec, renvoie une erreur. + */ +const createSubgroup = (user, args) => { + if(typeof args.parentuid != 'string') + throw "Illegal argument : parentuid must be a non null string"; + if(typeof args.name != 'string') + throw "Illegal argument : name must be a non null string"; + + return(getAvailablegroupUID(args.uid).then(rasUID => { + // TODO : appeller une fonction de ldap_data pour y créer un groupe. + return knex('groups').insert({ + uid : rasUID, + parentuid : args.parentuid, + createdAt : knex.fn.now(), + updatedAt : this.createdAt, + name : args.name, + website : args.website, + description : args.description, + school : args.school + }).then( res => { + return getGroupIfVisible(user, rasUID); + }); + })); +} + /** * @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. @@ -170,31 +145,10 @@ const getAvailableGroupUID = (initialUID) => { * @return {Promise} Retour de requête knex. Le groupe qui vient d'être créé. En cas d'echec, renvoie une erreur. */ const createGroupIfLegal = (user, args) => { - if(typeof args.parentuid != 'string') - throw "Illegal argument : parentuid must be a string"; - return getUsersWithAdminRights(user, args.parentuid).then( admin_list => { - if(typeof admin_list == undefined) //Cela arrive si arg.parentuid n'est pas un id de groupe valable (ou éventuellement si Chevalier fait de la merde) - throw "invalid argument : no group with id " + args.parentuid; - admin_list = admin_list.concat(['anatole.romon']); // pour les besoins des tests, anatole romon a tout les droits - if(admin_list.indexOf(user.uid) == -1) + return hasAdminRights(user, args.parentuid).then( answer => { + if( !answer ) throw "illegal request : you must have admin rights over a group to create a subgroup of that group"; - if(typeof args.uid != "string") - args.uid = args.name; - return(getAvailableGroupUID(args.uid).then(rasUID => { - // TODO : appeller une fonction de ldap_data pour y créer un groupe. - return knex('groups').insert({ - uid : rasUID, - parentuid : args.parentuid, - createdAt : knex.fn.now(), - updatedAt : this.createdAt, - name : args.name, - website : args.website, - description : args.description, - school : args.school - }).then( res => { - return getGroupIfVisible(user, rasUID); - }); - })); + return createSubgroup(user, args); }); }; @@ -231,16 +185,35 @@ const resolvers = { }); return result; + }, + + searchTOL: (obj, args, context) => { + console.log(args); + return repliquerTOLdesIds(context.user, { + givenName: args.givenName, + lastName: args.lastName, + nickname: args.nickname, + nationality: args.nationality, + school: args.school, + promotion: args.promotion, + groups: args.groups, + studies: args.studies, + sport: args.sport, + phone: args.phone, + mail: args.mail, + adress: args.adress, + ip: args.ip + }); } }, Mutation: { asAdmin: (obj, args, context) => { - return hasAdminRights(context.user, args.groupid).then(res => { + return hasAdminRights(context.user, args.groupUID).then(res => { if(res) - return {hasAdminRights : true}; + return {groupUID : args.groupUID}; else - return {hasAdminRights : false}; + throw "You do not have admin rights over this group"; }); }, createGroup: (obj, args, context) => { @@ -249,18 +222,25 @@ const resolvers = { }, AdminMutation: { - test: (obj, args, context) => { - console.log(obj); - console.log(typeof obj); + + isAdmin: (obj, args, context) => { + return true; + }, + + createSubgroup: (obj, args, context) => { + args.parentuid = obj.groupUID; + return createSubgroup(context.user, args); + }, + + editGroup: (obj, args, context) => { return null; - } } }; const schema = makeExecutableSchema({ - typeDefs: [RootTypes, Group, User, Post, schemaEvent], + typeDefs, resolvers }); diff --git a/src/graphql/typeDefs.js b/src/graphql/typeDefs.js index 3e5592835a093084185cbe8911aa492311b2b460..dd8bd9329f48cd79670dfea859cda4a3474bff05 100644 --- a/src/graphql/typeDefs.js +++ b/src/graphql/typeDefs.js @@ -1,3 +1,78 @@ +const RootTypes = ` + # Requêtes + type Query { + allGroups: [Group] + group(uid: ID) : Group + user(uid: ID) : [User] + allEvents: [Event] + searchTOL( + givenName: String + lastName: String + nickname: String + nationality: String + school: String + promotion: String + groups: String + studies: String + sport: String + phone: String + mail: String + adress: String + ip: String + ): [String] + } + + type Mutation { + asAdmin(groupUID: String): AdminMutation + asMember(groupUID: String): MemberMutation + asViewer(groupUID: String): ViewerMutation + + createGroup( + uid: ID = null + name: String + website: String + description: String + school: String + parentuid : String + ): Group + } + + type AdminMutation { + + isAdmin: Boolean + + createSubgroup( + uid: ID = null, + name: String, + website: String, + description: String, + school: String, + ): Group + + addUser(userid : String): User + removeUser(userid : String): User + addAdmin(userid : String): User + removeAdmin(userid : String): User + + editGroup( + name: String, + website: String, + description: String, + school: String, + ): Group + + } + + type MemberMutation { + leave: Group + } + + type ViewerMutation { + requestJoin: Group + } + +`; + const User = ` # Utilisateurs type User { @@ -31,7 +106,7 @@ const Group = ` } `; -const Event = ` +const Events = ` # Événements type Event { # Intitulé de l'événement @@ -56,4 +131,7 @@ const Post = ` } `; -export { Group, User, Event, Post }; \ No newline at end of file + +const typeDefs = [RootTypes, Group, User, Post, Events]; + +export default typeDefs; \ No newline at end of file diff --git a/src/server.js b/src/server.js index 023691da29cd84065e09c0f4d4a2ed017808fea3..bb26e721d5ee2d4ce0ebbee6e405e4782beec49e 100644 --- a/src/server.js +++ b/src/server.js @@ -50,7 +50,6 @@ server.use('/graphql', bodyParser.json(), cors(), let password; try { - console.log(req.session); uid = req.session.passport.user.uid; password = "mythe"; } catch (err) { diff --git a/src/views/home.pug b/src/views/home.pug index ecf13fedf6636a61dca465b52cdd07c5ef4dbafc..23b7f1633f1b7f4f99994577dd5d46310a64fbb6 100644 --- a/src/views/home.pug +++ b/src/views/home.pug @@ -12,14 +12,16 @@ block content div.form-group label(for="columns") Columns input.form-control(type="search", name="columns") - button.form-control(type="submit") Recherche/<em>Search</em> + button.form-control(type="submit",class="button") Recherche/<em>Search</em> | h2 GraphiQL - p - | GraphiQL is an interactive environment to make GraphQL + p GraphiQL is an interactive environment to make GraphQL | requests to the database. - a(href="/graphiql") Check it out. + div(class="button") + a(href="/graphiql") Check it out. + div(class="button") + a(href="/voyager") Check it out. | p Currently logged in as: #{userName}. form(action="/logout", method="post") - button.form-control(type="submit") Déconnexion/<em>Logout</em> + button.form-control(type="submit",class="button") Déconnexion/<em>Logout</em> diff --git a/src/views/login.pug b/src/views/login.pug index a67303600b2456f4ea4d18df80e5d7e9931dcfae..f0594a3f816faeec7e79d415611d396ff06493fb 100644 --- a/src/views/login.pug +++ b/src/views/login.pug @@ -13,5 +13,5 @@ block content div.form-group label(for="password") Password input.form-control(type="password", placeholder="Password", name="password") - button.form-control(type="submit") Connexion/<em>Log in</em> + button.form-control(type="submit",class="button") Connexion/<em>Log in</em> \ No newline at end of file