GraphQL: подписка не срабатывает при запуске мутации

Итак, я тестирую подписки на Graphcool и буду признателен за разъяснения, как именно они работают.

У меня есть отношения один ко многим из сообщений в комментариях:

схема

type Posts {
  caption: String!
  comments: [Comments!]! @relation(name: "PostsOnComments")
  createdAt: DateTime!
  displaysrc: String!
  id: ID!
  likes: Int
  updatedAt: DateTime!
}

type Comments {
  createdAt: DateTime!
  id: ID!
  posts: Posts @relation(name: "PostsOnComments")
  text: String!
  updatedAt: DateTime!
  user: String!
}

Подписка, которую я запускаю в Graphcool, выглядит следующим образом:

subscription CreatedDeletedComments {
 Comments(
    filter: {
      mutation_in: [CREATED, DELETED]
    }
  ) {
    mutation
    node {
      id
      user
      text
    }
  }
}

Если я запускаю следующее в своем приложении React, создается уведомление:

    return this.props.client.mutate({
      mutation: gql`
        mutation createComment ($id: ID, $textVal: String!, $userVal: String!) {
          createComments (postsId: $id, text: $textVal, user: $userVal){
            id
            text
            user
          }
        }
      `,
      variables: {
        "id": postID,
        "textVal": textVal,
        "userVal": userVal
       },
      // forceFetch: true,
    })

Но если я выполню следующее, удаленное уведомление не будет запущено:

    return this.props.client.mutate({
      mutation: gql`
        mutation removeComment ($id: ID!, $cid: ID!) {
          removeFromPostsOnComments (postsPostsId: $id, commentsCommentsId: $cid){
            postsPosts {
              id
              displaysrc
              likes
              comments {
                id
                text
                user
              }
            }
          }
        }
      `,
      variables: {
        "id": postID,
        "cid": commentID
       },
      // forceFetch: true,
    })

Что я здесь пропускаю?

1 ответ

Решение

С подпиской

subscription CreatedDeletedComments {
    Comments(
    filter: {
      mutation_in: [CREATED, DELETED]
    }
  ) {
    mutation
    node {
      id
      user
      text
    }
  }
}

Вы подписываетесь на создаваемые или удаляемые узлы комментариев. Однако с мутацией removeFromPostsOnComments, вы не удаляете узлы комментариев. Вместо этого вы только удаляете связь между постом и комментарием.

Вы можете настроить запрос на изменение, чтобы полностью удалить комментарий, а не отключать его от поста:

return this.props.client.mutate({
  mutation: gql`
    mutation removeComment ($cid: ID!) {
      deleteComment(id: $cid) {
        id
      }
    }
  `,
  variables: {
    "cid": commentID
   },
  // forceFetch: true,
})

Если вы не хотите полностью удалять комментарий, но по-прежнему хотите скрыть его в своем приложении, у вас может быть логическое поле deleted который действует как мягкий маркер удаления.

Тогда вы можете подписаться на UPDATED комментарии вместо DELETED комментарии и проверьте, если поле deleted был обновлен. Обратитесь к документации для получения дополнительной информации о том, как сделать это с updatedFields,

Подписки на отношения также уже являются частью нашей дорожной карты.

Другие вопросы по тегам