Добавить параметр фильтрации в запрос с разбивкой на страницы graphql

Я использую этот замечательный apollo-universal-starter-kit в одном из своих проекты. У меня есть задача добавить параметр фильтрации на эту страницу для фильтрации сообщений, которые есть более 2-х комментариев.

В стартовом наборе используется Apollo graphql-server в качестве внутреннего интерфейса. Описание схемы постов выглядит так:

# Post
type Post {
  id: Int!
  title: String!
  content: String!
  comments: [Comment]
}

# Comment
type Comment {
  id: Int!
  content: String!
}

# Edges for PostsQuery
type PostEdges {
  node: Post
  cursor: Int
}

# PageInfo for PostsQuery
type PostPageInfo {
  endCursor: Int
  hasNextPage: Boolean
}

# Posts relay-style pagination query
type PostsQuery {
  totalCount: Int
  edges: [PostEdges]
  pageInfo: PostPageInfo
}

extend type Query {
  # Posts pagination query
  postsQuery(limit: Int, after: Int): PostsQuery
  # Post
  post(id: Int!): Post
}

postsQuery используется для создания результатов постраничных публикаций.

Вот как разрешается postsQuery (полный код здесь)

async postsQuery(obj, { limit, after }, context) {
      let edgesArray = [];
      let posts = await context.Post.getPostsPagination(limit, after);

      posts.map(post => {
        edgesArray.push({
          cursor: post.id,
          node: {
            id: post.id,
            title: post.title,
            content: post.content,
          }
        });
      });

      let endCursor = edgesArray.length > 0 ? edgesArray[edgesArray.length - 1].cursor : 0;

      let values = await Promise.all([context.Post.getTotal(), context.Post.getNextPageFlag(endCursor)]);

      return {
        totalCount: values[0].count,
        edges: edgesArray,
        pageInfo: {
          endCursor: endCursor,
          hasNextPage: values[1].count > 0
        }
      };
    }

И вот запрос graphql, который используется во внешнем интерфейсе с компонентом React post_list (полный код для компонента: здесь)

query getPosts($limit: Int!, $after: ID) {
    postsQuery(limit: $limit, after: $after) {
        totalCount
        edges {
            cursor
            node {
                ... PostInfo
            }
        }
        pageInfo {
            endCursor
            hasNextPage
        }
    }
}

Это было долгое вступление :-), извините

Вопрос:

Как добавить параметр фильтрации к post_list компоненту / странице? Я вроде понимаю сторону React вопроса, но я не понимаю graphql. Должен ли я добавить новую переменную в postsQuery(limit: $limit, after: $after), чтобы она выглядела как postsQuery(limit: $limit, after: $after, numberOfComments: $numberOfComments)? А потом как-нибудь разрешить на бекенде? Или я ошибаюсь и должен думать в другом направлении? Если да, можете ли вы указать мне правильное направление? :-)

Заранее спасибо!


person SaidAkh    schedule 28.06.2017    source источник


Ответы (1)


ИМО, я определенно решил бы это на бэкэнде. Что касается того, должна ли это быть новая переменная, я лично сказал бы да, и ваш Post.getPostsPagination может быть обновлен для поддержки фильтрации по количеству комментариев, в идеале вы хотите, чтобы это было частью запроса БД, чтобы вы знали, что вы получить количество N типов сообщений, которые вы хотите, иначе это откроет дверь для крайних случаев в вашей разбивке на страницы.

Другой вариант - это новый запрос для CuratedPosts или FilteredPosts, или как вы хотите его назвать, который уже знает, как фильтровать по количеству комментариев.

person kkemple    schedule 28.06.2017