Skip to content
GraphQL plugin for SearchObject gem
Ruby
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
example
lib/search_object/plugin
spec
.gitignore
.projections.json
.rspec
.rubocop.yml
.ruby-version
.travis.yml Add more ruby versions for travis ci Jan 13, 2019
CHANGELOG.md
Gemfile Bundle update for the gem Jan 13, 2019
LICENSE.txt
README.md
Rakefile
search_object_graphql.gemspec

README.md

Gem Version Code Climate Build Status Code coverage

SearchObject::Plugin::GraphQL

SearchObject plugin for GraphQL Ruby.

Table of Contents

Installation

Add this line to your application's Gemfile:

gem 'search_object_graphql'

And then execute:

$ bundle

Or install it yourself as:

$ gem install search_object_graphql

Require manually in your project

require 'search_object'
require 'search_object/plugin/graphql'

Dependencies

  • SearchObject >= 1.2
  • Graphql >= 1.5

Usage

Just include the SearchObject.module and define your search options and their types:

class PostResolver
  include SearchObject.module(:graphql)

  type [PostType], null: false

  scope { Post.all }

  option(:name, type: String)       { |scope, value| scope.where name: value }
  option(:published, type: Boolean) { |scope, value| value ? scope.published : scope.unpublished }
end

Then you can just use PostResolver as GraphQL::Schema::Resolver:

field :posts, resolver: PostResolver

Options are exposed as arguments in the GraphQL query:

posts(name: 'Example') { ... }
posts(published: true) { ... }
posts(published: true, name: 'Example') { ... }

Example

You can find example of most important features and plugins - here.

Features

Documentation

Search object itself can be documented, as well as its options:

class PostResolver
  include SearchObject.module(:graphql)

  description 'Lists all posts'

  option(:name, type: types.String, description: 'Fuzzy name matching') { ... }
  option(:published, type: types.Boolean, description: 'Find published/unpublished') { ... }
end

Default Values

class PostResolver
  include SearchObject.module(:graphql)

  scope { Post.all }

  option(:published, type: types.Boolean, default: true) { |scope, value| value ? scope.published : scope.unpublished }
end

Accessing Parent Object

Sometimes you want to scope posts based on parent object, it is accessible as object property:

class PostResolver
  include SearchObject.module(:graphql)

  # lists only posts from certain category
  scope { object.posts }

  # ...
end

If you need GraphQL context, it is accessible as context.

Enums Support

class PostSearch
  include SearchObject.module(:graphql)

  OrderEnum = GraphQL::EnumType.define do
    name 'PostOrder'

    value 'RECENT'
    value 'VIEWS'
    value 'COMMENTS'
  end

  option :order, type: OrderEnum, default: 'RECENT'

  def apply_order_with_recent(scope)
    scope.order 'created_at DESC'
  end

  def apply_order_with_views(scope)
    scope.order 'views_count DESC'
  end

  def apply_order_with_comments(scope)
    scope.order 'comments_count DESC'
  end
end

Relay Support

Search objects can be used as Relay Connections:

class PostResolver
  include SearchObject.module(:graphql)

  type PostType.connection_type, null: false

  # ...
end
field :posts, resolver: PostResolver

Legacy Function Support

class PostResolver
  include SearchObject.module(:graphql)

  type [PostType], null: false

  # ...
end
field :posts, function: PostResolver

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Run the tests (rake)
  6. Create new Pull Request

License

MIT License

You can’t perform that action at this time.