@opentiny/tiny-toolkit-pro
Version:
TinyPro Vue:开箱即用、前后端分离的 Vue 后台管理模板
163 lines (158 loc) • 4.31 kB
text/typescript
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { CreateRoleDto } from './dto/create-role.dto';
import { UpdateRoleDto } from './dto/update-role.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { Menu, Permission, Role, User } from '@app/models';
import { In, Like, Repository } from 'typeorm';
import { convertToTree } from '../menu/menu.service';
import { I18nContext, I18nService } from 'nestjs-i18n';
import { I18nTranslations } from '../.generate/i18n.generated';
import { paginate } from 'nestjs-typeorm-paginate';
export class RoleService {
constructor(
private readonly role: Repository<Role>,
private readonly permission: Repository<Permission>,
private readonly menu: Repository<Menu>,
private readonly user: Repository<User>,
private readonly i18n: I18nService<I18nTranslations>
) {}
async create(createRoleDto: CreateRoleDto, isInit: boolean) {
const { name, permissionIds = [], menuIds = [] } = createRoleDto;
const roleInfo = this.role.findOne({
where: {
name,
},
});
if (isInit == true && (await roleInfo)) {
return roleInfo;
}
if (await roleInfo) {
throw new HttpException(
this.i18n.t('exception.role.exists', {
lang: I18nContext.current().lang,
}),
HttpStatus.BAD_REQUEST
);
}
const permissions = await this.permission.find({
where: {
id: In(permissionIds),
},
});
const menus = await this.menu.find({
where: {
id: In(menuIds),
},
});
return this.role.save({ name, permission: permissions, menus });
}
findAll() {
return this.role.find();
}
async findAllDetail(page?: number, limit?: number, name?: string) {
const roleInfo = await paginate(
this.role,
{
page,
limit,
},
{
where: {
name: name ? Like(name) : undefined,
},
relations: ['permission', 'menus'],
}
);
const menuTree = [];
for (const item of roleInfo.items) {
menuTree.push(convertToTree(item.menus));
}
return {
roleInfo,
menuTree,
};
}
async findOne(id: string) {
const roleInfo = await this.role
.createQueryBuilder('role')
.leftJoinAndSelect('role.menus', 'menus')
.leftJoinAndSelect('role.permission', 'permission')
.where({
id: parseInt(id),
})
.getOne();
if (!roleInfo) {
throw new HttpException(
this.i18n.t('exception.role.notExists', {
lang: I18nContext.current().lang,
}),
HttpStatus.NOT_FOUND
);
}
return roleInfo;
}
async update(data: UpdateRoleDto) {
const permission = await this.permission.find({
where: {
id: In(data.permissionIds ?? []),
},
});
const menus = await this.menu.find({
where: {
id: In(data.menuIds ?? []),
},
});
const { id, name } = data;
const roleInfo = await this.role.find({
where: {
id: id,
},
});
if (roleInfo.length === 0) {
throw new HttpException(
this.i18n.t('exception.role.notExists', {
lang: I18nContext.current().lang,
}),
HttpStatus.BAD_REQUEST
);
}
const role = roleInfo[0];
role.name = name;
if (data.permissionIds) {
role.permission = permission;
}
if (data.menuIds) {
role.menus = menus;
}
return this.role.save(role);
}
async delete(id: number) {
const role = await this.role.find({
where: {
id: id,
},
});
const user = await this.user.find({
where: {
role: {
id,
},
},
take: 1,
});
if (user.length) {
throw new HttpException(
this.i18n.t('exception.role.conflict', {
lang: I18nContext.current().lang,
}),
HttpStatus.CONFLICT
);
}
return this.role.remove(role);
}
}