lib/bbox/peers.ex

defmodule Bbox.Peers do
  @moduledoc """
  Peers module.
  """
  alias Bbox.Repo
  alias Bbox.Peers.Peer

  @doc """
  Create a new peer.
  """
  @spec insert(map()) :: {:ok, %Peer{}}
  def insert(params) do
    case Repo.get_by(Peer, address: params.address) do
      nil ->
        {:ok, peer} =
          %Peer{}
          |> Peer.changeset(params)
          |> Repo.insert()

        :telemetry.execute([:bbox, :peers, :insert!], %{peer: peer})

        {:ok, peer}

      _ ->
        {:ok, "peer already exists"}
    end
  end

  @doc """
  List all peers.
  """
  @spec list!() :: [%Peer{}]
  def list!() do
    peers =
      Peer
      |> Repo.all()

    :telemetry.execute([:bbox, :peers, :list!], %{peers: peers})

    peers
  end
end