lib/database/activity_schema.ex

defmodule MishkaInstaller.Database.ActivitySchema do
  @moduledoc """
  This module has been implemented to create the `Activities` table schema.
  """
  use Ecto.Schema

  import Ecto.Changeset
  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id

  schema "activities" do
    field(:type, MishkaInstaller.ActivitiesTypeEnum)
    field(:section, MishkaInstaller.ActivitiesSectionEnum)
    field(:section_id, :binary_id, primary_key: false)
    field(:priority, MishkaInstaller.ContentPriorityEnum)
    field(:status, MishkaInstaller.ActivitiesStatusEnum)
    field(:action, MishkaInstaller.ActivitiesActionEnum)
    field(:extra, :map)

    timestamps(type: :utc_datetime)
  end

  @all_fields ~w(type section section_id priority status action extra)a
  @all_required ~w(type section priority status action)a

  @spec changeset(struct(), map()) :: Ecto.Changeset.t()
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, @all_fields)
    |> validate_required(@all_required,
      message:
        Gettext.dgettext(
          MishkaInstaller.gettext(),
          "mishka_installer",
          "You should fill all the required fields."
        )
    )
    |> MishkaInstaller.Database.Helper.validate_binary_id(:section_id)
  end
end