filter.ex (2575B)
1 # Zenflows is designed to implement the Valueflows vocabulary, 2 # written and maintained by srfsh <info@dyne.org>. 3 # Copyright (C) 2021-2022 Dyne.org foundation <foundation@dyne.org>. 4 # 5 # This program is free software: you can redistribute it and/or modify 6 # it under the terms of the GNU Affero General Public License as published by 7 # the Free Software Foundation, either version 3 of the License, or 8 # (at your option) any later version. 9 # 10 # This program is distributed in the hope that it will be useful, 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # GNU Affero General Public License for more details. 14 # 15 # You should have received a copy of the GNU Affero General Public License 16 # along with this program. If not, see <https://www.gnu.org/licenses/>. 17 18 defmodule Zenflows.VF.EconomicResource.Filter do 19 @moduledoc false 20 21 import Ecto.Query 22 23 alias Ecto.{Changeset, Queryable} 24 alias Zenflows.DB.{ID, Page, Schema, Validate} 25 alias Zenflows.VF.EconomicResource 26 27 @spec all(Page.t()) :: {:ok, Queryable.t()} | {:error, Changeset.t()} 28 def all(%{filter: nil}), do: {:ok, EconomicResource} 29 def all(%{filter: params}) do 30 with {:ok, filters} <- all_validate(params) do 31 {:ok, Enum.reduce(filters, EconomicResource, &all_f(&2, &1))} 32 end 33 end 34 35 @spec all_f(Queryable.t(), {atom(), term()}) :: Queryable.t() 36 defp all_f(q, {:classified_as, v}), 37 do: where(q, [x], fragment("? @> ?", x.classified_as, ^v)) 38 defp all_f(q, {:primary_accountable, v}), 39 do: where(q, [x], x.primary_accountable_id in ^v) 40 defp all_f(q, {:custodian, v}), 41 do: where(q, [x], x.custodian_id in ^v) 42 defp all_f(q, {:conforms_to, v}), 43 do: where(q, [x], x.conforms_to_id in ^v) 44 defp all_f(q, {:gt_onhand_quantity_has_numerical_value, v}), 45 do: where(q, [x], x.onhand_quantity_has_numerical_value > ^v) 46 47 @spec all_validate(Schema.params()) :: 48 {:ok, Changeset.data()} | {:error, Changeset.t()} 49 defp all_validate(params) do 50 {%{}, %{ 51 classified_as: {:array, :string}, 52 primary_accountable: {:array, ID}, 53 custodian: {:array, ID}, 54 conforms_to: {:array, ID}, 55 gt_onhand_quantity_has_numerical_value: :float, 56 }} 57 |> Changeset.cast(params, ~w[ 58 classified_as primary_accountable custodian conforms_to 59 gt_onhand_quantity_has_numerical_value 60 ]a) 61 |> Validate.class(:classified_as) 62 |> Validate.class(:primary_accountable) 63 |> Validate.class(:custodian) 64 |> Validate.class(:conforms_to) 65 |> Changeset.validate_number(:gt_onhand_quantity_has_numerical_value, 66 greater_than_or_equal_to: 0) 67 |> Changeset.apply_action(nil) 68 end 69 end