# Apq

[![Build Status](]( [![Hex pm](]( [![Hex Docs](]( [![License](](

Support for [Automatic Persisted Queries]( in Absinthe. Query documents in GraphQL can be be of a significant size. Especially on mobile it may be beneficial to limit the size of the queries so fewer bytes go across the network. APQ uses a deterministic hash of the input query in a request. If the server does not know the hash the client can retry the request with the expanded query. The server can use this request to store the query in its cache.

You'll need a GraphQL client that can use APQ, such as Apollo Client.

Complete example project is available [here](

## Installation

If [available in Hex](, the package can be installed
by adding `apq` to your list of dependencies in `mix.exs`:

def deps do
    {:apq, "~> 1.0.0"}

## Examples

Define a new module and `use Apq.DocumentProvider`:
defmodule ApqExample.Apq do
   use Apq.DocumentProvider, 
    cache_provider: ApqExample.Cache,
    max_query_size: 16384 #default

You'll need to implement a cache provider. This is up to you, in this example I use [Cachex]( but you could use a Genserver, Redis or anything else. 

Define a module for the cache, e.g when using Cachex:
defmodule ApqExample.Cache do
  @behaviour Apq.CacheProvider

  def get(hash) do
    Cachex.get(:apq_cache, hash)

  def put(hash, query) do
    Cachex.put(:apq_cache, hash, query)
When using Cachex you'll need to start it in your supervision tree:
worker(Cachex, [ :apq_cache, [ limit: 100 ] ])

Now we need to add the `ApqExample.Apq` module to the list of document providers. This goes in your router file.
  to: Absinthe.Plug,
  init_opts: [
    schema: ApqExample.Schema,
    json_codec: Jason,
    interface: :playground,
    document_providers: [ApqExample.Apq, Absinthe.Plug.DocumentProvider.Default]
This is it, if you query with a client that has support for Apq it should work with Absinthe.

## Documentation

Documentation can be generated with [ExDoc](
and published on [HexDocs]( Once published, the docs can
be found at [](