Flop v0.4.0 Flop.Schema protocol View Source

This protocol allows you to define the sortable and filterable fields in your Ecto schemas.

Usage

Derive Flop.Schema in your Ecto schema.

defmodule Pet do
  use Ecto.Schema

  @derive {Flop.Schema,
           filterable: [:name, :species], sortable: [:name, :age]}

  schema "pets" do
    field :name, :string
    field :age, :integer
    field :species, :string
    field :social_security_number, :string
  end
end

After that, you can pass the module as the :for option to Flop.validate/2.

iex> Flop.validate(%Flop{order_by: [:name]}, for: Flop.Pet)
{:ok,
 %Flop{
   filters: [],
   limit: nil,
   offset: nil,
   order_by: [:name],
   order_directions: nil,
   page: nil,
   page_size: nil
 }}

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

Defining default and maximum limits

To define a default or maximum limit, you can set the default_limit and max_limit option when deriving Flop.Schema. The maximum limit will be validated and the default limit applied by Flop.validate/1.

@derive {Flop.Schema,
          filterable: [:name, :species],
          sortable: [:name, :age],
          max_limit: 100,
          default_limit: 50}

Link to this section Summary

Functions

Returns the default limit of a schema.

Returns the filterable fields of a schema.

Returns the maximum limit of a schema.

Returns the sortable fields of a schema.

Link to this section Types

Link to this section Functions

Specs

default_limit(any()) :: pos_integer() | nil

Returns the default limit of a schema.

iex> Flop.Schema.default_limit(%Flop.Fruit{})
50

Specs

filterable(any()) :: [atom()]

Returns the filterable fields of a schema.

iex> Flop.Schema.filterable(%Flop.Pet{})
[:name, :species]

Specs

max_limit(any()) :: pos_integer() | nil

Returns the maximum limit of a schema.

iex> Flop.Schema.max_limit(%Flop.Pet{})
20

Specs

sortable(any()) :: [atom()]

Returns the sortable fields of a schema.

iex> Flop.Schema.sortable(%Flop.Pet{})
[:name, :age, :species]