Пользовательский тип сортировки GraphQL

У меня есть графическое окружение приложения для голосования, есть пользователи, опросы и голоса. У меня есть в моем основном запросе в схеме запрос для всех опросов в моем приложении (с возможностью ограничения и т. Д.), У меня также есть поле опросов для каждого пользователя, я хочу, чтобы все опросы можно было сортировать используя мою собственную бизнес-логику (например, большинство голосов, последние и т. д.), я бы предпочел не определять логику сортировки для каждого поля опросов и сделать тип сортируемым в целом. Как это может быть сделано?

Это мой код, в настоящее время я использую только фиктивную базу данных для тестирования и выяснения, какая схема мне нужна. А теперь к GQL.

userType = new GraphQLObjectType({
  name: 'User',
  description: 'Registered user',
  fields: (() => ({
    id: {
      type: new GraphQLNonNull(GraphQLID)
    },
    email: {
      type: GraphQLString
    },
    password: {
      type: GraphQLString
    },
    username: {
      type: GraphQLString
    },
    polls: { // this should be sortable
      type: new GraphQLList(pollType),
      resolve: user => db.getUserPolls(user.id)
    },
    votes: {
      type: new GraphQLList(voteType),
      resolve: user => db.getUserVotes(user.id)
    }
  })),
  resolve: id => db.getUsers()[id]
});

pollType = new GraphQLObjectType({
  name: 'Poll',
  description: 'Poll which can be voted by registered users',
  fields: () => ({
    id: {
      type: new GraphQLNonNull(GraphQLID)
    },
    title: {
      type: GraphQLString
    },
    options: {
      type: new GraphQLList(GraphQLString),
    },
    votes: {
      type: new GraphQLList(voteType),
      resolve: poll => db.getPollVotes(poll.id)
    },
    author: {
      type: userType,
      resolve: poll => db.getPollAuthor(poll.id)
    },
    timestamp: {
      type: GraphQLDate
    }
  })
});

voteType = new GraphQLObjectType({
  name: 'Vote',
  description: 'User vote on a poll',
  fields: () => ({
    id: {
      type: new GraphQLNonNull(GraphQLID)
    },
    user: {
      type: userType,
      resolve: vote => db.getVoteUser(vote.id)
    },
    poll: {
      type: pollType,
      resolve: vote => db.getVotePoll(vote.id)
    },
    vote: {
      type: GraphQLInt
    },
    timestamp: {
      type: GraphQLDate
    }
  })
});

let schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: () => ({
      user: {
        type: userType,
        args: {
          id: {
            type: new GraphQLNonNull(GraphQLID)
          }
        },
        resolve: (root, {id}) => db.getUsers()[id]
      },
      polls: { //this should also be sorted
        type: new GraphQLList(pollType),
        resolve: () => db.getPolls()
      },
      votes: {
        type: new GraphQLList(voteType),
        resolve: () => db.getVotes()
      }
    })
  })
});

person Gershon Papi    schedule 20.06.2016    source источник


Ответы (2)


Вы можете попробовать создать тип Sortable с настраиваемыми полями сортировки, которые вы хотите использовать в качестве полей ввода, и сделать тип опроса списком, реализующим интерфейс Sortable.

person vince    schedule 20.06.2016

Я не уверен, что вы пытаетесь сделать, но, возможно, это поможет вам: https://github.com/javascriptiscoolpl/graphQL-tinySQL (проверьте там папку команд и файл sortBy.js)

person javascript.iscool.pl    schedule 22.06.2016