From 6f88a635cc6b5238cac7ce64522b682e5d6aca81 Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 17 Jun 2025 15:28:52 +0200 Subject: [PATCH] fix member deletion: property delete on cascade --- lib/membership/member.ex | 9 +- lib/membership/property.ex | 4 + .../20250617132424_member_delete.exs | 38 +++++++ .../repo/properties/20250617132424.json | 105 ++++++++++++++++++ 4 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 priv/repo/migrations/20250617132424_member_delete.exs create mode 100644 priv/resource_snapshots/repo/properties/20250617132424.json diff --git a/lib/membership/member.ex b/lib/membership/member.ex index 55e6a0e..055cc48 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -9,7 +9,7 @@ defmodule Mv.Membership.Member do end actions do - defaults [:read, :destroy] + defaults [:read] create :create_member do primary? true @@ -34,6 +34,11 @@ defmodule Mv.Membership.Member do change manage_relationship(:properties, type: :create) end + destroy :destroy do + primary? true + change Ash.Resource.Change.Builtins.cascade_destroy(:properties) + end + update :update_member do primary? true require_atomic? false @@ -211,6 +216,6 @@ defmodule Mv.Membership.Member do end relationships do - has_many :properties, Mv.Membership.Property + has_many :properties, Mv.Membership.Property, destination_attribute: :member_id end end diff --git a/lib/membership/property.ex b/lib/membership/property.ex index 0bd5eab..2c432a8 100644 --- a/lib/membership/property.ex +++ b/lib/membership/property.ex @@ -6,6 +6,10 @@ defmodule Mv.Membership.Property do postgres do table "properties" repo Mv.Repo + + references do + reference :member, on_delete: :delete + end end actions do diff --git a/priv/repo/migrations/20250617132424_member_delete.exs b/priv/repo/migrations/20250617132424_member_delete.exs new file mode 100644 index 0000000..f0f539a --- /dev/null +++ b/priv/repo/migrations/20250617132424_member_delete.exs @@ -0,0 +1,38 @@ +defmodule Mv.Repo.Migrations.MemberDelete do + @moduledoc """ + Updates resources based on their most recent snapshots. + + This file was autogenerated with `mix ash_postgres.generate_migrations` + """ + + use Ecto.Migration + + def up do + drop constraint(:properties, "properties_member_id_fkey") + + alter table(:properties) do + modify :member_id, + references(:members, + column: :id, + name: "properties_member_id_fkey", + type: :uuid, + prefix: "public", + on_delete: :delete_all + ) + end + end + + def down do + drop constraint(:properties, "properties_member_id_fkey") + + alter table(:properties) do + modify :member_id, + references(:members, + column: :id, + name: "properties_member_id_fkey", + type: :uuid, + prefix: "public" + ) + end + end +end diff --git a/priv/resource_snapshots/repo/properties/20250617132424.json b/priv/resource_snapshots/repo/properties/20250617132424.json new file mode 100644 index 0000000..49e3b48 --- /dev/null +++ b/priv/resource_snapshots/repo/properties/20250617132424.json @@ -0,0 +1,105 @@ +{ + "attributes": [ + { + "allow_nil?": false, + "default": "fragment(\"gen_random_uuid()\")", + "generated?": false, + "precision": null, + "primary_key?": true, + "references": null, + "scale": null, + "size": null, + "source": "id", + "type": "uuid" + }, + { + "allow_nil?": true, + "default": "nil", + "generated?": false, + "precision": null, + "primary_key?": false, + "references": null, + "scale": null, + "size": null, + "source": "value", + "type": "map" + }, + { + "allow_nil?": true, + "default": "nil", + "generated?": false, + "precision": null, + "primary_key?": false, + "references": { + "deferrable": false, + "destination_attribute": "id", + "destination_attribute_default": null, + "destination_attribute_generated": null, + "index?": false, + "match_type": null, + "match_with": null, + "multitenancy": { + "attribute": null, + "global": null, + "strategy": null + }, + "name": "properties_member_id_fkey", + "on_delete": "delete", + "on_update": null, + "primary_key?": true, + "schema": "public", + "table": "members" + }, + "scale": null, + "size": null, + "source": "member_id", + "type": "uuid" + }, + { + "allow_nil?": true, + "default": "nil", + "generated?": false, + "precision": null, + "primary_key?": false, + "references": { + "deferrable": false, + "destination_attribute": "id", + "destination_attribute_default": null, + "destination_attribute_generated": null, + "index?": false, + "match_type": null, + "match_with": null, + "multitenancy": { + "attribute": null, + "global": null, + "strategy": null + }, + "name": "properties_property_type_id_fkey", + "on_delete": null, + "on_update": null, + "primary_key?": true, + "schema": "public", + "table": "property_types" + }, + "scale": null, + "size": null, + "source": "property_type_id", + "type": "uuid" + } + ], + "base_filter": null, + "check_constraints": [], + "custom_indexes": [], + "custom_statements": [], + "has_create_action": true, + "hash": "4F17BE0106435A1D75D46A3ABDE6A3DA20FC9B1C43D101B6C310009279DD7CBA", + "identities": [], + "multitenancy": { + "attribute": null, + "global": null, + "strategy": null + }, + "repo": "Elixir.Mv.Repo", + "schema": null, + "table": "properties" +} \ No newline at end of file