filter.ex (1684B)
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.Agent.Filter do 19 @moduledoc false 20 21 import Ecto.Query 22 23 alias Ecto.{Changeset, Queryable} 24 alias Zenflows.DB.{Page, Schema, Validate} 25 alias Zenflows.VF.Agent 26 27 @spec all(Page.t()) :: {:ok, Queryable.t()} | {:error, Changeset.t()} 28 def all(%{filter: nil}), do: {:ok, Agent} 29 def all(%{filter: params}) do 30 with {:ok, filters} <- all_validate(params) do 31 {:ok, Enum.reduce(filters, Agent, &all_f(&2, &1))} 32 end 33 end 34 35 @spec all_f(Queryable.t(), {atom(), term()}) :: Queryable.t() 36 defp all_f(q, {:name, v}), 37 do: where(q, [x], ilike(x.name, ^"%#{v}%")) 38 39 @spec all_validate(Schema.params()) 40 :: {:ok, Changeset.data()} | {:error, Changeset.t()} 41 defp all_validate(params) do 42 {%{}, %{name: :string}} 43 |> Changeset.cast(params, [:name]) 44 |> Validate.name(:name) 45 |> Validate.escape_like(:name) 46 |> Changeset.apply_action(nil) 47 end 48 end