diff --git a/api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts b/api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts index 4555137..55f62fb 100644 --- a/api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts +++ b/api-v3/src/database/migrations/1790000500000-f4-remove-inspection-legacy-fields.ts @@ -5,13 +5,44 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; * - title: la Inspección se identifica por su código autogenerado. * - planned_end_at: la planificación sólo define la fecha/hora prevista de inicio. * + * La migración conserva una copia técnica de los valores eliminados para que un + * rollback restaure los datos exactos existentes antes del cambio. Inspecciones + * creadas después del up() reciben code como title y planned_end_at NULL al bajar. + * * Se conserva un índice sobre planned_start_at porque sigue siendo un criterio de - * orden y filtro operativo. El rollback reconstruye la forma original de D1. + * orden y filtro operativo. Ninguna migración histórica se modifica. */ export class F4RemoveInspectionLegacyFields1790000500000 implements MigrationInterface { name = 'F4RemoveInspectionLegacyFields1790000500000'; public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE TABLE IF NOT EXISTS f4_inspection_visit_legacy_fields_backup ( + visit_id uuid PRIMARY KEY, + title varchar(200) NOT NULL, + planned_end_at timestamptz NULL, + backed_up_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP + ) + `); + await queryRunner.query(` + INSERT INTO f4_inspection_visit_legacy_fields_backup ( + visit_id, + title, + planned_end_at, + backed_up_at + ) + SELECT + id, + title, + planned_end_at, + CURRENT_TIMESTAMP + FROM inspection_visits + ON CONFLICT (visit_id) DO UPDATE SET + title = EXCLUDED.title, + planned_end_at = EXCLUDED.planned_end_at, + backed_up_at = EXCLUDED.backed_up_at + `); + await queryRunner.query(`DROP INDEX IF EXISTS idx_inspection_visits_planned_dates`); await queryRunner.query(` ALTER TABLE inspection_visits @@ -34,6 +65,19 @@ export class F4RemoveInspectionLegacyFields1790000500000 implements MigrationInt ALTER TABLE inspection_visits ADD COLUMN IF NOT EXISTS title varchar(200) `); + await queryRunner.query(` + ALTER TABLE inspection_visits + ADD COLUMN IF NOT EXISTS planned_end_at timestamptz + `); + + await queryRunner.query(` + UPDATE inspection_visits visit + SET + title = backup.title, + planned_end_at = backup.planned_end_at + FROM f4_inspection_visit_legacy_fields_backup backup + WHERE backup.visit_id = visit.id + `); await queryRunner.query(` UPDATE inspection_visits SET title = code @@ -44,11 +88,6 @@ export class F4RemoveInspectionLegacyFields1790000500000 implements MigrationInt ALTER COLUMN title SET NOT NULL `); - await queryRunner.query(` - ALTER TABLE inspection_visits - ADD COLUMN IF NOT EXISTS planned_end_at timestamptz - `); - await queryRunner.query(` DO $$ BEGIN @@ -73,5 +112,7 @@ export class F4RemoveInspectionLegacyFields1790000500000 implements MigrationInt CREATE INDEX IF NOT EXISTS idx_inspection_visits_planned_dates ON inspection_visits (planned_start_at, planned_end_at) `); + + await queryRunner.query(`DROP TABLE IF EXISTS f4_inspection_visit_legacy_fields_backup`); } }