From 4383080696778157aebe6b3a36d5c00da3cd2ef0 Mon Sep 17 00:00:00 2001 From: HaimKortovich Date: Wed, 22 Apr 2026 14:39:00 -0500 Subject: [PATCH] use new query helper --- .../controllers/policy_controller.ex | 31 +++-------------- lib/policy_service_web/query_helpers.ex | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 26 deletions(-) create mode 100644 lib/policy_service_web/query_helpers.ex diff --git a/lib/policy_service_web/controllers/policy_controller.ex b/lib/policy_service_web/controllers/policy_controller.ex index 6f01efa..c42b23d 100644 --- a/lib/policy_service_web/controllers/policy_controller.ex +++ b/lib/policy_service_web/controllers/policy_controller.ex @@ -9,38 +9,17 @@ defmodule PolicyServiceWeb.PolicyController do alias PolicyService.Commands.CarPolicy alias PolicyServiceWeb.Schemas.Policy, as: S + alias PolicyServiceWeb.QueryHelpers tags(["Policies"]) security([%{"bearerAuth" => []}]) operation(:index, summary: "List policies", - parameters: [ - "page[number]": [in: :query, type: :integer, required: false], - "page[size]": [in: :query, type: :integer, required: false], - filters: [ - in: :query, - required: false, - explode: true, - description: """ - Apply filters in Flop format. - - Example: filters[0][field]=status&filters[0][op]==&filters[0][value]=created - """, - schema: %{ - type: :array, - items: %{ - type: :object, - properties: %{ - field: %{type: :string, description: "Field to filter on"}, - op: %{type: :string, description: "Operator (e.g., ==, !=, ~>)"}, - value: %{type: :string, description: "Filter value"} - } - } - } - ], - "order_by[]": [in: :query, type: :string, required: false] - ], + parameters: QueryHelpers.flop( + [:status, :policy_type, :search], + [:submitted_at, :policy_type, :status] + ), responses: [ ok: {"Policy list", "application/json", S.PolicyListResponse}, bad_request: {"Invalid params", "application/json", S.ErrorResponse} diff --git a/lib/policy_service_web/query_helpers.ex b/lib/policy_service_web/query_helpers.ex new file mode 100644 index 0000000..417f892 --- /dev/null +++ b/lib/policy_service_web/query_helpers.ex @@ -0,0 +1,33 @@ +defmodule PolicyServiceWeb.QueryHelpers do + @moduledoc false + + alias OpenApiSpex.Schema + + def flop(filter_fields, order_fields, other \\ []) do + [ + 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 + 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}} + end +end \ No newline at end of file