lib/remedy/schema/presence.ex

defmodule Remedy.Schema.Presence do
  @moduledoc """
  Presence object.

  """
  use Remedy.Schema

  @type t :: %__MODULE__{
          status: String.t(),
          activities: [Activity.t()],
          client_status: ClientStatus.t(),
          code: String.t()
        }

  @primary_key false
  embedded_schema do
    field :code, :string
    field :status, :string
    belongs_to :user, User
    belongs_to :guild, Guild
    embeds_many :activities, Activity, on_replace: :delete
    embeds_one :client_status, ClientStatus, on_replace: :delete
  end

  @doc false

  def changeset(model \\ %__MODULE__{}, params) do
    params =
      params
      |> Map.put(:status, params[:status] |> to_string())
      |> Map.put_new(:user_id, params[:user][:id])
      |> Map.delete(:user)

    model
    |> cast(params, [:code, :user_id, :guild_id, :status])
    |> cast_embed(:activities)
    |> cast_embed(:client_status)
  end
end

defmodule Remedy.Schema.Activity do
  @moduledoc """
  Discord Presence Activity Object
  """
  use Remedy.Schema

  @type t :: %__MODULE__{
          name: String.t(),
          type: integer(),
          party_id: String.t()
        }

  @primary_key false
  embedded_schema do
    field :id, :string
    field :name, :string
    field :type, :integer
    field :party_id, :string
    field :created_at, ISO8601
    field :details, :string
    field :assets, {:map, :string}
    field :party, {:map, :string}
    field :session_id, :string
    field :state, :string
    field :sync_id, :string
    field :timestamps, {:map, ISO8601}
  end

  @doc false
  def changeset(model \\ %__MODULE__{}, params) do
    model
    |> cast(params, [
      :id,
      :name,
      :type,
      :party_id,
      :created_at,
      :details,
      :assets,
      :party,
      :session_id,
      :state,
      :sync_id,
      :timestamps
    ])
  end
end

defmodule Remedy.Schema.ClientStatus do
  @moduledoc """
  Discord Presence Client Status Object
  """
  use Remedy.Schema
  @primary_key false

  @type t :: %__MODULE__{
          desktop: String.t(),
          mobile: String.t(),
          web: String.t()
        }

  @primary_key false
  embedded_schema do
    field :desktop, :string
    field :mobile, :string
    field :web, :string
  end

  def changeset(model \\ %__MODULE__{}, params) do
    params = for {k, v} <- params, into: %{}, do: {k, to_string(v)}

    model
    |> cast(params, [:desktop, :mobile, :web])
  end
end