philomena/lib/philomena/bans/user.ex

60 lines
1.6 KiB
Elixir

defmodule Philomena.Bans.User do
use Ecto.Schema
import Ecto.Changeset
alias Philomena.Users.User
alias Philomena.Repo
alias Philomena.Schema.Time
alias Philomena.Schema.BanId
schema "user_bans" do
belongs_to :user, User
belongs_to :banning_user, User
field :reason, :string
field :note, :string
field :enabled, :boolean, default: true
field :valid_until, :utc_datetime
field :generated_ban_id, :string
field :override_ip_ban, :boolean, default: false
field :username, :string, virtual: true
field :until, :string, virtual: true
timestamps(inserted_at: :created_at)
end
@doc false
def changeset(user_ban, attrs) do
user_ban
|> cast(attrs, [])
|> Time.propagate_time(:valid_until, :until)
|> populate_username()
end
def save_changeset(user_ban, attrs) do
user_ban
|> cast(attrs, [:reason, :note, :enabled, :override_ip_ban, :username, :until])
|> Time.assign_time(:until, :valid_until)
|> populate_user_id()
|> BanId.put_ban_id("U")
|> validate_required([:reason, :enabled, :user_id, :valid_until])
end
defp populate_username(changeset) do
case maybe_get_by(:id, get_field(changeset, :user_id)) do
nil -> changeset
user -> put_change(changeset, :username, user.name)
end
end
defp populate_user_id(changeset) do
case maybe_get_by(:name, get_field(changeset, :username)) do
nil -> changeset
%{id: id} -> put_change(changeset, :user_id, id)
end
end
defp maybe_get_by(_field, nil), do: nil
defp maybe_get_by(field, value), do: Repo.get_by(User, [{field, value}])
end