From dfafe1ddabf199dd75ea7201af220757a934c688 Mon Sep 17 00:00:00 2001
From: anatole <anatole.romon@polytechnique.edu>
Date: Thu, 12 Apr 2018 20:12:36 +0200
Subject: [PATCH] Les resolvers peuvent maintenant trouver les auteurs d'un
 message

---
 db/seeds/02_make_posts.js            |  4 +--
 db/seeds/07_make_event.js            | 37 +++++++++++++----------
 src/graphql/connectors/connectors.js | 18 +++++++++--
 src/graphql/connectors/selectors.js  |  6 ++--
 src/graphql/resolvers.js             | 35 +++++++++++++---------
 src/graphql/typeDefs/actions.js      |  2 ++
 src/graphql/typeDefs/objects.js      | 45 ++++++++++++++++++++++++----
 7 files changed, 106 insertions(+), 41 deletions(-)

diff --git a/db/seeds/02_make_posts.js b/db/seeds/02_make_posts.js
index c17781b..1a7eeb0 100644
--- a/db/seeds/02_make_posts.js
+++ b/db/seeds/02_make_posts.js
@@ -1,7 +1,7 @@
 
 exports.seed = function(knex, Promise) {
   // Deletes ALL existing entries
-  return knex('posts').del()
+  return knex('announcements').del()
     .then(function () {
       const posts = [{
         title: "Fissurer c'est bien",
@@ -21,6 +21,6 @@ exports.seed = function(knex, Promise) {
         authors: ['br']
       }];
 
-      return knex('posts').insert(posts);
+      return knex('announcements').insert(posts);
     });
 };
diff --git a/db/seeds/07_make_event.js b/db/seeds/07_make_event.js
index f0439c8..d743087 100644
--- a/db/seeds/07_make_event.js
+++ b/db/seeds/07_make_event.js
@@ -1,19 +1,26 @@
 
-exports.seed = function(knex, Promise) {
+exports.seed = async function(knex, Promise) {
   // Deletes ALL existing entries
-  return knex('events').del()
-    .then(function () {
+  await knex('events').del()
       // 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
-        }
-      ]);
-    });
+  await 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
+    }
+  ]);
+
+  return knex('group_message_relationships').insert([
+    {
+      message : 42,
+      group : 'br',
+      status : 'host'
+    }
+  ]);
+    
 };
diff --git a/src/graphql/connectors/connectors.js b/src/graphql/connectors/connectors.js
index 5a904d0..80e4c8e 100644
--- a/src/graphql/connectors/connectors.js
+++ b/src/graphql/connectors/connectors.js
@@ -75,7 +75,7 @@ const quickPromise = (val) => {
 
 /**
  * @summary Renvoie le nom de la table dans laquelle il faut chercher en fonction de ce qu'on veut
- * @desc a remplir
+ * @desc Ceci est obsolète, et devra être supprimé quand le code sera RAS
  * @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.
  */
@@ -385,9 +385,21 @@ export async function getMessageIfVisible(user, messageID){
     return undefined;
 }
 
+export async function getMessageAuthor(user, messageID){
+    let GroupAuthors = await getGroupsFromCallbacks(user, qb  => {
+        return qb.select({uid: 'group'}).from('group_message_relationships')
+          .where('message', messageID).whereIn('status', ['host', 'publish'])
+        })
+    let authorObject = Object()
+    if(GroupAuthors.length == 1)
+        authorObject.singleGroup = GroupAuthors[0]
+    else
+        authorObject.multipleGroups = GroupAuthors
+
+    return authorObject
+}
 
-
-export async function getMessageHosts(user, messageID){
+export async function getMessageRecipient(user, messageID){
 
 }
 
diff --git a/src/graphql/connectors/selectors.js b/src/graphql/connectors/selectors.js
index 9cde12e..40afa3a 100644
--- a/src/graphql/connectors/selectors.js
+++ b/src/graphql/connectors/selectors.js
@@ -65,13 +65,15 @@ export async function visibleEvents(user){
 
 export async function messageHosts(user, messageID){
     return function(query_builder){
-        return query_builder.select('group').as('uid').from('group_message_relationships')
-            .where('message', messageID);
+        return query_builder.select({uid : 'group'}).from('group_message_relationships')
+            .where('message', messageID).where('status', 'host');
     };
 }
 
 //Give a group, get the users linked to that group
 
+//Give a group, get the users linked to that group
+
 /**
  * @summary Renvoie un callback qui génère tous les membres d'un meta-groupe.
  * @param {Object} user - Utilisateur effectuant la requête.
diff --git a/src/graphql/resolvers.js b/src/graphql/resolvers.js
index 040650a..5ce33b5 100644
--- a/src/graphql/resolvers.js
+++ b/src/graphql/resolvers.js
@@ -50,13 +50,6 @@ export const resolvers = {
         /*
          * Message queries.
          */
-        allPosts: function(obj, args, context) {
-            return knex.select().from("posts");
-        },
-
-        post: function (obj, args, context) {
-            return knex.select().from("posts").where('id',args.id).then(res => res[0]);
-        },
 
         allAnnouncements: function(obj, args, context) {
             return knex.select().from("announcements");
@@ -117,8 +110,11 @@ export const resolvers = {
                 res = res.concat(await connectors.getYourGroupHostEventRequests(user, args.from));
             }
             return res;
-        }
+        },
 
+        test: async function(obj, args, context){
+            return connectors.getSimpleGroup(context.user, "br")
+        }
     },
 
 
@@ -203,17 +199,12 @@ export const resolvers = {
 
     },
 
+
     Message: {
 
         __resolveType: function(obj) {
             return obj.type;
-        }
-
-    },
 
-    Post: {
-        authors: (obj, args, context) => {
-            return knex.select().from('groups').whereIn('uid', obj.authors);
         }
     },
 
@@ -225,6 +216,14 @@ export const resolvers = {
                 return obj;
             else
                 return null;
+        },
+
+        authors: async function (obj, args, context){
+            return connectors.getMessageAuthor(context.user, obj.id)
+        },
+
+        recipient: async function (obj, args, context){
+            return connectors.getMessageRecipient(context.user, obj.id)
         }
     },
 
