138 lines
4.2 KiB
TypeScript
138 lines
4.2 KiB
TypeScript
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<void> {
|
|
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<void> {
|
|
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],
|
|
);
|
|
}
|
|
}
|