action-requests-demo.jamey..../lib/action_requests_demo/action_requests.ex

80 lines
2.5 KiB
Elixir
Raw Permalink Normal View History

defmodule ActionRequestsDemo.ActionRequests do
import Ecto.Query
alias ActionRequestsDemo.{Repo, ActionRequests.ActionRequest}
def list_action_requests(params, current_user_id \\ nil) do
# Extract custom filters
patient_name = get_in(params, ["patient_name"]) |> clean_param()
status = get_in(params, ["status"]) |> clean_param()
assignment = get_in(params, ["assignment"]) |> clean_param()
# Build base query with custom filters
query =
ActionRequest
|> apply_patient_name_filter(patient_name)
|> apply_status_filter(status)
|> apply_assignment_filter(assignment, current_user_id)
# Use Flop for sorting and pagination only
flop_params = Map.drop(params, ["patient_name", "status", "assignment"])
# Set default sort if not specified
flop_params =
if is_nil(flop_params["order_by"]) || flop_params["order_by"] == "" do
flop_params
|> Map.put("order_by", ["inserted_at"])
|> Map.put("order_directions", ["desc"])
else
# Convert order_by and order_directions to arrays if they're strings
flop_params
|> maybe_listify("order_by")
|> maybe_listify("order_directions")
end
Flop.validate_and_run(query, flop_params, for: ActionRequest, repo: Repo)
end
defp maybe_listify(params, key) do
case params[key] do
nil -> params
"" -> Map.delete(params, key)
val when is_binary(val) -> Map.put(params, key, [val])
val when is_atom(val) -> Map.put(params, key, [val])
val when is_list(val) -> params
_ -> params
end
end
defp clean_param(nil), do: nil
defp clean_param(""), do: nil
defp clean_param("all"), do: nil
defp clean_param(val), do: val
defp apply_patient_name_filter(query, nil), do: query
defp apply_patient_name_filter(query, name) do
pattern = "%#{name}%"
where(query, [a], like(a.patient_name, ^pattern))
end
defp apply_status_filter(query, nil), do: query
defp apply_status_filter(query, status) do
where(query, [a], a.status == ^status)
end
defp apply_assignment_filter(query, nil, _), do: query
defp apply_assignment_filter(query, "mine", current_user_id) do
where(query, [a], a.assigned_user_id == ^current_user_id)
end
defp apply_assignment_filter(query, "assigned", _) do
where(query, [a], not is_nil(a.assigned_user_id))
end
defp apply_assignment_filter(query, "unassigned", _) do
where(query, [a], is_nil(a.assigned_user_id))
end
end