import { MigrationInterface, QueryRunner } from 'typeorm'; /** * Per-document review state, so a backoffice reviewer can request a correction * on one specific onboarding document instead of rejecting the whole role. * * Until now `freight.files` carried no status at all: the `pending_add` / * `pending_remove` badges the portal shows are derived by diffing live rows * against an open company change request, which says nothing about whether a * reviewer is happy with a given document. `review_status` is that missing * verdict — NULL means never reviewed, which is the state every existing row * correctly starts in, so no backfill is needed. * * The partial index serves the approval gate, which asks "does this company (or * profile) still have any document with an open change request?" on every * role-status write. */ export class AddFileReviewStatus2430000000000 implements MigrationInterface { name = 'AddFileReviewStatus2430000000000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` ALTER TABLE freight.files ADD COLUMN IF NOT EXISTS review_status varchar(32) NULL, ADD COLUMN IF NOT EXISTS review_note text NULL, ADD COLUMN IF NOT EXISTS reviewed_by uuid NULL, ADD COLUMN IF NOT EXISTS reviewed_at timestamptz NULL `); await queryRunner.query(` CREATE INDEX IF NOT EXISTS "IDX_files_open_change_request" ON freight.files (resource, resource_id) WHERE review_status = 'change_requested' AND deleted_at IS NULL `); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query( `DROP INDEX IF EXISTS freight."IDX_files_open_change_request"`, ); await queryRunner.query(` ALTER TABLE freight.files DROP COLUMN IF EXISTS review_status, DROP COLUMN IF EXISTS review_note, DROP COLUMN IF EXISTS reviewed_by, DROP COLUMN IF EXISTS reviewed_at `); } }