Skip to content

Commit 08e7984

Browse files
committed
release history on deployment group creation
1 parent ec13c92 commit 08e7984

File tree

7 files changed

+151
-52
lines changed

7 files changed

+151
-52
lines changed

lib/nerves_hub/managed_deployments.ex

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ defmodule NervesHub.ManagedDeployments do
195195
Update a deployment
196196
197197
- Records audit logs depending on changes
198-
- Creates deployment release record if firmware_id changed (requires user_id in params)
198+
- Creates deployment release record if firmware_id or archive_id changed
199199
"""
200200
@spec update_deployment_group(DeploymentGroup.t(), map, User.t()) ::
201201
{:ok, DeploymentGroup.t()} | {:error, Changeset.t()}
@@ -207,14 +207,17 @@ defmodule NervesHub.ManagedDeployments do
207207
|> Repo.preload(:firmware)
208208
|> DeploymentGroup.update_changeset(params)
209209

210+
create_deployment_release? =
211+
Map.has_key?(changeset.changes, :firmware_id) or
212+
Map.has_key?(changeset.changes, :archive_id)
213+
210214
with {:ok, deployment_group} <- Repo.update(changeset),
211215
deployment_group = Repo.preload(deployment_group, [:firmware], force: true),
212216
:ok <- create_audit_logs!(deployment_group, changeset),
213217
{:ok, _deployment_group} <-
214-
maybe_create_deployment_release(
215-
deployment_group,
216-
changeset.changes,
217-
user.id
218+
if(create_deployment_release?,
219+
do: create_deployment_release(deployment_group, user.id),
220+
else: {:ok, nil}
218221
) do
219222
{:ok, {deployment_group, changeset}}
220223
end
@@ -240,9 +243,7 @@ defmodule NervesHub.ManagedDeployments do
240243
end
241244
end
242245

243-
# Create deployment release if firmware or archive changed
244-
defp maybe_create_deployment_release(deployment_group, changes, user_id)
245-
when is_map_key(changes, :firmware_id) or is_map_key(changes, :archive_id) do
246+
defp create_deployment_release(deployment_group, user_id) do
246247
%DeploymentRelease{}
247248
|> DeploymentRelease.changeset(%{
248249
deployment_group_id: deployment_group.id,
@@ -253,8 +254,6 @@ defmodule NervesHub.ManagedDeployments do
253254
|> Repo.insert()
254255
end
255256

256-
defp maybe_create_deployment_release(_deployment_group, _changes, _user_id), do: {:ok, nil}
257-
258257
defp create_audit_logs!(deployment_group, changeset) do
259258
Enum.each(changeset.changes, fn
260259
{:archive_id, archive_id} ->
@@ -348,11 +347,17 @@ defmodule NervesHub.ManagedDeployments do
348347
Ecto.Changeset.change(%DeploymentGroup{})
349348
end
350349

351-
@spec create_deployment_group(map(), Product.t()) ::
350+
@spec create_deployment_group(map(), Product.t(), User.t()) ::
352351
{:ok, DeploymentGroup.t()} | {:error, Changeset.t()}
353-
def create_deployment_group(params, %Product{} = product) do
354-
DeploymentGroup.create_changeset(params, product)
355-
|> Repo.insert()
352+
def create_deployment_group(params, %Product{} = product, user) do
353+
Repo.transact(fn ->
354+
changeset = DeploymentGroup.create_changeset(params, product)
355+
356+
with {:ok, deployment_group} <- Repo.insert(changeset),
357+
{:ok, _release} <- create_deployment_release(deployment_group, user.id) do
358+
{:ok, deployment_group}
359+
end
360+
end)
356361
|> case do
357362
{:ok, deployment_group} ->
358363
deployment_created_event(deployment_group)

lib/nerves_hub/managed_deployments/deployment_group.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ defmodule NervesHub.ManagedDeployments.DeploymentGroup do
3838

3939
has_many(:inflight_updates, InflightUpdate, foreign_key: :deployment_id)
4040
has_many(:devices, Device, foreign_key: :deployment_id, on_delete: :nilify_all)
41-
has_many(:deployment_releases, DeploymentRelease)
41+
has_many(:deployment_releases, DeploymentRelease, on_delete: :delete_all)
4242
has_many(:update_stats, UpdateStat, on_delete: :nilify_all, foreign_key: :deployment_id)
4343

4444
embeds_one :conditions, __MODULE__.Conditions, primary_key: false, on_replace: :update do

lib/nerves_hub_web/controllers/api/deployment_group_controller.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ defmodule NervesHubWeb.API.DeploymentGroupController do
2929
uuid ->
3030
with {:ok, firmware} <- Firmwares.get_firmware_by_product_and_uuid(product, uuid),
3131
params = Map.put(params, "firmware_id", firmware.id),
32-
{:ok, deployment_group} <- ManagedDeployments.create_deployment_group(params, product) do
32+
{:ok, deployment_group} <- ManagedDeployments.create_deployment_group(params, product, user) do
3333
DeploymentGroupTemplates.audit_deployment_created(user, deployment_group)
3434

3535
conn

lib/nerves_hub_web/live/deployment_groups/new.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ defmodule NervesHubWeb.Live.DeploymentGroups.New do
143143

144144
%{user: user, org: org, product: product} = socket.assigns
145145

146-
ManagedDeployments.create_deployment_group(params, product)
146+
ManagedDeployments.create_deployment_group(params, product, user)
147147
|> case do
148148
{:ok, deployment_group} ->
149149
_ = DeploymentGroupTemplates.audit_deployment_created(user, deployment_group)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule NervesHub.Repo.Migrations.AddCascadeDeleteToDeploymentReleases do
2+
use Ecto.Migration
3+
4+
def up do
5+
# Drop the existing foreign key constraint
6+
drop constraint(:deployment_releases, "deployment_releases_deployment_group_id_fkey")
7+
8+
# Add it back with cascade delete
9+
alter table(:deployment_releases) do
10+
modify :deployment_group_id, references(:deployments, on_delete: :delete_all), null: false
11+
end
12+
end
13+
14+
def down do
15+
# Drop the cascade delete foreign key constraint
16+
drop constraint(:deployment_releases, "deployment_releases_deployment_group_id_fkey")
17+
18+
# Add it back without cascade delete (original state)
19+
alter table(:deployment_releases) do
20+
modify :deployment_group_id, references(:deployments), null: false
21+
end
22+
end
23+
end

0 commit comments

Comments
 (0)