lib/auth/status.ex

defmodule Auth.Status do
  use Ecto.Schema
  import Ecto.Changeset
  alias Auth.Repo
  # https://stackoverflow.com/a/47501059/1148249
  alias __MODULE__
  @admin_email System.get_env("ADMIN_EMAIL")

  schema "status" do
    field :text, :string
    field :desc, :string
    belongs_to :person, Auth.Person

    timestamps()
  end

  @doc false
  def changeset(status, attrs) do
    status
    |> cast(attrs, [:text, :desc, :id])
    |> validate_required([:text])
    |> unique_constraint(:text)
  end

  def create_status(attrs, person) do
    %Status{}
    |> changeset(attrs)
    |> put_assoc(:person, person)
    |> Repo.insert!()
  end

  def upsert_status(attrs) do
    case Auth.Repo.get_by(__MODULE__, text: Map.get(attrs, "text")) do
      # create status
      nil ->
        create_status(attrs, Auth.Person.get_person_by_email(@admin_email))

      status ->
        status
    end
  end

  def list_statuses do
    Repo.all(__MODULE__)
  end
end