78 lines
3.1 KiB
TypeScript
78 lines
3.1 KiB
TypeScript
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
|
|
export class PhaseF31UserProfile1789844700000 implements MigrationInterface {
|
|
name = 'PhaseF31UserProfile1789844700000';
|
|
|
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
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<void> {
|
|
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');
|
|
}
|
|
}
|