1.5 KiB · text 5af55d9
defmodule GitGud.PullRequests.PrReview do
use Ecto.Schema
import Ecto.Changeset
alias GitGud.Accounts.User
alias GitGud.Federation.Actor
alias GitGud.PullRequests.PullRequest
@valid_states ~w(approved changes_requested commented)
schema "pr_reviews" do
field :state, :string
field :body, :string
# Federated-origin fields. Set when the review arrived via an
# inbound Like / Dislike activity. Local reviews leave these nil
# and carry a `reviewer_id` instead.
field :activity_url, :string
belongs_to :pull_request, PullRequest
belongs_to :reviewer, User
belongs_to :source_actor, Actor
timestamps(type: :utc_datetime)
end
def changeset(review, attrs) do
review
|> cast(attrs, [:state, :body])
|> validate_required([:state])
|> validate_inclusion(:state, @valid_states)
|> validate_length(:body, max: 65_535)
end
@doc "Changeset for a review arriving via federation."
def federated_changeset(struct, attrs) do
struct
|> cast(attrs, [
:state,
:body,
:activity_url,
:source_actor_id,
:pull_request_id
])
|> validate_required([:state, :source_actor_id, :pull_request_id])
|> validate_inclusion(:state, @valid_states)
|> validate_length(:body, max: 65_535)
|> unique_constraint(:activity_url, name: :pr_reviews_activity_url_index)
end
def federated?(%__MODULE__{source_actor_id: sid}) when is_integer(sid), do: true
def federated?(_), do: false
def valid_states, do: @valid_states
end