import { MigrationInterface, QueryRunner } from 'typeorm'; export class PhaseD5320AutomaticWordReport1788458400000 implements MigrationInterface { name = 'PhaseD5320AutomaticWordReport1788458400000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` ALTER TABLE inspection_reports ADD COLUMN word_status varchar(24) NOT NULL DEFAULT 'PENDING', ADD COLUMN word_original_name varchar(255), ADD COLUMN word_stored_name varchar(255), ADD COLUMN word_mime_type varchar(120), ADD COLUMN word_size_bytes integer, ADD COLUMN word_sha256 char(64), ADD COLUMN word_generated_at timestamptz, ADD COLUMN word_error varchar(500) `); await queryRunner.query(` ALTER TABLE inspection_reports ADD CONSTRAINT chk_inspection_reports_word_status CHECK (word_status IN ('PENDING', 'READY', 'FAILED')), ADD CONSTRAINT chk_inspection_reports_word_metadata CHECK ( (word_status = 'READY' AND word_original_name IS NOT NULL AND word_stored_name IS NOT NULL AND word_mime_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' AND word_size_bytes > 0 AND word_sha256 ~ '^[0-9a-f]{64}$' AND word_generated_at IS NOT NULL AND word_error IS NULL) OR (word_status = 'PENDING' AND word_original_name IS NULL AND word_stored_name IS NULL AND word_mime_type IS NULL AND word_size_bytes IS NULL AND word_sha256 IS NULL AND word_generated_at IS NULL) OR word_status = 'FAILED' ) `); await queryRunner.query('CREATE INDEX idx_inspection_reports_word_status ON inspection_reports (word_status, generated_at DESC)'); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query('DROP INDEX idx_inspection_reports_word_status'); await queryRunner.query('ALTER TABLE inspection_reports DROP CONSTRAINT chk_inspection_reports_word_metadata'); await queryRunner.query('ALTER TABLE inspection_reports DROP CONSTRAINT chk_inspection_reports_word_status'); await queryRunner.query(` ALTER TABLE inspection_reports DROP COLUMN word_error, DROP COLUMN word_generated_at, DROP COLUMN word_sha256, DROP COLUMN word_size_bytes, DROP COLUMN word_mime_type, DROP COLUMN word_stored_name, DROP COLUMN word_original_name, DROP COLUMN word_status `); } }