@@ -245,6 +244,14 @@ export const resolvers = {
                 return obj;
             else
                 return null;
+        },
+
+        authors: async function (obj, args, context){
+            return connectors.getMessageAuthor(context.user, obj.id)
+        },
+
+        recipient: async function (obj, args, context){
+            return connectors.getMessageRecipient(context.user, obj.id)
         }
     },
 
diff --git a/src/graphql/typeDefs/actions.js b/src/graphql/typeDefs/actions.js
index 6204df4..e5858ae 100644
--- a/src/graphql/typeDefs/actions.js
+++ b/src/graphql/typeDefs/actions.js
@@ -53,6 +53,8 @@ const RootTypes = `
         allMembers(from : String!) : [Group]
 
         # Viewer Queries
+        
+        test : Author
 
     }
 
diff --git a/src/graphql/typeDefs/objects.js b/src/graphql/typeDefs/objects.js
index fb5cf7f..7c4b487 100644
--- a/src/graphql/typeDefs/objects.js
+++ b/src/graphql/typeDefs/objects.js
@@ -79,7 +79,34 @@ const Group = `
 `;
 
 const Message = `
-    # Tout type de message créé par un ou plusieurs groupes.
+
+# Tout type de message adressé à un ou plusieurs groupes.
+
+    # Auteur possible d'un Message
+    # union AuthorUnion = Group | [Group] | User
+    # union RecipientUnion = Group | [Group]
+
+    # Les unions sont assez faibles dans GraphQL, 
+    # elles n'acceptent pas les listes ni les interfaces
+    # Créer un nouveau type est la meilleur solution que j'ai trouvé
+    
+    type Author {
+        singleGroup: Group
+        multipleGroups: [Group]
+        singleUser: User
+    }
+    
+    type Recipient {
+        singleGroup: Group
+        multipleGroups: [Group]
+    }
+
+    # L'interface Message représente toute information que veut communiquer un groupe ou un user.
+    # Par choix de paradigme, tout Message est adressé à un (ou des) groupe(s).
+    # Les types implémentés sont divisés en deux :
+    # - les Message émanant d'un groupe : Announcement et Event, ainsi que Answer
+    # - les Message émanant d'un user : PrivatePost, ainsi que Question
+
     interface Message {
         id: ID!
         # Titre du message
@@ -87,8 +114,10 @@ const Message = `
         content: String
         createdAt: String!
         updatedAt: String!
+
         # Auteur(s) du message
-        authors: [Group]
+        authors: Author
+        recipient: Recipient
     }
 
     # Publication postée par un ou plusieurs groupes.
@@ -97,8 +126,10 @@ const Message = `
         title: String!
         createdAt: String!
         updatedAt: String!
-        authors: [Group]
         content: String!
+
+        authors: Author
+        recipient: Recipient
     }
 
     # Annonce publique effectuée par un ou plusieurs groupes.
@@ -107,11 +138,13 @@ const Message = `
         title: String!
         createdAt: String!
         updatedAt: String!
-        authors: [Group]
         content: String!
         importance: Int
         views: Int
         forEvent : Event
+
+        authors: Author
+        recipient: Recipient
     }
 
     # Événements organisés par un ou plusieurs groupes.
@@ -126,12 +159,14 @@ const Message = `
         startTime: String!
         endTime: String!
         # Organisateurs
-        authors: [Group]
         # Personnes qui participent à l'événement.
         participatingGroups: [Group]
         participatingUsers: [User]
         content: String
         asAnnouncement : Announcement
+
+        authors: Author
+        recipient: Recipient
     }
 `;
 
-- 
GitLab