Передать аргумент дочернего типа graphql - PullRequest
0 голосов
/ 26 марта 2019

Я хотел бы знать, как я могу передать аргумент типа "ребенок". С запросом хотелось бы получить только сообщение с идентификатором 1 от идентификатора пользователя 1.

В настоящее время у меня есть этот запрос:

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

Я изменил в схеме тип User, и изменил

messages: [Message]

от

messages(id: Int): [Message]

Но у меня всегда есть все сообщения от пользователя, а не сообщения с определенным идентификатором.

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;

1 Ответ

1 голос
/ 26 марта 2019

Вам необходимо обновить User.messages resolver.Таким образом:

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();
        },
    },

Если вы хотите сделать необязательный параметр id, может помочь что-то подобное:

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

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