lib/remedy/schema/invite.ex

defmodule Remedy.Schema.Invite do
  @moduledoc """
  Invite Object
  """
  use Remedy.Schema

  @type t :: %__MODULE__{
          target_type: integer(),
          approximate_presence_count: integer(),
          approximate_member_count: integer(),
          expires_at: ISO8601.t(),
          uses: integer(),
          max_uses: integer(),
          max_age: integer(),
          temporary: integer(),
          created_at: integer(),
          target_user: User.t(),
          channel: Channel.t(),
          guild: Guild.t(),
          inviter: User.t()
        }

  @primary_key {:code, :string, autogenerate: false}
  schema "invites" do
    field :target_type, :integer
    field :approximate_presence_count, :integer
    field :approximate_member_count, :integer
    field :expires_at, ISO8601
    field :uses, :integer
    field :max_uses, :integer
    field :max_age, :integer
    field :temporary, :integer
    field :created_at, :integer
    embeds_one :target_user, User
    belongs_to :channel, Channel
    belongs_to :guild, Guild
    belongs_to :inviter, User
  end

  @doc false

  def changeset(model \\ %__MODULE__{}, params) do
    fields = __MODULE__.__schema__(:fields)
    embeds = __MODULE__.__schema__(:embeds)
    cast_model = cast(model, params, fields -- embeds)

    Enum.reduce(embeds, cast_model, fn embed, cast_model ->
      cast_embed(cast_model, embed)
    end)
  end
end