defmodule GitGud.Reports.Report do
use Ecto.Schema
import Ecto.Changeset
alias GitGud.Accounts.User
@valid_target_types ~w(issue issue_comment pull_request pr_comment actor inbox_delivery)
@valid_reasons ~w(spam abuse harassment off_topic other)
@valid_states ~w(open dismissed actioned)
schema "reports" do
field :target_type, :string
field :target_id, :integer
field :reason, :string
field :details, :string
field :state, :string, default: "open"
field :resolution_notes, :string
field :resolved_at, :utc_datetime
belongs_to :reporter, User
belongs_to :resolved_by, User
timestamps(type: :utc_datetime)
end
def open_changeset(report, attrs) do
report
|> cast(attrs, [:reporter_id, :target_type, :target_id, :reason, :details])
|> validate_required([:target_type, :target_id, :reason])
|> validate_inclusion(:target_type, @valid_target_types)
|> validate_inclusion(:reason, @valid_reasons)
|> validate_length(:details, max: 2000)
|> put_change(:state, "open")
|> unique_constraint(:target_id, name: :reports_unique_open_per_reporter)
end
def resolve_changeset(report, attrs) do
report
|> cast(attrs, [:state, :resolution_notes, :resolved_by_id])
|> validate_required([:state, :resolved_by_id])
|> validate_inclusion(:state, ~w(dismissed actioned))
|> validate_length(:resolution_notes, max: 2000)
|> put_change(:resolved_at, DateTime.utc_now(:second))
end
def valid_target_types, do: @valid_target_types
def valid_reasons, do: @valid_reasons
def valid_states, do: @valid_states
end
1.6 KiB · text
5af55d9