From 6f008c71befdaca79d0c16e2278433deb14b0fe9 Mon Sep 17 00:00:00 2001 From: HaimKortovich Date: Wed, 22 Apr 2026 14:54:12 -0500 Subject: [PATCH] add query helpers --- .../controllers/task_controller.ex | 26 ++++------------- lib/workload_service_web/query_helpers.ex | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+), 21 deletions(-) create mode 100644 lib/workload_service_web/query_helpers.ex diff --git a/lib/workload_service_web/controllers/task_controller.ex b/lib/workload_service_web/controllers/task_controller.ex index e819021..75fa96f 100644 --- a/lib/workload_service_web/controllers/task_controller.ex +++ b/lib/workload_service_web/controllers/task_controller.ex @@ -6,32 +6,16 @@ defmodule WorkloadServiceWeb.TaskController do alias WorkloadService.Workload.Queries alias WorkloadService.Aggregates.TaskId alias WorkloadServiceWeb.Schemas.Task, as: S + alias WorkloadServiceWeb.QueryHelpers tags(["Tasks"]) operation(:list, summary: "List tasks", - parameters: [ - "page[number]": [in: :query, type: :integer, required: false, example: 1], - "page[size]": [in: :query, type: :integer, required: false, example: 20], - filters: [ - in: :query, - schema: %OpenApiSpex.Schema{ - type: :array, - items: %OpenApiSpex.Schema{ - type: :object, - properties: %{ - field: %OpenApiSpex.Schema{type: :string}, - op: %OpenApiSpex.Schema{type: :string, default: "=="}, - value: %OpenApiSpex.Schema{type: :string} - } - } - }, - required: false, - style: :deepObject, - explode: true - ] - ], + parameters: QueryHelpers.flop( + [:status, :application_id], + [:created_at, :updated_at, :status] + ), responses: [ ok: {"Task list", "application/json", S.TaskListResponse}, bad_request: {"Invalid params", "application/json", S.ErrorResponse} diff --git a/lib/workload_service_web/query_helpers.ex b/lib/workload_service_web/query_helpers.ex new file mode 100644 index 0000000..2df1732 --- /dev/null +++ b/lib/workload_service_web/query_helpers.ex @@ -0,0 +1,28 @@ +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 \ No newline at end of file