cannery/lib/cannery/invites/invite.ex

60 lines
1.8 KiB
Elixir
Raw Normal View History

2021-09-10 00:23:26 -04:00
defmodule Cannery.Invites.Invite do
2022-01-22 21:40:29 -05:00
@moduledoc """
An invite, created by an admin to allow someone to join their instance. An
invite can be enabled or disabled, and can have an optional number of uses if
`:uses_left` is defined.
"""
2021-09-10 00:23:26 -04:00
use Ecto.Schema
import Ecto.Changeset
2022-01-22 21:40:29 -05:00
alias Ecto.{Changeset, UUID}
alias Cannery.{Accounts.User, Invites.Invite}
2021-09-10 00:23:26 -04:00
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "invites" do
field :name, :string
field :token, :string
field :uses_left, :integer, default: nil
field :disabled_at, :naive_datetime
2021-09-12 19:26:04 -04:00
2022-01-22 21:40:29 -05:00
belongs_to :user, User
2021-09-10 00:23:26 -04:00
timestamps()
end
2022-01-22 21:40:29 -05:00
@type t :: %Invite{
2022-01-31 20:08:01 -05:00
id: id(),
2021-09-10 00:23:26 -04:00
name: String.t(),
token: String.t(),
uses_left: integer() | nil,
disabled_at: NaiveDateTime.t(),
2022-01-22 21:40:29 -05:00
user: User.t(),
2022-01-31 20:08:01 -05:00
user_id: User.id(),
2022-01-22 21:40:29 -05:00
inserted_at: NaiveDateTime.t(),
updated_at: NaiveDateTime.t()
2021-09-10 00:23:26 -04:00
}
2022-01-22 21:40:29 -05:00
@type new_invite :: %Invite{}
2022-01-31 20:08:01 -05:00
@type id :: UUID.t()
2022-11-23 20:46:41 -05:00
@type changeset :: Changeset.t(t() | new_invite())
2022-01-22 21:40:29 -05:00
2021-09-12 19:26:04 -04:00
@doc false
2022-11-23 20:46:41 -05:00
@spec create_changeset(User.t(), token :: binary(), attrs :: map()) :: changeset()
def create_changeset(%User{id: user_id}, token, attrs) do
%Invite{}
2022-07-04 21:16:09 -04:00
|> change(token: token, user_id: user_id)
|> cast(attrs, [:name, :uses_left, :disabled_at])
2021-09-12 19:26:04 -04:00
|> validate_required([:name, :token, :user_id])
|> validate_number(:uses_left, greater_than_or_equal_to: 0)
end
2022-02-14 20:51:09 -05:00
@doc false
2022-11-23 20:46:41 -05:00
@spec update_changeset(t() | new_invite(), attrs :: map()) :: changeset()
2022-02-14 20:51:09 -05:00
def update_changeset(invite, attrs) do
invite
2022-02-16 20:52:42 -05:00
|> cast(attrs, [:name, :uses_left, :disabled_at])
2022-07-01 19:53:44 -04:00
|> validate_required([:name])
2022-02-14 20:51:09 -05:00
|> validate_number(:uses_left, greater_than_or_equal_to: 0)
end
2021-09-10 00:23:26 -04:00
end