add query helpers
Some checks failed
Build and Publish / build-release (push) Failing after 39s

This commit is contained in:
2026-04-22 14:54:12 -05:00
parent e0f3dba37a
commit 6f008c71be
2 changed files with 33 additions and 21 deletions

View File

@@ -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}

View File

@@ -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