Ecto order_by

def list_posts(criteria \\ %{}) do
    {sort_by, sort_order} = sorters(criteria) || {:name, :asc}

    from(p in Post)
    |> order_by({^sort_order, ^sort_by})
    |>Repo.paginate(
      query,
      [
        before: Map.get(criteria, :before_cursor),
        after: Map.get(criteria, :after_cursor),
        cursor_fields: [{sort_by, sort_order}, :id],
        limit: Map.get(criteria, :limit, 10)
      ])
end

defp sorters(%{sort: %{sort_by: sort_by, sort_order: sort_order}}) do
    {sort_by, sort_order}
  end

I call the function like this Posts.list_posts(%{sort: %{sort_by: :type, sort_order: :desc}, limit: 2})