Class: GraphQL::Schema::Directive::Feature

Inherits:
GraphQL::Schema::Directive show all
Defined in:
lib/graphql/schema/directive/feature.rb

Overview

An example directive to show how you might interact with the runtime.

This directive might be used along with a server-side feature flag system like Flipper.

With that system, you could use this directive to exclude parts of a query if the current viewer doesn’t have certain flags enabled. (So, this flag would be for internal clients, like your iOS app, not third-party API clients.)

To use it, you have to implement .enabled?, for example:

Examples:

Implementing the Feature directive

# app/graphql/directives/feature.rb
class Directives::Feature < GraphQL::Schema::Directive::Feature
  def self.enabled?(flag_name, _obj, context)
    # Translate some GraphQL data for Ruby:
    flag_key = flag_name.underscore
    current_user = context[:viewer]
    # Check the feature flag however your app does it:
    MyFeatureFlags.enabled?(current_user, flag_key)
  end
end

Flagging a part of the query

viewer {
  # This field only runs if `.enabled?("recommendationEngine", obj, context)`
  # returns true. Otherwise, it's treated as if it didn't exist.
  recommendations @feature(flag: "recommendationEngine") {
    name
    rating
  }
}

Constant Summary

Constants inherited from GraphQL::Schema::Directive

DEFAULT_DEPRECATION_REASON, LOCATIONS, LOCATION_DESCRIPTIONS

Constants included from Member::GraphQLTypeNames

Member::GraphQLTypeNames::Boolean, Member::GraphQLTypeNames::ID, Member::GraphQLTypeNames::Int

Class Method Summary collapse

Methods inherited from GraphQL::Schema::Directive

default_directive, default_directive?, default_graphql_name, locations, on_field?, on_fragment?, on_operation?, resolve, static_include?, to_graphql

Methods included from Member::HasArguments

#add_argument, #argument, #argument_class, #arguments, #own_arguments

Methods included from Member::HasAstNode

#ast_node

Methods included from Member::HasPath

#path

Methods included from Member::RelayShortcuts

#connection_type, #connection_type_class, #edge_type, #edge_type_class

Methods included from Member::Scoped

#scope_items

Methods included from Member::TypeSystemHelpers

#kind, #list?, #non_null?, #to_list_type, #to_non_null_type, #to_type_signature

Methods included from Member::BaseDSLMethods::ConfigurationExtension

#inherited

Methods included from Member::BaseDSLMethods

#accessible?, #authorized?, #default_graphql_name, #description, #graphql_name, #introspection, #introspection?, #mutation, #name, #overridden_graphql_name, #to_graphql, #visible?

Methods included from Relay::TypeExtensions

#connection_type, #define_connection, #define_edge, #edge_type

Methods included from Member::CachedGraphQLDefinition

#graphql_definition, #initialize_copy, #type_class

Class Method Details

.enabled?(flag_name, object, context) ⇒ Boolean

Override this method in your app’s subclass of this directive.

Parameters:

  • flag_name (String)

    The client-provided string of a feature to check

  • object (GraphQL::Schema::Objct)

    The currently-evaluated GraphQL object instance

  • context (GraphQL::Query::Context)

Returns:

  • (Boolean)

    If truthy, execution will continue

Raises:



60
61
62
# File 'lib/graphql/schema/directive/feature.rb', line 60

def self.enabled?(flag_name, object, context)
  raise GraphQL::RequiredImplementationMissingError, "Implement `.enabled?(flag_name, object, context)` to return true or false for the feature flag (#{flag_name.inspect})"
end

.include?(object, arguments, context) ⇒ Boolean

Implement the Directive API

Returns:



49
50
51
52
# File 'lib/graphql/schema/directive/feature.rb', line 49

def self.include?(object, arguments, context)
  flag_name = arguments[:flag]
  self.enabled?(flag_name, object, context)
end