Current section
Files
Jump to
Current section
Files
lib/aludel/projects/project.ex
defmodule Aludel.Projects.Project do
@moduledoc """
Schema for organizing prompts and test suites into projects.
"""
use Ecto.Schema
import Ecto.Changeset
alias Aludel.Evals.Suite
alias Aludel.Prompts.Prompt
alias Ecto.Changeset
@type t :: %__MODULE__{}
@types [:prompt, :suite]
@required_fields ~w(name type)a
@optional_fields ~w()a
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "projects" do
field(:name, :string)
field(:type, Ecto.Enum, values: @types)
has_many(:prompts, Prompt)
has_many(:suites, Suite)
timestamps(type: :utc_datetime)
end
@doc """
Changeset for creating or updating a project.
"""
@spec changeset(t(), map()) :: Changeset.t()
def changeset(project, attrs) do
project
|> cast(attrs, @required_fields ++ @optional_fields)
|> update_change(:name, fn
name when is_binary(name) -> String.trim(name)
name -> name
end)
|> validate_required(@required_fields)
|> validate_length(:name, min: 1, max: 255)
end
@doc false
@spec types() :: [atom()]
def types, do: @types
end