import { MigrationInterface, QueryRunner } from "typeorm"; /** * Support email as a second OTP channel alongside phone (e.g. signup lets the * user choose which one to verify). `phone` becomes nullable since an * email-channel row has none, and `email` is added as a nullable unique column * mirroring `phone`'s shape. */ export class AddEmailToOtpVerifications1900000000000 implements MigrationInterface { name = "AddEmailToOtpVerifications1900000000000"; public async up(queryRunner: QueryRunner): Promise { // The table lives in the `freight` schema (the OtpVerification entity pins // schema: "freight"). An earlier version of this migration targeted // `public.otp_verifications`, which does not exist there — leaving the real // freight table without an `email` column and OTP send failing with // `column OtpVerification.email does not exist`. Target `freight` explicitly. await queryRunner.query(` ALTER TABLE freight.otp_verifications ALTER COLUMN phone DROP NOT NULL `); await queryRunner.query(` ALTER TABLE freight.otp_verifications ADD COLUMN IF NOT EXISTS email varchar UNIQUE `); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query(` ALTER TABLE freight.otp_verifications DROP COLUMN IF EXISTS email `); await queryRunner.query(` ALTER TABLE freight.otp_verifications ALTER COLUMN phone SET NOT NULL `); } }