Current section
Files
Jump to
Current section
Files
lib/ecto_anon/query.ex
defmodule EctoAnon.Query do
import Ecto.Query
@spec apply(%{:fields => List.t(), :embeds => List.t()}, Ecto.Repo.t(), struct()) ::
{:ok, Ecto.Schema.t()} | {:error, Ecto.Changeset.t()}
def apply(%{fields: fields, embeds: embeds}, repo, struct) do
changeset = Ecto.Changeset.change(struct, fields)
embeds
|> Enum.reduce(changeset, fn {field, data}, acc ->
acc
|> Ecto.Changeset.put_embed(field, data)
end)
|> repo.update()
end
@spec apply(keyword(), Ecto.Repo.t(), struct()) ::
{:ok, Ecto.Schema.t()} | {:error, Ecto.Changeset.t()}
def apply(data, repo, struct) do
struct
|> Ecto.Changeset.change(data)
|> repo.update()
end
@spec set_anonymized(Ecto.Repo.t(), struct()) ::
{:ok, Ecto.Schema.t()} | {:error, Ecto.Changeset.t()}
def set_anonymized(repo, struct) do
struct
|> Ecto.Changeset.change(anonymized: true)
|> repo.update()
end
@doc """
Returns a query that searches resources excluding anonymized ones
query = from(u in User, select: u)
|> not_anonymized
results = Repo.all(query)
"""
@spec not_anonymized(Ecto.Queryable.t()) :: Ecto.Queryable.t()
def not_anonymized(query) do
query
|> where([t], t.anonymized == false)
end
end