lib/coder_ring/code.ex

defmodule CoderRing.Code do
  @moduledoc """
  Schema for a code, pending use.
  """
  use Ecto.Schema
  import Ecto.Changeset
  alias Ecto.Changeset
  alias __MODULE__

  schema "codes" do
    field :name, :string
    field :position, :integer
    field :value, :string
  end

  @typedoc """
  * `:id` - Unique integer ID for the code.
  * `:name` - Name of the code type.
  * `:position` - Primary key and auto-incrementing integer.
  * `:value` - A pre-generated code.
  """
  @type t :: %Code{
          id: non_neg_integer,
          name: String.t(),
          position: non_neg_integer,
          value: String.t()
        }

  @doc "Changeset for creating a new code."
  @spec changeset(t | Changeset.t(), map) :: Changeset.t()
  def changeset(code_or_changeset, params) do
    code_or_changeset
    |> update_changeset(params)
  end

  @doc "Changeset for updating an existing code."
  @spec update_changeset(t | Changeset.t(), map) :: Changeset.t()
  def update_changeset(code_or_changeset, params \\ %{}) do
    required = [:name, :value]

    code_or_changeset
    |> cast(params, required)
    |> validate_required(required)
  end
end