⚡️ Pro Feature ⚡️ This feature is bundled with GraphQL-Pro.
To use GraphQL::Pro::OperationStore
with your app, follow these steps:
OperationStore
is supportedOperationStore
’s dataOperationStore
to your GraphQL schemaOperationStore
requires two gems in your application environment:
ActiveRecord
to access tables in your database. (Using another ORM or backend? Please open an issue to request support!)Rack
: to serve the Dashboard and Sync API. (In Rails, this is provided by config/routes.rb
.)These are bundled with Rails by default.
GraphQL::Pro::OperationStore
requires some database tables. You can add these with a migration:
$ rails generate migration SetupOperationStore
Then open the migration file and add:
# ...
# implement the change method with:
def change
create_table :graphql_clients, primary_key: :id do |t|
t.column :name, :string, null: false
t.column :secret, :string, null: false
t.timestamps
end
add_index :graphql_clients, :name, unique: true
add_index :graphql_clients, :secret, unique: true
create_table :graphql_client_operations, primary_key: :id do |t|
t.references :graphql_client, null: false
t.references :graphql_operation, null: false
t.column :alias, :string, null: false
t.timestamps
end
add_index :graphql_client_operations, [:graphql_client_id, :alias], unique: true, name: "graphql_client_operations_pairs"
create_table :graphql_operations, primary_key: :id do |t|
t.column :digest, :string, null: false
t.column :body, :text, null: false
t.column :name, :string, null: false
t.timestamps
end
add_index :graphql_operations, :digest, unique: true
create_table :graphql_index_entries, primary_key: :id do |t|
t.column :name, :string, null: false
end
add_index :graphql_index_entries, :name, unique: true
create_table :graphql_index_references, primary_key: :id do |t|
t.references :graphql_index_entry, null: false
t.references :graphql_operation, null: false
end
add_index :graphql_index_references, [:graphql_index_entry_id, :graphql_operation_id], unique: true, name: "graphql_index_reference_pairs"
end
OperationStore
To hook up the storage to your schema, add the plugin:
class MySchema < GraphQL::Schema
# ...
use GraphQL::Pro::OperationStore
end
To use OperationStore
, add two routes to your app:
# config/routes.rb
# Include GraphQL::Pro's routing extensions:
using GraphQL::Pro::Routes
Rails.application.routes.draw do
# ...
# Add the Dashboard
# TODO: authorize, see the dashboard guide
mount MySchema.dashboard, at: "/graphql/dashboard"
# Add the Sync API (authorization built-in)
mount MySchema.operation_store_sync, at: "/graphql/sync"
end
MySchema.operation_store_sync
receives pushes from clients. See Client Workflow for more info on how this endpoint is used.
MySchema.dashboard
includes a web view to the OperationStore
, visible at /graphql/dashboard
. See the Dashboard guide for more details, including authorization.
/operation_store/graphql_ui.png
The are both Rack apps, so you can mount them in Sinatra or any other Rack app.
Add operation_id:
to your GraphQL context:
# app/controllers/graphql_controller.rb
context = {
# Relay / Apollo 1.x:
operation_id: params[:operationId]
# Or, Apollo Link:
# operation_id: params[:extensions][:operationId]
}
MySchema.execute(
# ...
context: context,
)
OperationStore
will use operation_id
to fetch the operation from the database.
See Server Management for details about rejecting GraphQL from params[:query]
.
Sync your operations with the Client Workflow.