diff --git a/lib/policy_service_web/query_helpers.ex b/lib/policy_service_web/query_helpers.ex index 417f892..37e39d5 100644 --- a/lib/policy_service_web/query_helpers.ex +++ b/lib/policy_service_web/query_helpers.ex @@ -3,31 +3,26 @@ defmodule PolicyServiceWeb.QueryHelpers do alias OpenApiSpex.Schema + @filter_count 3 + def flop(filter_fields, order_fields, other \\ []) do + filter_params = build_filter_params(filter_fields, @filter_count) + [ - filters: [in: :query, schema: filters(filter_fields)], - order_by: [in: :query, schema: order_by(order_fields)], page: [in: :query, schema: %Schema{type: :number, default: 1}], - page_size: [in: :query, schema: %Schema{type: :number, default: 20}] - ] ++ other + page_size: [in: :query, schema: %Schema{type: :number, default: 20}], + "order_by[]": [in: :query, schema: %Schema{type: :array, items: %Schema{type: :string, enum: order_fields}}], + "order_directions[]": [in: :query, schema: %Schema{type: :array, items: %Schema{type: :string, enum: ["asc", "desc"]}}] + ] ++ filter_params ++ other end - defp filters(fields) do - %Schema{ - type: :array, - items: %Schema{ - type: :object, - properties: %{ - field: %Schema{type: :string, enum: fields}, - value: %Schema{type: :any}, - op: %Schema{type: :string, enum: Flop.Filter.allowed_operators(:all)} - }, - required: [:field, :value] - } - } - end - - defp order_by(fields) do - %Schema{type: :array, items: %Schema{type: :string, enum: fields}} + defp build_filter_params(fields, count) do + for i <- 0..(count - 1) do + [ + {"filters[#{i}][field]", [in: :query, schema: %Schema{type: :string, enum: fields}]}, + {"filters[#{i}][op]", [in: :query, schema: %Schema{type: :string, enum: Flop.Filter.allowed_operators(:all)}]}, + {"filters[#{i}][value]", [in: :query, schema: %Schema{type: :string}]} + ] + end |> List.flatten() end end \ No newline at end of file