GraphQL, как сделать две отдельные (связанные) мутации одновременно, имея отношения и имея дело с массивами - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть две отдельные схемы мутаций, сообщения и теги

const Mutations = new GraphQLObjectType({
  name: 'Mutation',
  fields: {
    addPost: {
      type: PostType,
      args: {
        title: {type: new GraphQLNonNull(GraphQLString)},
        description: {type: new GraphQLNonNull(GraphQLString)},
        userId: {type: GraphQLString},
      },
      resolve(parentValue, {title, description}) {
        return axios
          .post(`http://localhost:3000/posts`, {title, description})
          .then(res => res.data);
      },
    },
    addTag: {
      type: TagType,
      args: {
        name: {type: new GraphQLNonNull(GraphQLString)},
        postId: {type: GraphQLString},
      },
      resolve(parentValue, {name, reps, sets}) {
        return axios
          .post(`http://localhost:3000/tags`, {name})
          .then(res => res.data);
      },
    },
  },
});

В интерфейсе Graphiql я могу сделать это:

mutation AddPostsAndTags($title:String!, $description:String!, $name:String!){
  addPost(title:$title, description: $description){
    id,
    title
    description
  }
  addTag(name: $name) {
    id
    name
  }
}

Учитывая эти переменные запроса:

{
  "title": "hello",
  "description": "description",
  "name": "tag1",
}

Я получаю:

{
  "data": {
    "addPost": {
      "id": "1H8tBIH",
      "title": "hello",
      "description": "description"
    },
    "addTag": {
      "id": "x4WGo4S",
      "name": "name of tag"
    }
  }
}

Однако эти две коллекции не знают друг друга, потому что внутри объекта addTag нет postId. Как настроить мутацию так, чтобы при создании они имели отношение.

Кроме того, переменные запроса принимают только 1 тег, что произойдет, если у меня несколько тегов? Нужно ли настраивать мою схему мутаций по-другому? Со стороны моего реагирующего клиента, я в конечном итоге получу состояние массива объектов тегов:

tags: [
  { name: "tag1" },
  { name: "tag2" },
  { name: "tag3" },
]

И это нужно будет отправить в GraphQL через схему мутаций со связанными постами.

...