Files
negareh-api/src/seeders/roles.seeder.ts
T
morteza 6b477adcc2
deploy to danak / build_and_deploy (push) Has been cancelled
update seeder
2026-07-08 20:21:40 +03:30

59 lines
1.8 KiB
TypeScript

import type { EntityManager } from '@mikro-orm/core';
import { Role } from '../modules/roles/entities/role.entity';
import type { PermissionEnum } from '../common/enums/permission.enum';
import type {Permission } from '../modules/roles/entities/permission.entity';
import { rolesData } from './data/roles.data';
export class RolesSeeder {
async run(em: EntityManager, permissions: Permission[]): Promise<Map<string, Role>> {
const rolesMap = new Map<string, Role>();
for (const roleConfig of rolesData) {
const existingRole = await em.findOne(Role, { name: roleConfig.name });
let role: Role;
if (!existingRole) {
role = em.create(Role, {
name: roleConfig.name,
title: roleConfig.title,
isSystem: roleConfig.isSystem,
});
} else {
role = existingRole;
await role.permissions.init();
if (role.title !== roleConfig.title) {
role.title = roleConfig.title;
}
if (role.isSystem !== roleConfig.isSystem) {
role.isSystem = roleConfig.isSystem;
}
}
const filteredPermissions = permissions.filter((p) =>
roleConfig.permissionFilter(p.name as PermissionEnum),
);
const filteredPermissionNames = new Set(filteredPermissions.map((p) => p.name));
for (const existingPermission of role.permissions.getItems()) {
if (!filteredPermissionNames.has(existingPermission.name)) {
role.permissions.remove(existingPermission);
}
}
for (const permission of filteredPermissions) {
if (!role.permissions.contains(permission, false)) {
role.permissions.add(permission);
}
}
em.persist(role);
rolesMap.set(roleConfig.name, role);
}
await em.flush();
return rolesMap;
}
}