80 lines
2.5 KiB
Elixir
80 lines
2.5 KiB
Elixir
|
|
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
|