56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
import { GrantMenuDto } from '@/modules/system/permission/dto/grant-menu.dto';
|
|
import { PrismaService } from '@/prisma/prisma.service';
|
|
import { PermissionType } from '@/common/enum';
|
|
|
|
@Injectable()
|
|
export class PermissionService {
|
|
constructor(private readonly prisma: PrismaService) {}
|
|
|
|
async getRoleResources(roleId: string, type: PermissionType) {
|
|
const ids = await this.prisma.sysResourcePermission.findMany({
|
|
select: {
|
|
resourceId: true,
|
|
},
|
|
where: {
|
|
resource: {
|
|
type,
|
|
},
|
|
permission: {
|
|
sysRolePermission: {
|
|
some: { roleId },
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
return ids.map((item) => item.resourceId);
|
|
}
|
|
|
|
async assignResources(
|
|
roleId: string,
|
|
type: PermissionType,
|
|
{ ids }: GrantMenuDto,
|
|
) {
|
|
await this.prisma.$transaction(async (prisma) => {
|
|
// 删除角色对应的权限
|
|
await prisma.sysRolePermission.deleteMany({
|
|
where: {
|
|
roleId,
|
|
},
|
|
});
|
|
// 通过资源id 找出所有权限id
|
|
const rolePermIds = await prisma.sysResourcePermission.findMany({
|
|
select: { permissionId: true },
|
|
where: { resourceId: { in: ids } },
|
|
});
|
|
// 根据权限id 关联菜单和权限
|
|
if (rolePermIds.length > 0) {
|
|
await prisma.sysRolePermission.createMany({
|
|
data: rolePermIds.map((item) => ({ ...item, roleId })),
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|