Skip to content

Commit 6493f5d

Browse files
Add service for inserting new types
1 parent e34c50b commit 6493f5d

File tree

2 files changed

+74
-10
lines changed

2 files changed

+74
-10
lines changed

ee/ephemeral_environments/lib/ephemeral_environments/repo/ephemeral_environment_type.ex

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,44 @@ defmodule EphemeralEnvironments.Repo.EphemeralEnvironmentType do
66
@foreign_key_type :binary_id
77

88
schema "ephemeral_environment_types" do
9-
field :org_id, :binary_id
10-
field :name, :string
11-
field :description, :string
12-
field :created_by, :binary_id
13-
field :last_modified_by, :binary_id
14-
field :state, :string
15-
field :max_number_of_instances, :integer
9+
field(:org_id, :binary_id)
10+
field(:name, :string)
11+
field(:description, :string)
12+
field(:created_by, :binary_id)
13+
field(:last_modified_by, :binary_id)
14+
field(:state, Ecto.Enum, values: [:draft, :ready, :cordoned, :deleted])
15+
field(:max_number_of_instances, :integer)
1616

1717
timestamps()
1818
end
1919

2020
@doc false
2121
def changeset(ephemeral_environment_type, attrs) do
2222
ephemeral_environment_type
23-
|> cast(attrs, [:org_id, :name, :description, :created_by, :last_modified_by, :state, :max_number_of_instances])
23+
|> cast(attrs, [
24+
:org_id,
25+
:name,
26+
:description,
27+
:created_by,
28+
:last_modified_by,
29+
:state,
30+
:max_number_of_instances
31+
])
2432
|> validate_required([:org_id, :name, :created_by, :last_modified_by, :state])
33+
|> validate_uuid(:org_id)
34+
|> validate_uuid(:created_by)
35+
|> validate_uuid(:last_modified_by)
2536
|> validate_length(:name, min: 1, max: 255)
2637
|> validate_length(:description, max: 1000)
27-
|> validate_inclusion(:state, [:draft, :ready, :cordoned, :deleted])
2838
|> validate_number(:max_number_of_instances, greater_than: 0)
2939
end
30-
end
40+
41+
defp validate_uuid(changeset, field) do
42+
validate_change(changeset, field, fn ^field, value ->
43+
case Ecto.UUID.cast(value) do
44+
{:ok, _} -> []
45+
:error -> [{field, "must be a valid UUID"}]
46+
end
47+
end)
48+
end
49+
end
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
defmodule EphemeralEnvironments.Service.EphemeralEnvironmentType do
2+
alias EphemeralEnvironments.Repo
3+
alias EphemeralEnvironments.Repo.EphemeralEnvironmentType, as: Schema
4+
5+
@doc """
6+
Creates a new ephemeral environment type.
7+
8+
## Parameters
9+
- attrs: Map with keys:
10+
- org_id (required)
11+
- name (required)
12+
- created_by (required)
13+
- state (optional, defaults to :draft)
14+
- description (optional)
15+
- max_number_of_instances (optional)
16+
17+
## Returns
18+
- {:ok, %Schema{}} on success
19+
- {:error, String.t()} on validation failure
20+
"""
21+
def create(attrs) do
22+
attrs = Map.put(attrs, :last_modified_by, attrs[:created_by])
23+
attrs = Map.put_new(attrs, :state, :draft)
24+
25+
%Schema{}
26+
|> Schema.changeset(attrs)
27+
|> Repo.insert()
28+
|> case do
29+
{:ok, record} -> {:ok, record}
30+
{:error, changeset} -> {:error, format_errors(changeset)}
31+
end
32+
end
33+
34+
defp format_errors(changeset) do
35+
Ecto.Changeset.traverse_errors(changeset, fn {msg, opts} ->
36+
Enum.reduce(opts, msg, fn {key, value}, acc ->
37+
String.replace(acc, "%{#{key}}", to_string(value))
38+
end)
39+
end)
40+
|> Enum.map(fn {field, errors} ->
41+
"#{field}: #{Enum.join(errors, ", ")}"
42+
end)
43+
|> Enum.join("; ")
44+
end
45+
end

0 commit comments

Comments
 (0)