Pass argument child type graphql

I would like to know how can I pass an argument in "child" type. With the request, I would like to have only the message with id 1 from user id 1.

Currently I have this request :

{user(id:1){
  email,
  username,
  messages(id:1){
    text,
    id
  }
}}

I modified in the schema the User type, and changed

messages: [Message]

by

messages(id: Int): [Message]

But I have always all messages from user and not the message with specific id.

schema.js

import { gql } from 'apollo-server';

export const typeDefs = gql`

  # declare custom scalars
  scalar Date

  ##########
  ## TYPE ##
  ##########

  # a group
    type Group {
      id: Int!
      name: String
      users: [User]!
      messages: [Message]
    }

  # a user
  type User {
    id: Int! # unique id for the user
    email: String!
    username: String
    messages(id: Int): [Message]
    groups: [Group]
    friends: [User]
  }

  # a message sent from a user to a group
  type Message {
    id: Int!
    to: Group!
    from: User!
    text: String!
    createdAt: Date!
  }

  ###########
  ## QUERY ##
  ###########

  # query for types
  type Query {
    user(email: String, id: Int): User

    messages(groupId: Int, userId: Int): [Message]
  }

  schema {
    query: Query
  }
`;

export default typeDefs;

resolvers.js

import GraphQLDate from 'graphql-date';
import { Group, Message, User } from './connectors';

export const resolvers = {
    Date: GraphQLDate,
    Query: {
        group(_, args) {
            return Group.find({ where: args });
        },
        messages(_, args) {
            return Message.findAll({
                where: args,
                order: [['createdAt', 'DESC']],
            });
        },
        user(_, args) {
            return User.findOne({ where: args });
        },
    },
    Group: {
        users(group) {
            return group.getUsers();
        },
        messages(group) {
            return Message.findAll({
                where: { groupId: group.id },
                order: [['createdAt', 'DESC']],
            });
        },
    },
    Message: {
        to(message) {
            return message.getGroup();
        },
        from(message) {
            return message.getUser();
        },
    },
    User: {
        messages(user) {
            return Message.findAll({
                where: { userId: user.id },
                order: [['createdAt', 'DESC']],
            });
        },
        groups(user) {
            return user.getGroups();
        },
        friends(user) {
            return user.getFriends();
        },
    },
};

export default resolvers;

Upvotes: 1

Views: 691

Answers (1)

Roman Yankovsky
Roman Yankovsky

Reputation: 1217

You have to update User.messages resolver. This way:

User: {
        messages(user, { id }) {
            return Message.findAll({
                where: { userId: user.id, id },
                order: [['createdAt', 'DESC']],
            });
        },
        groups(user) {
            return user.getGroups();
        },
        friends(user) {
            return user.getFriends();
        },
    },

If you want to make id parameter optional, something like this may help:

    messages(user, { id }) {
        const where = { userId: user.id }
        if (id) {
          where.id = id
        }

        return Message.findAll({
            where,
            order: [['createdAt', 'DESC']],
        });
    },

Upvotes: 2

Related Questions