wangqifan 3 سال پیش
والد
کامیت
c3572735c8

+ 2 - 2
src/api-users/api-user.controller.ts

@@ -27,7 +27,7 @@ export class ApiUserController {
     constructor(private readonly apiUserService: ApiUserService) {}
 
     @Post()
-    public async list(@Body() page: PageRequest<ApiUser>) {
+    public async list(@Body() page: PageRequest<ApiUser>, @Req() req) {
         return await this.apiUserService.findAll(page)
     }
 
@@ -48,7 +48,7 @@ export class ApiUserController {
     }
 
     @Put('/:id')
-    @HasRoles(Role.Admin)
+    @HasRoles(Role.Api)
     public async update(@Param('id') id: string, @Body() apiUser: ApiUser) {
         try {
             await this.apiUserService.update(Number(id), apiUser)

+ 3 - 0
src/api-users/entities/api-user.entity.ts

@@ -27,4 +27,7 @@ export class ApiUser {
 
     @Column({ type: 'enum', enum: ApiType })
     type: ApiType
+
+    @CreateDateColumn()
+    createdAt: Date
 }

+ 9 - 1
src/auth/auth.controller.ts

@@ -1,5 +1,5 @@
 import { PhoneLoginDto } from './dto/login.dto'
-import { Body, Controller, Get, Param, Post } from '@nestjs/common'
+import { Body, Controller, Get, Param, Post, Req } from '@nestjs/common'
 import { AuthService } from './auth.service'
 import { ApiTags } from '@nestjs/swagger'
 import { Public } from './public.decorator'
@@ -23,6 +23,14 @@ export class AuthController {
         return await this.authService.loginAdmin(username, password)
     }
 
+    @Get('/admin/getRole')
+    async getRole(@Req() req) {
+        if (req.user.roles.includes(Role.Api)) {
+            return 'api'
+        }
+        return 'admin'
+    }
+
     @Get('/admin/user/:userId/token')
     @HasRoles(Role.Admin)
     async getToken(@Param('userId') userId: string) {

+ 2 - 0
src/users/dto/user-create.dto.ts

@@ -28,6 +28,8 @@ export class UserCreateDto {
     @MaxLength(60)
     password: string
 
+    apiUserId: number
+
     @IsArray()
     readonly roles: Role[]
 }

+ 7 - 3
src/users/users.admin.controller.ts

@@ -17,6 +17,7 @@ import { UserUpdateDto } from './dto/user-update.dto'
 import { IUsers } from './interfaces/users.interface'
 import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'
 import { HasRoles } from '../auth/roles.decorator'
+import { HasAnyRoles } from '../auth/roles.decorator'
 import { Role } from '../model/role.enum'
 import { IPaginationOptions } from 'nestjs-typeorm-paginate'
 import { PageRequest } from '../common/dto/page-request'
@@ -26,17 +27,20 @@ import { UserCreateDto } from './dto/user-create.dto'
 @ApiTags('users.admin')
 @Controller('/admin/users')
 @ApiBearerAuth()
-@HasRoles(Role.Admin)
+@HasAnyRoles(Role.Admin, Role.Api)
 export class UsersAdminController {
     constructor(private readonly usersService: UsersService) {}
 
     @Post()
-    public async list(@Body() page: PageRequest<Users>) {
+    public async list(@Body() page: PageRequest<Users>, @Req() req) {
         return await this.usersService.findAll(page)
     }
 
     @Put()
-    public async create(@Body() user: UserCreateDto) {
+    public async create(@Body() user: UserCreateDto, @Req() req) {
+        if (req.user.roles.includes(Role.Api)) {
+            return await this.usersService.createSubUser(user, req.user.id)
+        }
         return await this.usersService.create(user)
     }
 

+ 16 - 1
src/users/users.service.ts

@@ -111,7 +111,7 @@ export class UsersService {
         }
         if (user.roles.includes(Role.Api)) {
             let apiUser = await this.apiUserService.findById(user.apiUserId)
-            if (apiUser.userId != apiUser.id) {
+            if (apiUser.userId != user.id) {
                 throw new UnauthorizedException('用户名或密码错误')
             }
         }
@@ -136,6 +136,21 @@ export class UsersService {
         }
     }
 
+    public async createSubUser(userDto: UserCreateDto, apiUserId: number): Promise<IUsers> {
+        try {
+            const apiUser = await this.findById(apiUserId)
+            if (userDto.password) {
+                userDto.password = await this.hashingService.hash(userDto.password)
+            }
+            userDto.apiUserId = apiUser.apiUserId
+            let user = await this.userRepository.save(userDto)
+
+            return user
+        } catch (err) {
+            throw new InternalServerErrorException(err.message)
+        }
+    }
+
     public async updateByEmail(email: string): Promise<Users> {
         try {
             const user = await this.userRepository.findOneBy({ email: email })