Повторно использовать аргументы GraphQL в Ruby - PullRequest
4 голосов
/ 02 мая 2019

Я строю свой первый API-интерфейс GraphQL с использованием rails и гема graphql-ruby. Пока это было очень просто и просто потрясающе.

Я застрял сейчас в отношении дублирования кода. У меня есть приложение для управления проектами, в котором есть пробелы, задачи (они принадлежат пробелу), пользователи.

Чего я хочу добиться, так это уметь запрашивать пробелы и их задачи, а также, например, все задачи для текущего пользователя. Для задач я хочу иметь возможность фильтровать их, используя разные аргументы:

Готово - логическое значение, Область - Строка (сегодня или неделя), Assignee - Integer (Id пользователя)

query {
  space(id: 5) {
    todos(done: false) {
      name
      done
      dueAt
    }
  }
}


query {
  me {
    todos(done: false, scope: today) {
      name
      done
      dueAt
    }
  }
}

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

Я знаю, как использовать аргументы, и все работает отлично, но в настоящее время я получаю один и тот же кодер снова и снова. Как (и где) я могу извлечь этот код, чтобы его можно было повторно использовать каждый раз, когда у меня одно и то же поле задач?

field :todos, [TodoType], null: true do
  argument :done, Boolean, required: false
  argument :scope, String, required: false
  argument :limit, Integer, required: false
end

1 Ответ

0 голосов
/ 04 мая 2019

Хорошо, как @jklina также сказал, что я использовал собственный распознаватель.

Я изменил:

field :todos, [TodoType], null: true do
  argument :done, Boolean, required: false
  argument :scope, String, required: false
  argument :limit, Integer, required: false
end

до:

field :todos, resolver: Resolvers::Todos, description: "All todos that belong to a given space"

и добавил Resolver:

module Resolvers
  class Todos < Resolvers::Base
    type [Types::TodoType], null: false

    TodoScopes = GraphQL::EnumType.define do
      name "TodoScopes"
      description "Group of available scopes for todos"
      value "TODAY", "List all todos that are due to today", value: :today
      value "THISWEEK", "List all todos that are due to the end of the week", value: :this_week
    end

    argument :done, Boolean, required: false
    argument :scope, TodoScopes, required: false
    argument :limit, Integer, required: false
    argument :assignee_id, Integer, required: false

    def resolve(done: nil, scope:nil, limit:5000, assignee_id: nil)
      todos = object.todos

      # filtering the records...

      return todos.limit(limit)
    end
  end
end

Довольно просто!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...