You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
5.4 KiB
TypeScript
181 lines
5.4 KiB
TypeScript
import {
|
|
Controller,
|
|
Get,
|
|
UsePipes,
|
|
UseGuards,
|
|
Query,
|
|
Post,
|
|
Body,
|
|
Delete,
|
|
Param,
|
|
Put,
|
|
NotFoundException,
|
|
} from '@nestjs/common';
|
|
import { ApiBearerAuth, ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
|
|
import { InjectRepository } from '@nestjs/typeorm';
|
|
import {
|
|
DataSource,
|
|
Repository,
|
|
} from 'typeorm';
|
|
import { AuthGuard } from '@nestjs/passport';
|
|
import * as bcrypt from 'bcryptjs';
|
|
|
|
import {
|
|
ValidationPipe,
|
|
User,
|
|
Roles,
|
|
RolesGuard,
|
|
BCRYPT_HASH_ROUNDS,
|
|
} from '../common';
|
|
import { UserEntity } from './user.entity';
|
|
import { UserService } from './user.service';
|
|
import { QueryUserDto } from './query-user.dto';
|
|
import { CreateUser, UpdatePassword, UpdateUser } from './update-user.dto';
|
|
import { RoleEntity } from 'src/role/entities/role.entity';
|
|
|
|
@ApiTags('系统用户')
|
|
@ApiBearerAuth()
|
|
@Controller('users')
|
|
export class UserController {
|
|
constructor(
|
|
@InjectRepository(UserEntity)
|
|
private readonly userRepository: Repository<UserEntity>,
|
|
@InjectRepository(RoleEntity)
|
|
private readonly roleRepository: Repository<RoleEntity>,
|
|
private readonly userService: UserService,
|
|
private readonly dataSource: DataSource,
|
|
// @Inject(forwardRef(() => AuthService))
|
|
// private readonly authService: AuthService,
|
|
) { }
|
|
|
|
@Get('/viewer')
|
|
@ApiOperation({ summary: '获取个人信息' })
|
|
@UseGuards(AuthGuard('jwt'), RolesGuard)
|
|
@UsePipes(new ValidationPipe())
|
|
// @Roles('company', 'tester', 'admin')
|
|
@ApiBearerAuth()
|
|
@ApiResponse({
|
|
status: 200,
|
|
description: '返回参数说明',
|
|
})
|
|
async viewer(@User() viewer: UserEntity) {
|
|
const result = await this.userRepository.findOne({ where: { id: viewer.id } })
|
|
const role = await this.roleRepository.findOne({ where: { id: result.role_id } })
|
|
if (role) {
|
|
(result as any).permissions = role.permissions.split('、');
|
|
}
|
|
return result;
|
|
}
|
|
|
|
@Get("/list")
|
|
@ApiOperation({ summary: '查看管理员' })
|
|
@UseGuards(AuthGuard('jwt'), RolesGuard)
|
|
@UsePipes(new ValidationPipe())
|
|
@Roles('super_admin', '查看管理员')
|
|
@ApiBearerAuth()
|
|
async areas(@Query() query_data: QueryUserDto) {
|
|
const where: any = {};
|
|
if (query_data.true_name) {
|
|
where['true_name'] = query_data.true_name;
|
|
}
|
|
const query = this.userRepository.createQueryBuilder('user');
|
|
query.where(where);
|
|
if (query_data.search) {
|
|
const string = `%${query_data.search}%`;
|
|
const fields = ['true_name'];
|
|
const searchString = fields.join(' like :search OR user.');
|
|
query.where(`user.${searchString} like :search`, {
|
|
search: string,
|
|
});
|
|
}
|
|
const order_key = 'user.created_date';
|
|
let order_value: any = 'DESC';
|
|
const [list, count] = await query
|
|
.skip(query_data.skip)
|
|
.take(query_data.take)
|
|
.orderBy(order_key, order_value)
|
|
.getManyAndCount();
|
|
return { list, count }
|
|
}
|
|
|
|
@Post("/")
|
|
@ApiOperation({ summary: '创建管理员' })
|
|
@UseGuards(AuthGuard('jwt'), RolesGuard)
|
|
@UsePipes(new ValidationPipe())
|
|
@Roles('super_admin', '创建管理员')
|
|
@ApiBearerAuth()
|
|
async createUser(@Body() data: CreateUser) {
|
|
const new_password = await bcrypt.hash(data.password, BCRYPT_HASH_ROUNDS);
|
|
return await this.dataSource.transaction(async transactionalEntityManager => {
|
|
|
|
const user = new UserEntity();
|
|
user.true_name = data.true_name;
|
|
user.role = data.role;
|
|
user.role_id = data.role_id;
|
|
user.mobile = data.mobile;
|
|
user.avatar = data.avatar;
|
|
user.area_id = data.area_id;
|
|
user.area = data.area;
|
|
user.password = new_password;
|
|
|
|
const result = await transactionalEntityManager.save(user);
|
|
|
|
return { statusCode: 201, data: result };
|
|
});
|
|
}
|
|
|
|
@Put("/:id")
|
|
@ApiOperation({ summary: '更新管理员' })
|
|
@UseGuards(AuthGuard('jwt'), RolesGuard)
|
|
@UsePipes(new ValidationPipe())
|
|
@Roles('super_admin', '更新管理员')
|
|
@ApiBearerAuth()
|
|
async updateUser(@Param() { id }: any, @Body() data: UpdateUser) {
|
|
const user = await this.userRepository.findOne({ where: { id } });
|
|
if (!user) {
|
|
throw new NotFoundException("user not found");
|
|
}
|
|
user.true_name = data.true_name;
|
|
user.role = data.role;
|
|
user.role_id = data.role_id;
|
|
user.mobile = data.mobile;
|
|
user.avatar = data.avatar;
|
|
user.area_id = data.area_id;
|
|
user.area = data.area;
|
|
const result = await this.userRepository.save(user);
|
|
return result;
|
|
}
|
|
|
|
@Put("/:id/password")
|
|
@ApiOperation({ summary: '更新管理员' })
|
|
@UseGuards(AuthGuard('jwt'), RolesGuard)
|
|
@UsePipes(new ValidationPipe())
|
|
@Roles('super_admin', '更新管理员')
|
|
@ApiBearerAuth()
|
|
async passwordUser(@Param() { id }: any, @Body() data: UpdatePassword) {
|
|
const user = await this.userRepository.findOne({ where: { id } });
|
|
if (!user) {
|
|
throw new NotFoundException("user not found");
|
|
}
|
|
const new_password = await bcrypt.hash(data.password, BCRYPT_HASH_ROUNDS);
|
|
user.password = new_password;
|
|
const result = await this.userRepository.save(user);
|
|
return result;
|
|
}
|
|
|
|
@Delete("/:id")
|
|
@ApiOperation({ summary: '删除管理员' })
|
|
@UseGuards(AuthGuard('jwt'), RolesGuard)
|
|
@UsePipes(new ValidationPipe())
|
|
@Roles('super_admin', '删除管理员')
|
|
@ApiBearerAuth()
|
|
async deleteUser(@Param() { id }: any) {
|
|
const result = await this.userRepository.findOne({ where: { id } });
|
|
if (!result) {
|
|
throw new NotFoundException("user not found");
|
|
}
|
|
await this.userRepository.delete(id);
|
|
return result;
|
|
}
|
|
}
|