zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

commit 6115fbf37e62c09a69786ae8d27ab081eefea8d8
parent ba1e148fe54046c6a94086f08ba8ed52d8066721
Author: srfsh <dev@srf.sh>
Date:   Mon, 17 Oct 2022 17:14:40 +0300

Zenflows.Vf.Proposal.{Type,Filter}: introduce name filters

Requested by Ennio.

Diffstat:
Msrc/zenflows/vf/proposal/filter.ex | 43++++++++++++++++++++++---------------------
Msrc/zenflows/vf/proposal/type.ex | 2++
2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/src/zenflows/vf/proposal/filter.ex b/src/zenflows/vf/proposal/filter.ex @@ -67,7 +67,17 @@ end defp f(q, {:or_primary_intents_resource_inventoried_as_classified_as, v}) do q |> join(:primary_intents_resource_inventoried_as) - |> where([primary_intents_resource_inventoried_as: r], fragment("? @> ?", r.classified_as, ^v)) + |> or_where([primary_intents_resource_inventoried_as: r], fragment("? @> ?", r.classified_as, ^v)) +end +defp f(q, {:primary_intents_resource_inventoried_as_name, v}) do + q + |> join(:primary_intents_resource_inventoried_as) + |> where([primary_intents_resource_inventoried_as: r], ilike(r.name, ^"%#{Filter.escape_like(v)}%")) +end +defp f(q, {:or_primary_intents_resource_inventoried_as_name, v}) do + q + |> join(:primary_intents_resource_inventoried_as) + |> or_where([primary_intents_resource_inventoried_as: r], ilike(r.name, ^"%#{Filter.escape_like(v)}%")) end # join primary_intents @@ -92,6 +102,8 @@ embedded_schema do field :or_primary_intents_resource_inventoried_as_primary_accountable, {:array, ID} field :primary_intents_resource_inventoried_as_classified_as, {:array, :string} field :or_primary_intents_resource_inventoried_as_classified_as, {:array, :string} + field :primary_intents_resource_inventoried_as_name, :string + field :or_primary_intents_resource_inventoried_as_name, :string end @cast ~w[ @@ -101,6 +113,8 @@ end or_primary_intents_resource_inventoried_as_primary_accountable primary_intents_resource_inventoried_as_classified_as or_primary_intents_resource_inventoried_as_classified_as + primary_intents_resource_inventoried_as_name + or_primary_intents_resource_inventoried_as_name ]a @spec chgset(params()) :: Changeset.t() @@ -113,28 +127,15 @@ defp chgset(params) do |> Validate.class(:or_primary_intents_resource_inventoried_as_primary_accountable) |> Validate.class(:primary_intents_resource_inventoried_as_classified_as) |> Validate.class(:or_primary_intents_resource_inventoried_as_classified_as) - |> check_xor(:primary_intents_resource_inventoried_as_conforms_to, + |> Validate.name(:primary_intents_resource_inventoried_name) + |> Validate.name(:or_primary_intents_resource_inventoried_name) + |> Filter.check_xor(:primary_intents_resource_inventoried_as_conforms_to, :or_primary_intents_resource_inventoried_as_conforms_to) - |> check_xor(:primary_intents_resource_inventoried_as_primary_accountable, + |> Filter.check_xor(:primary_intents_resource_inventoried_as_primary_accountable, :or_primary_intents_resource_inventoried_as_primary_accountable) - |> check_xor(:primary_intents_resource_inventoried_as_classified_as, + |> Filter.check_xor(:primary_intents_resource_inventoried_as_classified_as, :or_primary_intents_resource_inventoried_as_classified_as) -end - -# Check that `a` and `b` are not provided at the same time. -@spec check_xor(Changeset.t(), atom(), atom()) :: Changeset.t() -defp check_xor(cset, a, b) do - x = Changeset.get_change(cset, a) - y = Changeset.get_change(cset, b) - - if x && y do - msg = "can't provide both" - - cset - |> Changeset.add_error(a, msg) - |> Changeset.add_error(b, msg) - else - cset - end + |> Filter.check_xor(:primary_intents_resource_inventoried_as_name, + :or_primary_intents_resource_inventoried_as_name) end end diff --git a/src/zenflows/vf/proposal/type.ex b/src/zenflows/vf/proposal/type.ex @@ -137,6 +137,8 @@ input_object :proposal_filter_params do field :or_primary_intents_resource_inventoried_as_primary_accountable, list_of(non_null(:id)) field :primary_intents_resource_inventoried_as_classified_as, list_of(non_null(:uri)) field :or_primary_intents_resource_inventoried_as_classified_as, list_of(non_null(:uri)) + field :primary_intents_resource_inventoried_as_name, :string + field :or_primary_intents_resource_inventoried_as_name, :string end object :query_proposal do