lib/bbox/peers/peer.ex

defmodule Bbox.Peers.Peer do
  @moduledoc """
  Node of the network.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @primary_key false
  @foreign_key_type :string
  schema "peers" do
    field(:address, :string)

    timestamps()
  end

  def changeset(peer, params \\ %{}) do
    peer
    |> cast(params, [:address])
    |> validate_required([:address])
    |> validate_format(:address, ~r/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}$/,
      message: "invalid address"
    )
    |> unique_constraint(:address, message: "address already exists")
  end
end