From 38eaee65fc69dcbc98f410c591ae9cbaf8e5ef7b Mon Sep 17 00:00:00 2001
From: anatole <anatole.romon@polytechnique.edu>
Date: Sat, 10 Mar 2018 19:32:08 +0100
Subject: [PATCH] plus de resolvers

---
 db/seeds/07_make_event.js            |  19 +++++
 src/graphql/connectors/connectors.js | 112 +++++++++++++++++++++++++--
 src/graphql/resolvers.js             |  62 +++++++++++----
 src/graphql/typeDefs/actions.js      |  10 ++-
 src/graphql/typeDefs/objects.js      |   6 --
 5 files changed, 178 insertions(+), 31 deletions(-)
 create mode 100644 db/seeds/07_make_event.js

diff --git a/db/seeds/07_make_event.js b/db/seeds/07_make_event.js
new file mode 100644
index 0000000..f0439c8
--- /dev/null
+++ b/db/seeds/07_make_event.js
@@ -0,0 +1,19 @@
+
+exports.seed = function(knex, Promise) {
+  // Deletes ALL existing entries
+  return knex('events').del()
+    .then(function () {
+      // Inserts seed entries
+      return knex('events').insert([
+        {
+          id : 42,
+          title : "coder sigma",
+          content : "Tous ensemble pour faire du Dev. Que demander de plus ? (a part du sommeil)",
+          start_time : knex.fn.now(),
+          end_time : knex.fn.now(),
+          authors : [],
+          is_announcement : false
+        }
+      ]);
+    });
+};
diff --git a/src/graphql/connectors/connectors.js b/src/graphql/connectors/connectors.js
index 4d721e5..7ec2692 100644
--- a/src/graphql/connectors/connectors.js
+++ b/src/graphql/connectors/connectors.js
@@ -266,9 +266,13 @@ export async function createGroupIfLegal(user, args){
  * @return {Promise(Object)} Retour de requête knex. Toutes les requêtes destinées au groupe.
  * @rights admin(recipientUID)
  */
-export function getUserJoinGroupRequests(user, recipientUID){
-    return knex.select('id', 'useruid', 'message').from('user_join_group')
+export async function getUserJoinGroupRequests(user, recipientUID){
+    let result = knex.select('id', 'useruid', 'message').from('user_join_group')
         .where('recipient', recipientUID);
+    return result.map( obj => {
+        obj.type = "UserJoinGroup";
+        return obj;
+    });
 }
 
 /**
@@ -282,9 +286,13 @@ export function getUserJoinGroupRequests(user, recipientUID){
  * @return {Promise(Object)} Retour de requête knex. Toutes les requêtes destinées au groupe.
  * @rights speaker(recipientUID)
  */
-export function getGroupJoinEventRequests(user, recipientUID){
-    return knex.select('id', 'senderuid', 'eventuid', 'message').from('group_join_event')
+export async function getGroupJoinEventRequests(user, recipientUID){
+    let result = await knex.select('id', 'senderuid', 'eventuid', 'message').from('group_join_event')
         .where('recipient', recipientUID);
+    return result.map( obj => {
+        obj.type = "GroupJoinEvent";
+        return obj;
+    });
 }
 
 
@@ -299,10 +307,14 @@ export function getGroupJoinEventRequests(user, recipientUID){
  * @return {Promise(Object)} Retour de requête knex. Toutes les requêtes destinées au groupe.
  * @rights speaker(recipientUID)
  */
-export const getYourGroupHostEventRequests = (user, recipientUID) => {
-    return knex.select('id', 'senderuid', 'eventuid', 'message').from('your_group_host_event')
+export async function getYourGroupHostEventRequests(user, recipientUID){
+    let result = await knex.select('id', 'senderuid', 'eventuid', 'message').from('your_group_host_event')
         .where('recipient', recipientUID);
-};
+    return result.map( obj => {
+        obj.type = "YourGroupHostEvent";
+        return obj;
+    });
+}
 
 
 //Don't forget the argument user is the guy who makes the request, not the user we want
@@ -426,6 +438,91 @@ export const getMetaGroup = (user, groupUID) => {
     return knex.select().from('meta_groups').where('uid',groupUID).then(results => results [0]);
 };
 
+export async function getEvent(user, eventID){
+    console.log(eventID);
+    let event_list = await knex('events').select().where('id', eventID);
+    console.log(event_list);
+    return event_list[0];
+}
+
+/**
+ * @summary Refuse une requête d'un groupe voulant rejoindre un évènement
+ * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. 
+ * @arg {Int} requestID - L'id de la requête à refuser. 
+ * @return {Promise(Boolean)} Vrai si l'opération a réussie;
+ * @rights admin(request.recipient)
+ */
+export async function denyGroupJoinEventRequest(user, requestID){
+    await knex('group_join_event').where('id', requestID).del();
+    return true;
+}
+
+/**
+ * @summary Refuse une requête d'un groupe voulant rejoindre un évènement
+ * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. 
+ * @arg {Int} requestID - L'id de la requête à refuser. 
+ * @return {Promise(Boolean)} Vrai si l'opération a réussie;
+ * @rights admin(request.recipient)
+ */
+export async function acceptGroupJoinEventRequest(user, requestID){
+    let request = await knex('group_join_event').select().where('id', requestID);
+    if( !request)
+        return false;
+    await knex('group_join_event').where('id', requestID).del();
+    let group = request[0].senderuid;
+    let event = request[0].eventuid;
+    await knex('group_participation').insert({
+        group : group,
+        message : event,
+        status : "join"
+    });
+    return;
+
+}
+
+
+/**
+ * @summary Refuse une requête d'un groupe voulant rejoindre un évènement
+ * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. 
+ * @arg {Int} requestID - L'id de la requête à refuser. 
+ * @return {Promise(Boolean)} Vrai si l'opération a réussie;
+ * @rights admin(request.recipient)
+ */
+export async function denyYourGroupHostEventRequest(user, requestID){
+    await knex('your_group_host_event').where('id', requestID).del();
+    return true;
+}
+
+/**
+ * @summary Refuse une requête d'un groupe voulant rejoindre un évènement
+ * @arg {Object} user - Représente l'utilisateur qui a effectué la requête. 
+ * @arg {Int} requestID - L'id de la requête à refuser. 
+ * @return {Promise(Boolean)} Vrai si l'opération a réussie;
+ * @rights admin(request.recipient)
+ */
+export async function acceptYourGroupHostEventRequest(user, requestID){
+    let request = await knex('your_group_host_event').select().where('id', requestID);
+    if( !request)
+        return false;
+    await knex('group_join_event').where('id', requestID).del();
+    let group = request[0].recipient;
+    let event = request[0].eventuid;
+    await knex('group_message_relationships').insert({
+        group : group,
+        message : event,
+        status : "host"
+    });
+    return;
+
+}
+
+export function takeAdminRights(user, groupUID, justification){
+    return knex('taken_rights').insert({
+        user_uid : user.uid,
+        group_uid : groupUID,
+        justification : justification
+    });
+}
 
 /**
  * @summary Renvoie les membres d'un groupe quelquonque.
@@ -491,7 +588,6 @@ export async function getGroupsFromCallbacks(user, cbList){
     return all_simple_groups.concat(all_meta_groups);
 }
 
-
 /*
  * réflexion sur une façon possible de gérer les utilisateurs sans en demander trop à LDAP
  * Sans utilité pour le moment, ne faites pas attention 
diff --git a/src/graphql/resolvers.js b/src/graphql/resolvers.js
index a55601e..6682c19 100644
--- a/src/graphql/resolvers.js
+++ b/src/graphql/resolvers.js
@@ -110,9 +110,11 @@ export const resolvers = {
             return true;
         },
 
-        allRequests: (obj, args, context) => {
-            console.log(obj);
-            return obj;
+        allRequests: async function(obj, args, context){
+            let ujg_requests = await connectors.getUserJoinGroupRequests(context.user, obj.groupUID);
+            let gje_requests = await connectors.getGroupJoinEventRequests(context.user, obj.groupUID);
+            let yghe_requests = await connectors.getYourGroupHostEventRequests(context.user, obj.groupUID);
+            return ujg_requests.concat(gje_requests).concat(yghe_requests);
         }
     },
 
@@ -128,19 +130,19 @@ export const resolvers = {
         }
     },
 
-    // @rights admin(obj.groupUID)
-    AllRequests: {
-        userJoinGroup : (obj, args, context) => {
-            return connectors.getUserJoinGroupRequests(context.user, obj.groupUID);
-        },
+    SpeakerQuery: {
 
-        groupJoinEvent : (obj, args, context) => {
-            return connectors.getGroupJoinEventRequests(context.user, obj.groupUID);
-        },
+        allRequests: async function(obj, args, context){
+            let gje_requests = await connectors.getGroupJoinEventRequests(context.user, obj.groupUID);
+            let yghe_requests = await connectors.getYourGroupHostEventRequests(context.user, obj.groupUID);
+            return gje_requests.concat(yghe_requests);
+        }
+    },
 
-        yourGroupHostEvent : (obj, args, context) => {
-            return connectors.getYourGroupHostEventRequests(context.user, obj.groupUID);
-        },
+    Request : {
+        __resolveType : function(obj){
+            return obj.type;
+        }
     },
 
     // @rights admin(obj.groupUID)
@@ -196,6 +198,11 @@ export const resolvers = {
 
     // @rights user
     Mutation: {
+
+        asSuperviser : function (obj, args, context){
+            return {groupUID : args.groupUID, justification : "kes"};
+        },
+
         asAdmin: (obj, args, context) => {
             return connectors.hasAdminRights(context.user, args.groupUID).then(res => {
                 if(res)
@@ -232,7 +239,21 @@ export const resolvers = {
         }
     },
 
-    // @rights admin(group.UID)
+    // @rights : superviser(obj.groupUID)
+    SuperviserMutation: {
+
+        runAdminOperation : function (obj, args, context){
+            return obj;
+        },
+
+        takeAdminRights : async function(obj, args, context){
+            console.log(obj);
+            await connectors.takeAdminRights(context.user, obj.groupUID, obj.justification);
+            return connectors.getGroup(context.user, obj.groupUID);
+        }
+    },
+
+    // @rights admin(obj.groupUID)
     AdminMutation: {
         isAdmin: (obj, args, context) => {
             return true;
@@ -248,7 +269,7 @@ export const resolvers = {
         }
     },
 
-    // @rights viewer(group.UID)
+    // @rights viewer(obj.groupUID)
     ViewerMutation: {
         requestJoin: (obj, args, context) => {
             console.log(obj);
@@ -282,6 +303,15 @@ export const resolvers = {
     },
 
     Event: {
+
+        startTime : function(obj){
+            return obj.start_time;
+        },
+
+        endTime : function(obj){
+            return obj.end_time;
+        },
+
         asAnnouncement : function(obj, args, context){
             // le champ is_announcement indique si il existe une annonce qui va avec l'évènement
             // une ligne de la bdd events peut résoudre comme évènement ou comme annonce
diff --git a/src/graphql/typeDefs/actions.js b/src/graphql/typeDefs/actions.js
index 392c1ca..d0d4bd7 100644
--- a/src/graphql/typeDefs/actions.js
+++ b/src/graphql/typeDefs/actions.js
@@ -13,6 +13,7 @@ const RootTypes = `
     }
 
     type Mutation {
+        asSuperviser(groupUID: String): SuperviserMutation
         asAdmin(groupUID: String): AdminMutation
         asSpeaker(groupUID: String): SpeakerMutation
         asMember(groupUID: String): MemberMutation
@@ -23,6 +24,12 @@ const RootTypes = `
 `;
 
 const subMutations = `
+
+    type SuperviserMutation {
+        runAdminOperation : AdminMutation
+        takeAdminRights : Group
+    }
+
     type AdminMutation {
 
         isAdmin: Boolean
@@ -115,11 +122,12 @@ const subQueries = `
     # Requête à la base de donnée nécessitant d'être administrateur.
     type AdminQuery{
         isAdmin: Boolean
-        allRequests : AllRequests
+        allRequests : [Request]
     }
 
     type SpeakerQuery{
         isSpeaker: Boolean
+        allRequests : [Request]
     }
 
     type MemberQuery{
diff --git a/src/graphql/typeDefs/objects.js b/src/graphql/typeDefs/objects.js
index 3df330f..03b46e5 100644
--- a/src/graphql/typeDefs/objects.js
+++ b/src/graphql/typeDefs/objects.js
@@ -142,12 +142,6 @@ const Event = `
 `;
 
 const Requests = `
-    # Demandes effectuées au groupe.
-    type AllRequests {
-        userJoinGroup: [UserJoinGroup]
-        groupJoinEvent: [GroupJoinEvent]
-        yourGroupHostEvent: [YourGroupHostEvent]
-    }
 
     interface Request {
         # ID de la demande
-- 
GitLab