diff --git a/priv/repo/migrations/20260305152524_fix_agent_cascade_deletes.exs b/priv/repo/migrations/20260305152524_fix_agent_cascade_deletes.exs new file mode 100644 index 00000000..d24248fd --- /dev/null +++ b/priv/repo/migrations/20260305152524_fix_agent_cascade_deletes.exs @@ -0,0 +1,64 @@ +defmodule Towerops.Repo.Migrations.FixAgentCascadeDeletes do + use Ecto.Migration + + def up do + # Drop and recreate the foreign key constraint on agent_tokens.organization_id + # Change from :delete_all to :restrict to prevent accidental data loss + execute """ + ALTER TABLE agent_tokens + DROP CONSTRAINT agent_tokens_organization_id_fkey + """ + + execute """ + ALTER TABLE agent_tokens + ADD CONSTRAINT agent_tokens_organization_id_fkey + FOREIGN KEY (organization_id) + REFERENCES organizations(id) + ON DELETE RESTRICT + """ + + # Drop and recreate the foreign key constraint on agent_assignments.agent_token_id + # Change from :delete_all to :restrict to prevent orphaned assignments + execute """ + ALTER TABLE agent_assignments + DROP CONSTRAINT agent_assignments_agent_token_id_fkey + """ + + execute """ + ALTER TABLE agent_assignments + ADD CONSTRAINT agent_assignments_agent_token_id_fkey + FOREIGN KEY (agent_token_id) + REFERENCES agent_tokens(id) + ON DELETE RESTRICT + """ + end + + def down do + # Restore original cascade delete behavior + execute """ + ALTER TABLE agent_assignments + DROP CONSTRAINT agent_assignments_agent_token_id_fkey + """ + + execute """ + ALTER TABLE agent_assignments + ADD CONSTRAINT agent_assignments_agent_token_id_fkey + FOREIGN KEY (agent_token_id) + REFERENCES agent_tokens(id) + ON DELETE CASCADE + """ + + execute """ + ALTER TABLE agent_tokens + DROP CONSTRAINT agent_tokens_organization_id_fkey + """ + + execute """ + ALTER TABLE agent_tokens + ADD CONSTRAINT agent_tokens_organization_id_fkey + FOREIGN KEY (organization_id) + REFERENCES organizations(id) + ON DELETE CASCADE + """ + end +end