From 53c8f2b4abd1fd0f62a95a5b57ea6a7f57c205b5 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Thu, 10 Sep 2026 21:32:49 -0300 Subject: [PATCH] feat(db): enforce immutable inspection context --- ...98200000-f6-2-freeze-inspection-context.ts | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 api-v3/src/database/migrations/1790098200000-f6-2-freeze-inspection-context.ts diff --git a/api-v3/src/database/migrations/1790098200000-f6-2-freeze-inspection-context.ts b/api-v3/src/database/migrations/1790098200000-f6-2-freeze-inspection-context.ts new file mode 100644 index 0000000..286a5f6 --- /dev/null +++ b/api-v3/src/database/migrations/1790098200000-f6-2-freeze-inspection-context.ts @@ -0,0 +1,39 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class F62FreezeInspectionContext1790098200000 implements MigrationInterface { + name = 'F62FreezeInspectionContext1790098200000'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE OR REPLACE FUNCTION prevent_inspection_context_mutation() + RETURNS trigger LANGUAGE plpgsql AS $$ + BEGIN + IF NEW.operational_area_id IS DISTINCT FROM OLD.operational_area_id + OR NEW.scope_asset_id IS DISTINCT FROM OLD.scope_asset_id + OR NEW.operator_company_id IS DISTINCT FROM OLD.operator_company_id THEN + RAISE EXCEPTION USING + ERRCODE='23514', + MESSAGE='El Área, Yacimiento y Operadora de una Inspección quedan fijos desde su creación'; + END IF; + RETURN NEW; + END $$ + `); + + await queryRunner.query(` + DROP TRIGGER IF EXISTS trg_inspection_context_immutable ON inspection_visits + `); + await queryRunner.query(` + CREATE TRIGGER trg_inspection_context_immutable + BEFORE UPDATE OF operational_area_id, scope_asset_id, operator_company_id + ON inspection_visits + FOR EACH ROW EXECUTE FUNCTION prevent_inspection_context_mutation() + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + DROP TRIGGER IF EXISTS trg_inspection_context_immutable ON inspection_visits + `); + await queryRunner.query('DROP FUNCTION IF EXISTS prevent_inspection_context_mutation()'); + } +}