lib/incident/event_store/in_memory/aggregate_lock.ex

defmodule Incident.EventStore.InMemory.AggregateLock do
  @moduledoc """
  Defines the data structure for an aggregate lock for the in memory adapter.

  All fields are required.
  """

  @type t :: %__MODULE__{
          id: pos_integer | nil,
          aggregate_id: String.t() | nil,
          owner_id: pos_integer() | nil,
          valid_until: DateTime.t() | nil
        }

  use Ecto.Schema
  import Ecto.Changeset

  embedded_schema do
    field(:aggregate_id, :string)
    field(:owner_id, :integer)
    field(:valid_until, :utc_datetime_usec)
  end

  @required_fields ~w(aggregate_id owner_id valid_until)a

  @doc false
  @spec changeset(t, map) :: Ecto.Changeset.t()
  def changeset(record, params \\ %{}) do
    record
    |> cast(params, @required_fields)
    |> validate_required(@required_fields)
  end
end