From 8aee1562349793dec3ffb9458ac08519f0f05e33 Mon Sep 17 00:00:00 2001
From: anatole <anatole.romon@polytechnique.edu>
Date: Sat, 3 Mar 2018 13:07:01 +0100
Subject: [PATCH] separation des SimpleGroup et MetaGroup

---
 src/graphql/schema.js   |  51 ++++++++++++++++----
 src/graphql/typeDefs.js | 100 ++++++++++++++++++++++++++++------------
 2 files changed, 114 insertions(+), 37 deletions(-)

diff --git a/src/graphql/schema.js b/src/graphql/schema.js
index 0d96a92..18ff58c 100644
--- a/src/graphql/schema.js
+++ b/src/graphql/schema.js
@@ -25,12 +25,42 @@ const resolvers = {
             });
         },
 
+        accessGroups: (obj, args, context) => {
+            return {};
+        },
+
+        accessPosts: (obj, args, context) => {
+            return {};
+        },
+
+        accessUsers: (obj, args, context) => {
+            return {};
+        },
+    },
+
+    GroupQuery : {
         allGroups: (obj, args, context) => {
             return db_utils.getAllVisibleGroups(context.user);
         },
         group: (obj, args, context) => {
             return db_utils.getGroupIfVisible(context.user, args.uid);
         },
+        simpleGroup: (obj, args, context) => {
+            return db_utils.getGroupIfVisible(context.user, args.uid);
+        }
+    },
+
+    PostQuery : {
+        allPosts: (obj, args, context) => {
+            return knex.select().from('posts');
+        },
+        post: (obj, args, context) => {
+            const result = knex.select().from('posts').where('id','=',args.id);
+            return result.then((res) => res[0]);
+        },
+    },
+
+    UserQuery: {
         user: (obj, args, context) => {
             const refactorer = (data) => {
                 return {
@@ -52,14 +82,6 @@ const resolvers = {
             return result;
         },
 
-        allPosts: (obj, args, context) => {
-            return knex.select().from('posts');
-        },
-        post: (obj, args, context) => {
-            const result = knex.select().from('posts').where('id','=',args.id);
-            return result.then((res) => res[0]);
-        },
-
         searchTOL: (obj, args, context) => {
             console.log(args);
             return db_utils.repliquerTOLdesIds(context.user, {
@@ -238,11 +260,24 @@ const resolvers = {
     },
 
     Group: {
+        __resolveType: (obj) => {
+            if(obj.isSpiritual)
+                return "MetaGroup";
+            else
+                return "SimpleGroup";
+        }
+    },
+
+    SimpleGroup: {
+
         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);
         }
+    },
+
+    MetaGroup: {
     }
 };
 
diff --git a/src/graphql/typeDefs.js b/src/graphql/typeDefs.js
index 665461f..0ee5189 100644
--- a/src/graphql/typeDefs.js
+++ b/src/graphql/typeDefs.js
@@ -1,35 +1,15 @@
 const RootTypes = `
     # Requêtes
     type Query {
-        allGroups: [Group]
-        group(uid: ID) : Group
-        user(uid: ID) : User
-        allMessages: [Message]
-        allEvents: [Event]
-        allPosts: [Post]
-        post(id: ID): Post
-        allAnnouncements: [Announcement]
+        accessGroups : GroupQuery
+        accessPosts : PostQuery
+        accessUsers : UserQuery
 
         asAdmin(groupUID: ID): AdminQuery
         asSpeaker(groupUID: ID): AdminQuery
         asMember(groupUID: ID): AdminQuery
         asViewer(groupUID: ID): AdminQuery
         
-        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 {
@@ -86,6 +66,44 @@ const subMutations = `
 `;
 
 const subQueries = `
+
+    type GroupQuery{
+        allGroups: [Group]
+        group(uid: ID) : Group
+        simpleGroup(uid : ID) : SimpleGroup
+        metaGroup(uid : ID) : MetaGroup
+
+    }
+
+    type PostQuery{
+        allMessages: [Message]
+        allEvents: [Event]
+        allPosts: [Post]
+        post(id: ID): Post
+        allAnnouncements: [Announcement]
+    }
+
+    type UserQuery{
+
+        user(uid: ID) : User
+
+        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]
+    }
+
     # Requête à la base de donnée nécessitant d'être administrateur.
     type AdminQuery{
         isAdmin: Boolean
@@ -126,24 +144,48 @@ const User = `
 
 const Group = `
     # Groupes associatifs
-    type Group {
-        # Identifiant unique du groupe
+
+    interface Group {
+        # Identifiant unique de l'union
         uid: ID
-        # Nom du groupe
+        # Nom de l'union
         name: String
         # Site du groupe
         website: String
+        # Le groupe est-il un spiritualGroup (sinon c'est un materialGroup)
+        createdAt: String!
+        updatedAt: String!
+
+    }
+
+    type SimpleGroup implements Group{
+        uid: ID
+        name: String
+        website: String
+        createdAt: String!
+        updatedAt: String!
+
         # Membres du groupe
         members: [User]
         # Jour et heure de création du groupe
-        createdAt: String!
-        updatedAt: String!
         description: String
         # École d'origine du groupe
         school: String
         # Groupe parent
         parent: Group
     }
+
+    type MetaGroup implements Group {
+        uid: ID
+        name: String
+        website: String
+        createdAt: String!
+        updatedAt: String!
+
+        # Les membres sont des groupes
+        groupMembers: [Group]!
+    }
+
 `;
 
 const Message = `
@@ -240,7 +282,7 @@ const Requests = `
 
     # Demande au récipiendaire de rejoindre l'organisation d'un événement.
     type YourGroupHostEvent implements Request{
-        requestID: ID
+        id: ID!
         message: String
         # Événement concerné
         event: Event
-- 
GitLab