Flop.validate

You're seeing just the function validate, go back to Flop module for more information.
Link to this function

validate(flop, opts \\ [])

View Source

Specs

validate(t() | map(), [option()]) :: {:ok, t()} | {:error, Ecto.Changeset.t()}

Validates a Flop.t/0.

Examples

iex> params = %{"limit" => 10, "offset" => 0, "texture" => "fluffy"}
iex> Flop.validate(params)
{:ok,
 %Flop{
   filters: [],
   limit: 10,
   offset: 0,
   order_by: nil,
   order_directions: nil,
   page: nil,
   page_size: nil
 }}

iex> flop = %Flop{offset: -1}
iex> {:error, changeset} = Flop.validate(flop)
iex> changeset.valid?
false
iex> changeset.errors
[
  offset: {"must be greater than or equal to %{number}",
   [validation: :number, kind: :greater_than_or_equal_to, number: 0]}
]

It also makes sure that only one pagination method is used.

iex> params = %{limit: 10, offset: 0, page: 5, page_size: 10}
iex> {:error, changeset} = Flop.validate(params)
iex> changeset.valid?
false
iex> changeset.errors
[limit: {"cannot combine multiple pagination types", []}]

If you derived Flop.Schema in your Ecto schema to define the filterable and sortable fields, you can pass the module name to the function to validate that only allowed fields are used. The function will also apply any default values set for the schema.

iex> params = %{"order_by" => ["species"]}
iex> {:error, changeset} = Flop.validate(params, for: Flop.Pet)
iex> changeset.valid?
false
iex> [order_by: {msg, [_, {_, enum}]}] = changeset.errors
iex> msg
"has an invalid entry"
iex> enum
[:name, :age]

Note that currently, trying to use an existing field that is not allowed as seen above will result in the error message has an invalid entry, while trying to use a field name that does not exist in the schema (or more precisely: a field name that doesn't exist as an atom) will result in the error message is invalid. This might change in the future.