diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml index 58a8447..fc1cc0b 100644 --- a/.github/workflows/elixir.yml +++ b/.github/workflows/elixir.yml @@ -71,6 +71,8 @@ jobs: sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'postgres';" - name: Install dependencies run: mix deps.get + - name: Create DB + run: mix do ecto.create, ecto.migrate - name: Dialyzer run: MIX_ENV=test mix dialyzer - name: Credo diff --git a/lib/permit_ecto/operators/is_nil.ex b/lib/permit_ecto/operators/is_nil.ex index d4a9755..ba4808b 100644 --- a/lib/permit_ecto/operators/is_nil.ex +++ b/lib/permit_ecto/operators/is_nil.ex @@ -2,7 +2,7 @@ defmodule Permit.Operators.IsNil.DynamicQuery do @moduledoc false import Ecto.Query, only: [dynamic: 2] - @spec dynamic_query_fn(term(), keyword()) :: (any() -> Ecto.Query.dynamic()) | nil + @spec dynamic_query_fn(term(), keyword()) :: (any() -> Ecto.Query.dynamic_expr()) | nil def dynamic_query_fn(key, not?) do if not? do fn _ -> dynamic([r], not is_nil(field(r, ^key))) end diff --git a/lib/permit_ecto/permissions/conjunction.ex b/lib/permit_ecto/permissions/conjunction.ex index 35d8594..7c370dd 100644 --- a/lib/permit_ecto/permissions/conjunction.ex +++ b/lib/permit_ecto/permissions/conjunction.ex @@ -13,7 +13,7 @@ defmodule Permit.Ecto.Permissions.Conjunction do Types.subject(), Ecto.Query.t() ) :: - {:ok, Ecto.Query.dynamic()} | {:error, keyword()} + {:ok, Ecto.Query.dynamic_expr()} | {:error, keyword()} def to_dynamic_query_expr(%ParsedConditionList{conditions: []}, _, _, _query), do: {:ok, dynamic(false)} diff --git a/lib/permit_ecto/permissions/parsed_condition.ex b/lib/permit_ecto/permissions/parsed_condition.ex index 8ca39f8..fcaa874 100644 --- a/lib/permit_ecto/permissions/parsed_condition.ex +++ b/lib/permit_ecto/permissions/parsed_condition.ex @@ -34,7 +34,7 @@ defmodule Permit.Ecto.Permissions.ParsedCondition do Types.subject(), Ecto.Query.t() ) :: - {:ok, Ecto.Query.dynamic()} | {:error, term()} + {:ok, Ecto.Query.dynamic_expr()} | {:error, term()} def to_dynamic_query( %ParsedCondition{ @@ -100,15 +100,23 @@ defmodule Permit.Ecto.Permissions.ParsedCondition do do: query_fn.(resource) defp build_dynamic_query({root, conditions}, query) do - Enum.reduce(conditions, dynamic(true), fn {field, value}, acc -> - if Keyword.keyword?(value) do - Enum.reduce(value, acc, fn {k, v}, acc -> - add_condition(root, field, {k, v}, acc, query) - end) - else - add_single_condition(root, field, value, acc, query) + Enum.reduce( + conditions, + dynamic(true), + fn {field, value}, acc -> + add_conditions(root, field, value, acc, query) end - end) + ) + end + + defp add_conditions(root, field, keyword_or_value, acc, query) do + if Keyword.keyword?(keyword_or_value) do + Enum.reduce(keyword_or_value, acc, fn {k, v}, acc -> + add_condition(root, field, {k, v}, acc, query) + end) + else + add_single_condition(root, field, keyword_or_value, acc, query) + end end defp add_condition(root, field, {key, v}, acc, query) when is_list(v) do diff --git a/priv/repo/migrations/20240409142525_create_item_metadata_table.exs b/priv/repo/migrations/20240409142525_create_item_metadata_table.exs index a09022f..49743f1 100644 --- a/priv/repo/migrations/20240409142525_create_item_metadata_table.exs +++ b/priv/repo/migrations/20240409142525_create_item_metadata_table.exs @@ -1,4 +1,4 @@ -defmodule Permit.EctoFakeApp.Repo.Migrations.CreateItemTable do +defmodule Permit.EctoFakeApp.Repo.Migrations.CreateItemMetadataTable do use Ecto.Migration def change do diff --git a/priv/repo/migrations/20240409233645_create_reviews_table.exs b/priv/repo/migrations/20240409233645_create_reviews_table.exs index 386603b..6b90a0c 100644 --- a/priv/repo/migrations/20240409233645_create_reviews_table.exs +++ b/priv/repo/migrations/20240409233645_create_reviews_table.exs @@ -1,4 +1,4 @@ -defmodule Permit.EctoFakeApp.Repo.Migrations.CreateItemTable do +defmodule Permit.EctoFakeApp.Repo.Migrations.CreateReviewsTable do use Ecto.Migration def change do