From 1a065257d03ad8df575f06f687d69d83728a243a Mon Sep 17 00:00:00 2001 From: sjaanus Date: Fri, 16 May 2025 10:51:01 +0300 Subject: [PATCH 1/2] fix: do not allow creating cr for same environment --- .../20250515252526-cr-uniqueness.js | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/migrations/20250515252526-cr-uniqueness.js diff --git a/src/migrations/20250515252526-cr-uniqueness.js b/src/migrations/20250515252526-cr-uniqueness.js new file mode 100644 index 0000000000..4b50f40b3f --- /dev/null +++ b/src/migrations/20250515252526-cr-uniqueness.js @@ -0,0 +1,32 @@ +exports.up = (db, callback) => { + db.runSql( + ` + WITH ranked AS ( + SELECT id, + ROW_NUMBER() OVER ( + PARTITION BY created_by, project, environment + ORDER BY created_at DESC + ) AS rn + FROM change_requests + WHERE state NOT IN ('Applied', 'Cancelled', 'Rejected', 'Scheduled') + ) + UPDATE change_requests + SET state = 'Cancelled' + WHERE id IN ( + SELECT id FROM ranked WHERE rn > 1 + ); + + CREATE UNIQUE INDEX unique_pending_request_per_user_project_env + ON change_requests (created_by, project, environment) + WHERE state NOT IN ('Applied', 'Cancelled', 'Rejected', 'Scheduled'); + `, + callback, + ); +}; + +exports.down = (db, callback) => { + db.runSql( + ` DROP INDEX IF EXISTS unique_pending_request_per_user_project_env;`, + callback, + ); +}; From c25e1bdb2468b528c1c573625071622e683b3aea Mon Sep 17 00:00:00 2001 From: sjaanus Date: Fri, 16 May 2025 10:56:33 +0300 Subject: [PATCH 2/2] fix: do not allow creating cr for same environment --- src/migrations/20250515252526-cr-uniqueness.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/migrations/20250515252526-cr-uniqueness.js b/src/migrations/20250515252526-cr-uniqueness.js index 4b50f40b3f..1ec639abf6 100644 --- a/src/migrations/20250515252526-cr-uniqueness.js +++ b/src/migrations/20250515252526-cr-uniqueness.js @@ -16,7 +16,7 @@ exports.up = (db, callback) => { SELECT id FROM ranked WHERE rn > 1 ); - CREATE UNIQUE INDEX unique_pending_request_per_user_project_env + CREATE UNIQUE INDEX IF NOT EXISTS unique_pending_request_per_user_project_env ON change_requests (created_by, project, environment) WHERE state NOT IN ('Applied', 'Cancelled', 'Rejected', 'Scheduled'); `,