import { MigrationInterface, QueryRunner } from 'typeorm'; const operationalPermissions = [ 'inspections.execute', 'inspection_acts.create', 'inspection_acts.update', 'inspection_acts.cancel', 'inspection_findings.create', 'inspection_findings.update', 'inspection_closure.prepare', 'inspection_closure.sign', 'inspection_closure.close', ] as const; const previousNonInspectorMappings = ` ('admin', 'inspections.execute'), ('supervisor', 'inspections.execute'), ('admin', 'inspection_acts.create'), ('admin', 'inspection_acts.update'), ('admin', 'inspection_acts.cancel'), ('supervisor', 'inspection_acts.create'), ('supervisor', 'inspection_acts.update'), ('supervisor', 'inspection_acts.cancel'), ('admin', 'inspection_findings.create'), ('admin', 'inspection_findings.update'), ('supervisor', 'inspection_findings.create'), ('supervisor', 'inspection_findings.update'), ('admin', 'inspection_closure.prepare'), ('admin', 'inspection_closure.sign'), ('admin', 'inspection_closure.close'), ('director', 'inspection_closure.close'), ('supervisor', 'inspection_closure.prepare'), ('supervisor', 'inspection_closure.sign'), ('supervisor', 'inspection_closure.close') `; export class PhaseD51MobileInspectionPolicy1787331600000 implements MigrationInterface { name = 'PhaseD51MobileInspectionPolicy1787331600000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` DELETE FROM role_permissions role_permission USING roles role, permissions permission WHERE role_permission.role_id = role.id AND role_permission.permission_id = permission.id AND role.code <> 'inspector' AND permission.code = ANY($1::varchar[]) `, [operationalPermissions]); await queryRunner.query(` INSERT INTO role_permissions (role_id, permission_id) SELECT role.id, permission.id FROM roles role CROSS JOIN permissions permission WHERE role.code = 'inspector' AND permission.code = ANY($1::varchar[]) ON CONFLICT (role_id, permission_id) DO NOTHING `, [operationalPermissions]); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query(` DELETE FROM role_permissions role_permission USING roles role, permissions permission WHERE role_permission.role_id = role.id AND role_permission.permission_id = permission.id AND role.code = 'inspector' AND permission.code = 'inspection_acts.cancel' `); await queryRunner.query(` WITH mapping(role_code, permission_code) AS (VALUES ${previousNonInspectorMappings}) INSERT INTO role_permissions (role_id, permission_id) SELECT role.id, permission.id FROM mapping INNER JOIN roles role ON role.code = mapping.role_code INNER JOIN permissions permission ON permission.code = mapping.permission_code ON CONFLICT (role_id, permission_id) DO NOTHING `); } }