defmodule MishkaInstaller.Database.DependencySchema do
@moduledoc """
This module has been implemented to create the `Dependencies` table schema.
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "dependencies" do
field(:app, :string)
field(:version, :string)
field(:type, MishkaInstaller.DependencyEnum)
field(:dependency_type, MishkaInstaller.DependencyTypeEnum)
field(:url, :string)
field(:git_tag, :string)
field(:custom_command, :string)
field(:dependencies, {:array, :map}, default: [])
timestamps(type: :utc_datetime)
end
@all_fields ~w(app version type url dependency_type git_tag custom_command dependencies)a
@required_fields ~w(app version type dependency_type)a
@spec changeset(struct(), map()) :: Ecto.Changeset.t()
def changeset(struct, params \\ %{}) do
struct
|> cast(params, @all_fields)
|> validate_required(@required_fields,
message:
Gettext.dgettext(
MishkaInstaller.gettext(),
"mishka_installer",
"You should fill all the required fields."
)
)
|> unique_constraint(:name,
name: :index_dependencies_on_app,
message:
Gettext.dgettext(
MishkaInstaller.gettext(),
"mishka_installer",
"Each dependency should have a unique app name, this name existed before."
)
)
end
end