diff --git a/api-v3/src/database/migrations/1789844700000-phase-f3-1-user-profile.ts b/api-v3/src/database/migrations/1789844700000-phase-f3-1-user-profile.ts new file mode 100644 index 0000000..d5b2ce5 --- /dev/null +++ b/api-v3/src/database/migrations/1789844700000-phase-f3-1-user-profile.ts @@ -0,0 +1,77 @@ +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'); + } +}