query.ex (2293B)
1 # Zenflows is designed to implement the Valueflows vocabulary, 2 # written and maintained by srfsh <info@dyne.org>. 3 # Copyright (C) 2021-2023 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.Person.Query 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.Person 26 27 @spec all(Page.t()) :: {:ok, Queryable.t()} | {:error, Changeset.t()} 28 def all(%{filter: nil}), do: {:ok, where(Person, type: :per)} 29 def all(%{filter: params}) do 30 with {:ok, filters} <- all_validate(params) do 31 {:ok, Enum.reduce(filters, where(Person, type: :per), &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 defp all_f(q, {:or_name, v}), 39 do: or_where(q, [x], ilike(x.name, ^"%#{v}%")) 40 defp all_f(q, {:user, v}), 41 do: where(q, [x], ilike(x.user, ^"%#{v}%")) 42 defp all_f(q, {:or_user, v}), 43 do: or_where(q, [x], ilike(x.user, ^"%#{v}")) 44 45 @spec all_validate(Schema.params()) :: 46 {:ok, Changeset.data()} | {:error, Changeset.t()} 47 defp all_validate(params) do 48 {%{}, %{name: :string, or_name: :string, user: :string, or_user: :string}} 49 |> Changeset.cast(params, ~w[name or_name user or_user]a) 50 |> Validate.name(:name) 51 |> Validate.name(:or_name) 52 |> Validate.name(:user) 53 |> Validate.name(:or_user) 54 |> Validate.exist_xor([:name, :or_name]) 55 |> Validate.exist_xor([:user, :or_user]) 56 |> Validate.escape_like(:name) 57 |> Validate.escape_like(:or_name) 58 |> Validate.escape_like(:user) 59 |> Validate.escape_like(:or_user) 60 |> Changeset.apply_action(nil) 61 end 62 end