defmodule GitGud.Federation.SuggestedInstanceBlock do
use Ecto.Schema
import Ecto.Changeset
alias GitGud.Accounts.User
@statuses ~w(pending approved dismissed)
schema "suggested_instance_blocks" do
field :host, :string
field :reasons, :string
field :peers, {:array, :string}, default: []
field :peer_count, :integer, default: 0
field :first_seen_at, :utc_datetime
field :last_seen_at, :utc_datetime
field :status, :string, default: "pending"
field :resolved_at, :utc_datetime
belongs_to :resolved_by, User
timestamps(type: :utc_datetime)
end
def upsert_changeset(struct, attrs) do
struct
|> cast(attrs, [
:host,
:reasons,
:peers,
:peer_count,
:first_seen_at,
:last_seen_at,
:status
])
|> validate_required([:host, :peer_count])
|> validate_length(:host, max: 250)
|> validate_inclusion(:status, @statuses)
|> unique_constraint(:host)
end
def resolve_changeset(struct, status, user_id) when status in ~w(approved dismissed) do
change(struct,
status: status,
resolved_by_id: user_id,
resolved_at: DateTime.utc_now(:second)
)
end
def statuses, do: @statuses
end
1.2 KiB · text
5af55d9