Packages

Provides basic functionalities to implement a JSON API-compliant API.

Current section

Files

Jump to
solage lib jsonapi_kit query.ex
Raw

lib/jsonapi_kit/query.ex

defmodule Solage.Query do
@moduledoc """
Using the available builders, fill the config with the parsed values.
Supported builders:
- Include
- Sort
- Filter
The goal of those builder is to parse the `params` sent to the Plug and returned useful
data structures so that you can use the resulting `jsonapi_query` assign to perform things
like association preloading or query sorting in Ecto.
"""
use Plug.Builder
alias Solage.{
QueryIncludeBuilder,
QuerySortBuilder,
QueryFilterBuilder,
QueryFieldsBuilder
}
plug :parse_includes
plug :parse_sort
plug :parse_filters
plug :parse_fields
def call(conn, opts) do
conn
|> assign(:jsonapi_query, %Solage.QueryConfig{options: opts})
|> super([])
end
defp parse_includes(conn = %Plug.Conn{assigns: %{jsonapi_query: jsonapi_query}}, _) do
include = QueryIncludeBuilder.build(conn.params["include"], jsonapi_query)
jsonapi_query = %{jsonapi_query | include: include}
assign(conn, :jsonapi_query, jsonapi_query)
end
defp parse_sort(conn = %Plug.Conn{assigns: %{jsonapi_query: jsonapi_query}}, _) do
sort = QuerySortBuilder.build(conn.params["sort"], jsonapi_query)
jsonapi_query = %{jsonapi_query | sort: sort}
assign(conn, :jsonapi_query, jsonapi_query)
end
defp parse_filters(conn = %Plug.Conn{assigns: %{jsonapi_query: jsonapi_query}}, _) do
filter = QueryFilterBuilder.build(conn.params["filter"], jsonapi_query)
jsonapi_query = %{jsonapi_query | filter: filter}
assign(conn, :jsonapi_query, jsonapi_query)
end
defp parse_fields(conn = %Plug.Conn{assigns: %{jsonapi_query: jsonapi_query}}, _) do
fields = QueryFieldsBuilder.build(conn.params["fields"], jsonapi_query)
jsonapi_query = %{jsonapi_query | fields: fields}
assign(conn, :jsonapi_query, jsonapi_query)
end
end