defmodule Statestores.Adapters.PostgresLookupAdapter do @moduledoc """ Implements the behavior defined in `Statestores.Adapters.LookupBehaviour` for MySql databases. """ use Statestores.Adapters.LookupBehaviour use Ecto.Repo, otp_app: :spawn_statestores, adapter: Ecto.Adapters.Postgres alias Statestores.Schemas.{Lookup, ValueObjectSchema} @impl true def clean(node) do node = Atom.to_string(node) res = delete_all(from(l in Lookup, where: l.node == ^node)) {:ok, res} end @impl true def get_all_by_node(node) do node = Atom.to_string(node) res = all(from(l in Lookup, where: l.node == ^node)) {:ok, res} end @impl true def get_by_id(id) do key = generate_key(id) {:ok, all(from(l in Lookup, where: l.id == ^key))} end @impl true def get_by_id_node(id, node) do node = Atom.to_string(node) res = all(from(l in Lookup, where: l.id == ^id and l.node == ^node)) {:ok, res} end @impl true def set(%{name: actor, system: system} = id, node, data) do key = generate_key(id) node = Atom.to_string(node) event = %Lookup{ id: key, node: node, actor: actor, system: system, data: data } %Lookup{} |> Lookup.changeset(ValueObjectSchema.to_map(event)) |> insert_or_update( on_conflict: [ set: [ actor: actor, system: system, data: data, updated_at: DateTime.utc_now() ] ], conflict_target: [:id, :node] ) |> case do {:ok, event} -> {:ok, event} {:error, changeset} -> {:error, changeset} other -> {:error, other} end end end