Mojolicious::Plugin::GraphQL - a plugin for adding GraphQL route handlers
my $schema = GraphQL::Schema->new( query => GraphQL::Type::Object->new( name => 'QueryRoot', fields => { helloWorld => { type => $String, resolve => sub { 'Hello, world!' }, }, }, ), ); # for Mojolicious substitute "plugin" with $app->plugin(... # Mojolicious::Lite (with endpoint under "/graphql") plugin GraphQL => {schema => $schema}; # OR, equivalently: plugin GraphQL => {handler => sub { my ($c, $body, $execute) = @_; # returns JSON-able Perl data $execute->( $schema, $body->{query}, undef, # $root_value $c->req->headers, $body->{variables}, $body->{operationName}, undef, # $field_resolver ); }}; # OR, with bespoke user-lookup and caching: plugin GraphQL => {handler => sub { my ($c, $body, $execute) = @_; my $user = MyStuff::User->lookup($app->request->headers->header('X-Token')); die "Invalid user\n" if !$user; # turned into GraphQL { errors => [ ... ] } my $cached_result = MyStuff::RequestCache->lookup($user, $body->{query}); return $cached_result if $cached_result; MyStuff::RequestCache->cache_and_return($execute->( $schema, $body->{query}, undef, # $root_value $user, # per-request info $body->{variables}, $body->{operationName}, undef, # $field_resolver )); }; # With GraphiQL, on /graphql plugin GraphQL => {schema => $schema, graphiql => 1};
This plugin allows you to easily define a route handler implementing a GraphQL endpoint.
The route handler code will be compiled to behave like the following:
Passes to the GraphQL execute, possibly via your supplied handler, the given schema, $root_value and $field_resolver.
$root_value
$field_resolver
The action built matches POST / GET requests.
Returns GraphQL results in JSON form.
Mojolicious::Plugin::GraphQL supports the following options.
String. Defaults to /graphql.
/graphql
A GraphQL::Schema object. If not supplied, your handler will need to be a closure that will pass a schema on to GraphQL.
handler
An optional root value, passed to top-level resolvers.
An optional field resolver, replacing the GraphQL default.
An optional route-handler, replacing the plugin's default - see example above for possibilities.
It must return JSON-able Perl data in the GraphQL format, which is a hash with at least one of a data key and/or an errors key.
data
errors
If it throws an exception, that will be turned into a GraphQL-formatted error.
Boolean controlling whether requesting the endpoint with Accept: text/html will return the GraphiQL user interface. Defaults to false.
Accept: text/html
# Mojolicious::Lite plugin GraphQL => {schema => $schema, graphiql => 1};
Mojolicious::Plugin::GraphQL inherits all methods from Mojolicious::Plugin and implements the following new ones.
my $route = $plugin->register(Mojolicious->new, {schema => $schema});
Register renderer in Mojolicious application.
GraphQL
Ed J
Based heavily on Mojolicious::Plugin::PODRenderer.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
To install Mojolicious::Plugin::GraphQL, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Mojolicious::Plugin::GraphQL
CPAN shell
perl -MCPAN -e shell install Mojolicious::Plugin::GraphQL
For more information on module installation, please visit the detailed CPAN module installation guide.