135 lines
3.8 KiB
TypeScript
135 lines
3.8 KiB
TypeScript
![]() |
import { Injectable } from '@nestjs/common';
|
|||
|
import { db, z, RoleSchema, ObjectType, Role, RoleMap } from "@nicestack/common";
|
|||
|
import { DepartmentService } from '@server/models/department/department.service';
|
|||
|
import { TRPCError } from '@trpc/server';
|
|||
|
|
|||
|
@Injectable()
|
|||
|
export class RoleService {
|
|||
|
constructor(
|
|||
|
private readonly departmentService: DepartmentService
|
|||
|
) { }
|
|||
|
|
|||
|
/**
|
|||
|
* 创建角色
|
|||
|
* @param data 包含创建角色所需信息的数据
|
|||
|
* @returns 创建的角色
|
|||
|
*/
|
|||
|
async create(data: z.infer<typeof RoleSchema.create>) {
|
|||
|
|
|||
|
// 开启事务
|
|||
|
return await db.$transaction(async (prisma) => {
|
|||
|
// 创建角色
|
|||
|
return await prisma.role.create({ data });
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 更新角色
|
|||
|
* @param data 包含更新角色所需信息的数据
|
|||
|
* @returns 更新后的角色
|
|||
|
*/
|
|||
|
async update(data: z.infer<typeof RoleSchema.update>) {
|
|||
|
const { id, ...others } = data;
|
|||
|
|
|||
|
// 开启事务
|
|||
|
return await db.$transaction(async (prisma) => {
|
|||
|
// 更新角色
|
|||
|
const updatedRole = await prisma.role.update({
|
|||
|
where: { id },
|
|||
|
data: { ...others }
|
|||
|
});
|
|||
|
|
|||
|
return updatedRole;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 批量删除角色
|
|||
|
* @param data 包含要删除的角色ID列表的数据
|
|||
|
* @returns 删除结果
|
|||
|
* @throws 如果未提供ID,将抛出错误
|
|||
|
*/
|
|||
|
async batchDelete(data: z.infer<typeof RoleSchema.batchDelete>) {
|
|||
|
const { ids } = data;
|
|||
|
if (!ids || ids.length === 0) {
|
|||
|
throw new TRPCError({
|
|||
|
code: 'BAD_REQUEST',
|
|||
|
message: 'No IDs provided for deletion.'
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 开启事务
|
|||
|
return await db.$transaction(async (prisma) => {
|
|||
|
const deletedRoles = await prisma.role.updateMany({
|
|||
|
where: {
|
|||
|
id: { in: ids }
|
|||
|
},
|
|||
|
data: { deletedAt: new Date() }
|
|||
|
});
|
|||
|
|
|||
|
await prisma.roleMap.deleteMany({
|
|||
|
where: {
|
|||
|
roleId: {
|
|||
|
in: ids
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (!deletedRoles.count) {
|
|||
|
throw new TRPCError({
|
|||
|
code: 'NOT_FOUND',
|
|||
|
message: 'No roles were found with the provided IDs.'
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
return { success: true, count: deletedRoles.count };
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 分页获取角色
|
|||
|
* @param data 包含分页信息的数据
|
|||
|
* @returns 分页结果,包含角色列表和总数
|
|||
|
*/
|
|||
|
async paginate(data: z.infer<typeof RoleSchema.paginate>) {
|
|||
|
const { page, pageSize } = data;
|
|||
|
const [items, totalCount] = await Promise.all([
|
|||
|
db.role.findMany({
|
|||
|
skip: (page - 1) * pageSize,
|
|||
|
take: pageSize,
|
|||
|
orderBy: { name: "asc" },
|
|||
|
where: { deletedAt: null },
|
|||
|
include: {
|
|||
|
roleMaps: true,
|
|||
|
}
|
|||
|
}),
|
|||
|
db.role.count({ where: { deletedAt: null } }),
|
|||
|
]);
|
|||
|
const result = { items, totalCount };
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 根据关键字查找多个角色
|
|||
|
* @param data 包含关键字的数据
|
|||
|
* @returns 查找到的角色列表
|
|||
|
*/
|
|||
|
async findMany(data: z.infer<typeof RoleSchema.findMany>) {
|
|||
|
const { keyword } = data
|
|||
|
return await db.role.findMany({
|
|||
|
where: {
|
|||
|
deletedAt: null,
|
|||
|
OR: [
|
|||
|
{
|
|||
|
name: {
|
|||
|
contains: keyword
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
orderBy: { name: "asc" },
|
|||
|
take: 10
|
|||
|
})
|
|||
|
}
|
|||
|
}
|