Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

[feat] Adding a few DB triggers to delete permissions when items are soft deleted #48189

Merged
merged 2 commits into from
Feb 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion internal/database/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,18 @@
"Name": "delete_repo_ref_on_external_service_repos",
"Definition": "CREATE OR REPLACE FUNCTION public.delete_repo_ref_on_external_service_repos()\n RETURNS trigger\n LANGUAGE plpgsql\nAS $function$\n BEGIN\n -- if a repo is soft-deleted, delete every row that references that repo\n IF (OLD.deleted_at IS NULL AND NEW.deleted_at IS NOT NULL) THEN\n DELETE FROM\n external_service_repos\n WHERE\n repo_id = OLD.id;\n END IF;\n\n RETURN OLD;\n END;\n$function$\n"
},
{
"Name": "delete_user_repo_permissions_on_external_account_soft_delete",
"Definition": "CREATE OR REPLACE FUNCTION public.delete_user_repo_permissions_on_external_account_soft_delete()\n RETURNS trigger\n LANGUAGE plpgsql\nAS $function$ BEGIN\n IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN\n \tDELETE FROM user_repo_permissions WHERE user_id = OLD.user_id AND user_external_account_id = OLD.id;\n END IF;\n RETURN NULL;\n END\n$function$\n"
},
{
"Name": "delete_user_repo_permissions_on_repo_soft_delete",
"Definition": "CREATE OR REPLACE FUNCTION public.delete_user_repo_permissions_on_repo_soft_delete()\n RETURNS trigger\n LANGUAGE plpgsql\nAS $function$ BEGIN\n IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN\n \tDELETE FROM user_repo_permissions WHERE repo_id = NEW.id;\n END IF;\n RETURN NULL;\n END\n$function$\n"
},
{
"Name": "delete_user_repo_permissions_on_user_soft_delete",
"Definition": "CREATE OR REPLACE FUNCTION public.delete_user_repo_permissions_on_user_soft_delete()\n RETURNS trigger\n LANGUAGE plpgsql\nAS $function$ BEGIN\n IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN\n \tDELETE FROM user_repo_permissions WHERE user_id = OLD.id;\n END IF;\n RETURN NULL;\n END\n$function$\n"
},
{
"Name": "func_configuration_policies_delete",
"Definition": "CREATE OR REPLACE FUNCTION public.func_configuration_policies_delete()\n RETURNS trigger\n LANGUAGE plpgsql\nAS $function$\n BEGIN\n UPDATE configuration_policies_audit_logs\n SET record_deleted_at = NOW()\n WHERE policy_id IN (\n SELECT id FROM OLD\n );\n\n RETURN NULL;\n END;\n$function$\n"
Expand Down Expand Up @@ -19585,6 +19597,10 @@
"Name": "trig_delete_repo_ref_on_external_service_repos",
"Definition": "CREATE TRIGGER trig_delete_repo_ref_on_external_service_repos AFTER UPDATE OF deleted_at ON repo FOR EACH ROW EXECUTE FUNCTION delete_repo_ref_on_external_service_repos()"
},
{
"Name": "trig_delete_user_repo_permissions_on_repo_soft_delete",
"Definition": "CREATE TRIGGER trig_delete_user_repo_permissions_on_repo_soft_delete AFTER UPDATE ON repo FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_repo_soft_delete()"
},
{
"Name": "trig_recalc_repo_statistics_on_repo_delete",
"Definition": "CREATE TRIGGER trig_recalc_repo_statistics_on_repo_delete AFTER DELETE ON repo REFERENCING OLD TABLE AS oldtab FOR EACH STATEMENT EXECUTE FUNCTION recalc_repo_statistics_on_repo_delete()"
Expand Down Expand Up @@ -22233,7 +22249,12 @@
"ConstraintDefinition": "FOREIGN KEY (user_id) REFERENCES users(id)"
}
],
"Triggers": []
"Triggers": [
{
"Name": "trig_delete_user_repo_permissions_on_external_account_soft_dele",
"Definition": "CREATE TRIGGER trig_delete_user_repo_permissions_on_external_account_soft_dele AFTER UPDATE ON user_external_accounts FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_external_account_soft_delete()"
}
]
},
{
"Name": "user_pending_permissions",
Expand Down Expand Up @@ -23116,6 +23137,10 @@
}
],
"Triggers": [
{
"Name": "trig_delete_user_repo_permissions_on_user_soft_delete",
"Definition": "CREATE TRIGGER trig_delete_user_repo_permissions_on_user_soft_delete AFTER UPDATE ON users FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_user_soft_delete()"
},
{
"Name": "trig_invalidate_session_on_password_change",
"Definition": "CREATE TRIGGER trig_invalidate_session_on_password_change BEFORE UPDATE OF passwd ON users FOR EACH ROW EXECUTE FUNCTION invalidate_session_for_userid_on_password_change()"
Expand Down
4 changes: 4 additions & 0 deletions internal/database/schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -3007,6 +3007,7 @@ Referenced by:
Triggers:
trig_create_zoekt_repo_on_repo_insert AFTER INSERT ON repo FOR EACH ROW EXECUTE FUNCTION func_insert_zoekt_repo()
trig_delete_repo_ref_on_external_service_repos AFTER UPDATE OF deleted_at ON repo FOR EACH ROW EXECUTE FUNCTION delete_repo_ref_on_external_service_repos()
trig_delete_user_repo_permissions_on_repo_soft_delete AFTER UPDATE ON repo FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_repo_soft_delete()
trig_recalc_repo_statistics_on_repo_delete AFTER DELETE ON repo REFERENCING OLD TABLE AS oldtab FOR EACH STATEMENT EXECUTE FUNCTION recalc_repo_statistics_on_repo_delete()
trig_recalc_repo_statistics_on_repo_insert AFTER INSERT ON repo REFERENCING NEW TABLE AS newtab FOR EACH STATEMENT EXECUTE FUNCTION recalc_repo_statistics_on_repo_insert()
trig_recalc_repo_statistics_on_repo_update AFTER UPDATE ON repo REFERENCING OLD TABLE AS oldtab NEW TABLE AS newtab FOR EACH STATEMENT EXECUTE FUNCTION recalc_repo_statistics_on_repo_update()
Expand Down Expand Up @@ -3475,6 +3476,8 @@ Foreign-key constraints:
"user_external_accounts_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
Referenced by:
TABLE "user_repo_permissions" CONSTRAINT "user_repo_permissions_user_external_account_id_fkey" FOREIGN KEY (user_external_account_id) REFERENCES user_external_accounts(id) ON DELETE CASCADE
Triggers:
trig_delete_user_repo_permissions_on_external_account_soft_dele AFTER UPDATE ON user_external_accounts FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_external_account_soft_delete()

```

Expand Down Expand Up @@ -3668,6 +3671,7 @@ Referenced by:
TABLE "webhooks" CONSTRAINT "webhooks_created_by_user_id_fkey" FOREIGN KEY (created_by_user_id) REFERENCES users(id) ON DELETE SET NULL
TABLE "webhooks" CONSTRAINT "webhooks_updated_by_user_id_fkey" FOREIGN KEY (updated_by_user_id) REFERENCES users(id) ON DELETE SET NULL
Triggers:
trig_delete_user_repo_permissions_on_user_soft_delete AFTER UPDATE ON users FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_user_soft_delete()
trig_invalidate_session_on_password_change BEFORE UPDATE OF passwd ON users FOR EACH ROW EXECUTE FUNCTION invalidate_session_for_userid_on_password_change()
trig_soft_delete_user_reference_on_external_service AFTER UPDATE OF deleted_at ON users FOR EACH ROW EXECUTE FUNCTION soft_delete_user_reference_on_external_service()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
DROP TRIGGER IF EXISTS trig_delete_user_repo_permissions_on_repo_soft_delete ON repo;
DROP FUNCTION IF EXISTS delete_user_repo_permissions_on_repo_soft_delete;

DROP TRIGGER IF EXISTS trig_delete_user_repo_permissions_on_external_account_soft_delete ON user_external_accounts;
DROP FUNCTION IF EXISTS delete_user_repo_permissions_on_external_account_soft_delete;

DROP TRIGGER IF EXISTS trig_delete_user_repo_permissions_on_user_soft_delete ON users;
DROP FUNCTION IF EXISTS delete_user_repo_permissions_on_user_soft_delete;
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
name: add_triggers_for_soft_deleted_perms_entities
parents: [1677073533]
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
CREATE OR REPLACE FUNCTION delete_user_repo_permissions_on_repo_soft_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$ BEGIN
IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN
DELETE FROM user_repo_permissions WHERE repo_id = NEW.id;
END IF;
RETURN NULL;
END
$$;

DROP TRIGGER IF EXISTS trig_delete_user_repo_permissions_on_repo_soft_delete ON repo;
CREATE TRIGGER trig_delete_user_repo_permissions_on_repo_soft_delete AFTER UPDATE ON repo FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_repo_soft_delete();

CREATE OR REPLACE FUNCTION delete_user_repo_permissions_on_external_account_soft_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$ BEGIN
IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN
DELETE FROM user_repo_permissions WHERE user_id = OLD.user_id AND user_external_account_id = OLD.id;
END IF;
RETURN NULL;
END
$$;

DROP TRIGGER IF EXISTS trig_delete_user_repo_permissions_on_external_account_soft_delete ON user_external_accounts;
CREATE TRIGGER trig_delete_user_repo_permissions_on_external_account_soft_delete AFTER UPDATE ON user_external_accounts FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_external_account_soft_delete();

CREATE OR REPLACE FUNCTION delete_user_repo_permissions_on_user_soft_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$ BEGIN
IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN
DELETE FROM user_repo_permissions WHERE user_id = OLD.id;
END IF;
RETURN NULL;
END
$$;

DROP TRIGGER IF EXISTS trig_delete_user_repo_permissions_on_user_soft_delete ON users;
CREATE TRIGGER trig_delete_user_repo_permissions_on_user_soft_delete AFTER UPDATE ON users FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_user_soft_delete();
36 changes: 36 additions & 0 deletions migrations/frontend/squashed.sql
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,36 @@ CREATE FUNCTION delete_repo_ref_on_external_service_repos() RETURNS trigger
END;
$$;

CREATE FUNCTION delete_user_repo_permissions_on_external_account_soft_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$ BEGIN
IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN
DELETE FROM user_repo_permissions WHERE user_id = OLD.user_id AND user_external_account_id = OLD.id;
END IF;
RETURN NULL;
END
$$;

CREATE FUNCTION delete_user_repo_permissions_on_repo_soft_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$ BEGIN
IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN
DELETE FROM user_repo_permissions WHERE repo_id = NEW.id;
END IF;
RETURN NULL;
END
$$;

CREATE FUNCTION delete_user_repo_permissions_on_user_soft_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$ BEGIN
IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL THEN
DELETE FROM user_repo_permissions WHERE user_id = OLD.id;
END IF;
RETURN NULL;
END
$$;

CREATE FUNCTION func_configuration_policies_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$
Expand Down Expand Up @@ -5239,6 +5269,12 @@ CREATE TRIGGER trig_delete_batch_change_reference_on_changesets AFTER DELETE ON

CREATE TRIGGER trig_delete_repo_ref_on_external_service_repos AFTER UPDATE OF deleted_at ON repo FOR EACH ROW EXECUTE FUNCTION delete_repo_ref_on_external_service_repos();

CREATE TRIGGER trig_delete_user_repo_permissions_on_external_account_soft_dele AFTER UPDATE ON user_external_accounts FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_external_account_soft_delete();

CREATE TRIGGER trig_delete_user_repo_permissions_on_repo_soft_delete AFTER UPDATE ON repo FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_repo_soft_delete();

CREATE TRIGGER trig_delete_user_repo_permissions_on_user_soft_delete AFTER UPDATE ON users FOR EACH ROW EXECUTE FUNCTION delete_user_repo_permissions_on_user_soft_delete();

CREATE TRIGGER trig_invalidate_session_on_password_change BEFORE UPDATE OF passwd ON users FOR EACH ROW EXECUTE FUNCTION invalidate_session_for_userid_on_password_change();

CREATE TRIGGER trig_recalc_gitserver_repos_statistics_on_delete AFTER DELETE ON gitserver_repos REFERENCING OLD TABLE AS oldtab FOR EACH STATEMENT EXECUTE FUNCTION recalc_gitserver_repos_statistics_on_delete();
Expand Down