import { MigrationInterface, QueryRunner } from 'typeorm'; export class PhaseF31UserProfile1789844700000 implements MigrationInterface { name = 'PhaseF31UserProfile1789844700000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(`ALTER TABLE users ADD COLUMN dni varchar(32) NULL`); await queryRunner.query(`ALTER TABLE users ADD COLUMN phone varchar(40) NULL`); await queryRunner.query(`ALTER TABLE users ADD COLUMN job_title varchar(160) NULL`); await queryRunner.query(`ALTER TABLE users ADD COLUMN employee_number varchar(80) NULL`); await queryRunner.query(` CREATE UNIQUE INDEX uq_users_dni_not_null ON users(dni) WHERE dni IS NOT NULL `); await queryRunner.query(` CREATE OR REPLACE FUNCTION enforce_inspector_email_on_role() RETURNS trigger LANGUAGE plpgsql AS $$ DECLARE selected_role_code varchar(80); DECLARE selected_email varchar(320); BEGIN SELECT code INTO selected_role_code FROM roles WHERE id=NEW.role_id; IF selected_role_code='inspector' THEN SELECT email INTO selected_email FROM users WHERE id=NEW.user_id; IF selected_email IS NULL OR btrim(selected_email)='' THEN RAISE EXCEPTION 'INSPECTOR_EMAIL_REQUIRED'; END IF; END IF; RETURN NEW; END; $$ `); await queryRunner.query(` CREATE TRIGGER trg_user_roles_inspector_email BEFORE INSERT OR UPDATE ON user_roles FOR EACH ROW EXECUTE FUNCTION enforce_inspector_email_on_role() `); await queryRunner.query(` CREATE OR REPLACE FUNCTION prevent_inspector_email_removal() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF (NEW.email IS NULL OR btrim(NEW.email)='') AND EXISTS ( SELECT 1 FROM user_roles user_role JOIN roles role ON role.id=user_role.role_id WHERE user_role.user_id=NEW.id AND role.code='inspector' ) THEN RAISE EXCEPTION 'INSPECTOR_EMAIL_REQUIRED'; END IF; RETURN NEW; END; $$ `); await queryRunner.query(` CREATE TRIGGER trg_users_inspector_email BEFORE UPDATE OF email ON users FOR EACH ROW EXECUTE FUNCTION prevent_inspector_email_removal() `); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query('DROP TRIGGER IF EXISTS trg_users_inspector_email ON users'); await queryRunner.query('DROP FUNCTION IF EXISTS prevent_inspector_email_removal()'); await queryRunner.query('DROP TRIGGER IF EXISTS trg_user_roles_inspector_email ON user_roles'); await queryRunner.query('DROP FUNCTION IF EXISTS enforce_inspector_email_on_role()'); await queryRunner.query('DROP INDEX IF EXISTS uq_users_dni_not_null'); await queryRunner.query('ALTER TABLE users DROP COLUMN IF EXISTS employee_number'); await queryRunner.query('ALTER TABLE users DROP COLUMN IF EXISTS job_title'); await queryRunner.query('ALTER TABLE users DROP COLUMN IF EXISTS phone'); await queryRunner.query('ALTER TABLE users DROP COLUMN IF EXISTS dni'); } }