Получить контекст внутри схемы GraphQL - PullRequest
1 голос
/ 31 октября 2019

Я использую graphql-ruby и пытаюсь защитить мутацию администратора в такой схеме

class MySchema < GraphQL::Schema

  mutation(Types::Admin::MutationType) if context[:current_user].admin?

  mutation(Types::MutationType)
  query(Types::QueryType)

end

, но у меня там нет контекста. Также пытался сделать то же самое в Types::Admin::MutationType, тот же результат.

Можно ли проверить контекст где-нибудь до разрешения?

1 Ответ

0 голосов
/ 01 ноября 2019

Один из лучших, если не самый лучший путеводитель, который я нашел, это здесь . Он предоставляет обширную документацию и руководства. Попробуйте использовать метод self.visible?(ctx). Я также чувствую, что вы боретесь с драгоценным камнем вместо того, чтобы работать с ним. Попробуйте реструктурировать ваш код, как описано ниже. С ним может быть проще работать.

объект context не присоединяется к схеме, пока к ней не будет вызван метод execute. Обычно это происходит в вашем файле app / controllers / graphql_controller.rb. В общем, вы не сможете получить доступ к объекту context, пока ваше приложение не выполнит вашу схему. Поскольку QueryType и MutationType присоединяются к нему после того, как вы захотите сделать следующее, предполагая, что вы использовали встроенный инструмент генерации кода.


# '/app/graphql/my_schema.rb'

class MySchema < GraphQL::Schema
  mutation(Types::MutationType)
  query(Types::QueryType)
end

# '/app/graphql/types/mutation_type.rb'
class Types::MutationType < Types::BaseObject
  field :some_admin_mutation, mutation: Mutations::Admin::SomeAdminMutation
end


# '/app/graphql/mutations/admin/some_admin_mutation.rb'
class Mutations::Admin::SomeAdminMutation < Mutations::BaseMutation
  ...

   # using this class method, you can choose to hide certain mutations
   def self.visible?(context)
      context[:current_user].admin?
   end
end

протестируйте его, используя следующий запрос graphql (я использую apollo для chrome)

{
  __schema {
    mutationType {
      name
      fields {
        name
      }
    }
  }
}
...