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