A Ember CLI adapter for using GraphQL with Ember Data.
ember install ember-graphql-adapter
Create your adapter first
// app/adapters/post.js
import GraphQLAdapter from 'ember-graphql-adapter';
export default GraphQLAdapter.extend({
endpoint: `${EmberENV.apiBaseUrl}/graph`
});
Now define your serializer
// app/serializers/post.js
import { Serializer } from 'ember-graphql-adapter';
export default Serializer.extend({});
And you're done!
- Queries and mutations are automatically generated for you
- Field aliases are supported
- Belongs to relationships are fully supported
- Has many relationships are fully supported
- Async relationships and request coalescing is supported with
coalesceFindRequests: true
By using the fantastic graphql gem, you can expose your relational database as a GraphQL endpoint.
We start by creating a new type
# app/models/graph/post_type.rb
module Graph
PostType = GraphQL::ObjectType.define do
name "Post"
description "A post"
field :id, types.ID
field :name, types.String
end
end
Then we create the query type
# app/models/graph/query_type.rb
module Graph
QueryType = GraphQL::ObjectType.define do
name "Query"
description "The query root of this schema"
field :post do
type PostType
argument :id, !types.ID, "The ID of the post"
resolve -> (obj, args, ctw) do
Post.find(args[:id])
end
end
end
end
After that, it's time for the mutation type
# app/models/graph/mutation_type.rb
module Graph
MutationType = GraphQL::ObjectType.define do
name "Mutation"
description "Mutations"
field :postCreate do
type PostType
argument :name, !types.String, "The post name"
resolve -> (obj, args, ctw) do
Post.create(name: args[:name])
end
end
end
end
Now, we can build the whole schema
# app/models/graph/schema.rb
module Graph
Schema = GraphQL::Schema.new(
query: Graph::QueryType,
mutation: Graph::MutationType
)
end
In the controller we just delegate to the GraphQL schema
# app/controllers/graph_controller.rb
class GraphController < ApplicationController
def index
render json: ::Graph::Schema.execute(
params.fetch("query"),
context: {} # you can pass the current_user here
)
end
end
Finally, we just expose the GraphQL endpoint in the route
# config/routes.rb
get 'graph', to: 'graph#index'
And that's it!
git clone https://github.com/alphasights/ember-graphql-adapter.git
npm install && bower install
ember server
ember test --server
ember build