lib/remedy/schema/reaction.ex

defmodule Remedy.Schema.Reaction do
  @moduledoc """
  Message Reaction Object
  """
  use Remedy.Schema

  @type t :: %__MODULE__{
          user: User.t(),
          channel: Channel.t(),
          message: Message.t(),
          guild: Guild.t(),
          member: Member.t(),
          count: integer(),
          me: boolean(),
          emoji: Emoji.t()
        }

  # Primary key :message_id ++ :user_id ++ :emoji_id
  @primary_key {:id, :id, autogenerate: false}
  embedded_schema do
    embeds_one :user, User
    embeds_one :channel, Channel
    embeds_one :message, Message
    embeds_one :guild, Guild
    embeds_one :member, Member
    field :count, :integer
    field :me, :boolean
    embeds_one :emoji, Emoji
  end

  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

  def new(params), do: changeset(params) |> apply_changes()
end