defmodule GitGud.Organizations.Invitation do
use Ecto.Schema
import Ecto.Changeset
alias GitGud.Accounts.User
alias GitGud.Organizations.Organization
@valid_states ~w(pending accepted declined revoked)
@valid_roles ~w(admin member)
schema "organization_invitations" do
field :role, :string, default: "member"
field :state, :string, default: "pending"
field :responded_at, :utc_datetime
belongs_to :organization, Organization
belongs_to :invited_user, User
belongs_to :invited_by, User
timestamps(type: :utc_datetime)
end
def changeset(invitation, attrs) do
invitation
|> cast(attrs, [:organization_id, :invited_user_id, :invited_by_id, :role])
|> validate_required([:organization_id, :invited_user_id])
|> validate_inclusion(:role, @valid_roles)
|> unique_constraint([:organization_id, :invited_user_id],
name: :organization_invitations_pending_index,
message: "has already been invited"
)
end
@doc "Answer an invitation. Stamps `responded_at` alongside the new state."
def respond_changeset(invitation, state) when state in ["accepted", "declined", "revoked"] do
change(invitation, state: state, responded_at: DateTime.utc_now(:second))
end
def pending?(%__MODULE__{state: "pending"}), do: true
def pending?(%__MODULE__{}), do: false
def valid_states, do: @valid_states
def valid_roles, do: @valid_roles
end
neiam /gitgud
Git Gud
public · Issues · Pulls · Labels · Forks · Compare · Actions success · Packages
⭐
Log in to mark this repository.
1.4 KiB · text
History
c68e1e7