jsonapi v0.5.0 JSONAPI.QueryParser

Implements a fully JSONAPI V1 spec for parsing a complex query string and returning elixir datastructures. The purpose is to validate and encode incoming queries and fail quickly.

Primarialy this handles:

This plug works in conjunction with a JSONAPI View as well as some plug defined configuration.

In your controller you may add

plug JSONAPI.QueryParser,
  filter: ~w(title),
  sort: ~w(created_at title),
  view: MyView

If your controller’s index function recieves a query with params inside those bounds it will build a JSONAPI.Config that has all the validated and parsed fields for your usage. The final configuration will be added to assigns jsonapi_query.

The final output will be a JSONAPI.Config struct and will look similar to like

%JSONAPI.Config{
  view: MyView,
  opts: [view: MyView, sort: ["created_at", "title"], filter: ["title"]],
  sort: [desc: :created_at] # Easily insertable into an ecto order_by,
  filter: [title: "my title"] # Easily reduceable into ecto where clauses
  includes: [comments: :user] # Easily insertable into a Repo.preload,
  fields: %{"myview" => [:id, :text], "comment" => [:id, :body]}
}

The final result should allow you to build a query quickly and with little overhead. You will notice the fields section is a not as easy to work with as the others and that is a result of Ecto not supporting high quality selects quite yet. This is a WIP.

Options

  • :view - The JSONAPI View which is the basis for this plug.
  • :sort - List of atoms which define which fields can be sorted on.
  • :filter - List of atoms which define which fields can be filtered on.

Summary

Functions

build_sort(binary, field)
call(conn, opts)

Callback implementation for Plug.call/2.

get_valid_fields_for_type(map, type)
get_view_for_type(view, type)
handle_include(str, config)
handle_nested_include(key, valid_include, config)
init(opts)

Callback implementation for Plug.init/1.

parse_fields(config, map)
parse_filter(config, map)
parse_include(config, include_str)
parse_sort(config, sort_fields)