Easily build composable queries for Ecto for JSON API endpoints using Inquisitor
This plugin for Inquisitor aims to implement all of the relevant Fetching Data section for the JSON API spec
Make sure you reference Inquisitor's Usage section first
JSON API Include (Ecto preload) Plugin
Use Inquisitor.JsonApi.Include
after Inquisitor
defmodule MyApp.PostController do
use MyAp.Web, :controller
use Inquisitor
use Inquisitor.JsonApi.Include
...
This plugin follows the spec for sorting with JSON API. All requests should conform to that URL schema for this plugin to work.
[GET] http://example.com/posts?include=tags,author
Refer to the Docs for this module on how to enable preloading properly.
JSON API Sorting Plugin
Use Inquisitor.JsonApi.Sort
after Inquisitor
defmodule MyApp.PostController do
use MyAp.Web, :controller
use Inquisitor
use Inquisitor.JsonApi.Sort
...
This plugin follows the spec for sorting with JSON API. All requests should conform to that URL schema for this plugin to work.
[GET] http://example.com/posts?sort=-create,title
The plugin with correct apply ASC
and DESC
sort order to the built
query.
JSON API Pagination Plugin
Use Inquisitor.JsonApi.Page
after Inquisitor
defmodule MyApp.PostController do
use MyAp.Web, :controller
use Inquisitor
use Inquisitor.JsonApi.Page
...
This plugin follows the spec for pagination with JSON API. All requests should conform to that URL schema for this plugin to work.
[GET] http://example.com/posts?page[limit]=10&page[offset]=2
[GET] http://example.com/posts?page[size]=10&page[number]=2
Cursor pagination is not yet implemented.
You may need to calculate certain page data to generate pagination
links. You can use page_data/3
that this module import
s for you.
query = build_query(User, conn, params)
data = page_data(query, repo, params)
links = build_links(data)
meta = build_meta(data)
users = Repo.all(query)
JSON API Filtering Plugin
Use Inquisitor.JsonApi.Filter
after Inquisitor
defmodule MyApp.PostController do
use MyAp.Web, :controller
use Inquisitor
use Inquisitor.JsonApi.Filter
...
This plugin follows the spec for pagination with JSON API. All requests should conform to that URL schema for this plugin to work.
[GET] http://example.com/posts?filter[name]=Brian&filter[age]=99
By default Filter
is no-op. You must define a custom
build_filter_query/4
handler:
def build_filter_query(query, "name", name, _conn) do
Ecto.Query.where(query, [r], r.name == ^name)
end
We are very thankful for the many contributors
This library follows Semantic Versioning
Please do! We are always looking to improve this library. Please see our Contribution Guidelines on how to properly submit issues and pull requests.
DockYard, Inc. © 2017