defmodule WorkloadServiceWeb.QueryHelpers do @moduledoc false alias OpenApiSpex.Schema @filter_count 3 def flop(filter_fields, order_fields, other \\ []) do filter_params = build_filter_params(filter_fields, @filter_count) [ page: [in: :query, schema: %Schema{type: :number, default: 1}], 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 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