import { MigrationInterface, QueryRunner } from 'typeorm'; const permissionCodes = [ 'dashboard.read', 'users.read', 'users.create', 'users.update', 'users.change_status', 'users.assign_roles', 'roles.read', 'roles.manage', 'audit.read', ] as const; const roleCodes = [ 'admin', 'director', 'supervisor', 'inspector', 'auditor', ] as const; const rolePermissionValues = ` ('admin', 'dashboard.read'), ('admin', 'users.read'), ('admin', 'users.create'), ('admin', 'users.update'), ('admin', 'users.change_status'), ('admin', 'users.assign_roles'), ('admin', 'roles.read'), ('admin', 'roles.manage'), ('admin', 'audit.read'), ('director', 'dashboard.read'), ('director', 'users.read'), ('director', 'roles.read'), ('director', 'audit.read'), ('supervisor', 'dashboard.read'), ('supervisor', 'users.read'), ('supervisor', 'roles.read'), ('inspector', 'dashboard.read'), ('inspector', 'roles.read'), ('auditor', 'dashboard.read'), ('auditor', 'roles.read'), ('auditor', 'audit.read') `; export class PhaseASeedRolesPermissions1786548003000 implements MigrationInterface { name = 'PhaseASeedRolesPermissions1786548003000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` INSERT INTO permissions (code, description) VALUES ('dashboard.read', 'Ver el panel general'), ('users.read', 'Listar y consultar usuarios'), ('users.create', 'Crear usuarios'), ('users.update', 'Editar usuarios'), ('users.change_status', 'Activar o desactivar usuarios'), ('users.assign_roles', 'Asignar roles a usuarios'), ('roles.read', 'Listar y consultar roles y permisos'), ('roles.manage', 'Administrar roles y su matriz de permisos'), ('audit.read', 'Consultar eventos de auditoría') ON CONFLICT (code) DO UPDATE SET description = EXCLUDED.description `); await queryRunner.query(` INSERT INTO roles (code, name, description, is_system) VALUES ('admin', 'Administrador', 'Administración total del sistema', true), ('director', 'Director', 'Consulta directiva y auditoría', true), ('supervisor', 'Supervisor', 'Supervisión operativa', true), ('inspector', 'Inspector', 'Operación de inspecciones', true), ('auditor', 'Auditor', 'Consulta de información y auditoría', true) ON CONFLICT (code) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, is_system = true, updated_at = CURRENT_TIMESTAMP `); await queryRunner.query(` WITH mapping(role_code, permission_code) AS ( VALUES ${rolePermissionValues} ) 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 `); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query(` WITH mapping(role_code, permission_code) AS ( VALUES ${rolePermissionValues} ) DELETE FROM role_permissions role_permission USING roles role, permissions permission, mapping WHERE role_permission.role_id = role.id AND role_permission.permission_id = permission.id AND role.code = mapping.role_code AND permission.code = mapping.permission_code `); await queryRunner.query( ` DELETE FROM roles role WHERE role.code = ANY($1::varchar[]) AND role.is_system = true AND NOT EXISTS ( SELECT 1 FROM user_roles user_role WHERE user_role.role_id = role.id ) `, [roleCodes], ); await queryRunner.query( ` DELETE FROM permissions permission WHERE permission.code = ANY($1::varchar[]) AND NOT EXISTS ( SELECT 1 FROM role_permissions role_permission WHERE role_permission.permission_id = permission.id ) `, [permissionCodes], ); } }