import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query } from '@nestjs/common'; import { Permissions } from '../common/permissions.js'; import { AuditLog, RequirePermissions } from '../auth/decorators.js'; import { AssignRolesDto, CreateUserDto, ListUserQuery, LockUserDto, ResetPasswordDto, UpdateUserDto } from './dto.js'; import { BatchDeleteDto } from '../common/page.dto.js'; import { UsersService } from './users.service.js'; @Controller('users') export class UsersController { constructor(private readonly service: UsersService) {} @Get() @RequirePermissions(Permissions.user.list) list(@Query() q: ListUserQuery) { return this.service.listUsers(q); } @Get(':id') @RequirePermissions(Permissions.user.list) get(@Param('id') id: string) { return this.service.findById(id); } @Post() @RequirePermissions(Permissions.user.create) @AuditLog('user', 'create') create(@Body() dto: CreateUserDto) { return this.service.createUser(dto); } @Patch(':id') @RequirePermissions(Permissions.user.update) @AuditLog('user', 'update') update(@Param('id') id: string, @Body() dto: UpdateUserDto) { return this.service.updateUser(id, dto); } @Patch(':id/password') @RequirePermissions(Permissions.user.resetPwd) @AuditLog('user', 'reset-pwd') resetPassword(@Param('id') id: string, @Body() dto: ResetPasswordDto) { return this.service.resetPassword(id, dto); } @Get(':id/roles') @RequirePermissions(Permissions.user.list) roles(@Param('id') id: string) { return this.service.assignedRoles(id); } @Put(':id/roles') @RequirePermissions(Permissions.user.assignRole) @AuditLog('user', 'assign-role') assignRoles(@Param('id') id: string, @Body() dto: AssignRolesDto) { return this.service.assignRoles(id, dto); } @Delete(':id') @RequirePermissions(Permissions.user.delete) @AuditLog('user', 'delete') remove(@Param('id') id: string) { return this.service.softRemove(id); } @Post('batch-delete') @RequirePermissions(Permissions.user.delete) @AuditLog('user', 'batch-delete') batchDelete(@Body() dto: BatchDeleteDto) { return this.service.batchDelete(dto.ids); } @Post(':id/lock') @RequirePermissions(Permissions.user.lock) @AuditLog('user', 'lock') lock(@Param('id') id: string, @Body() dto: LockUserDto) { return this.service.lock(id, dto.reason); } @Post(':id/unlock') @RequirePermissions(Permissions.user.unlock) @AuditLog('user', 'unlock') unlock(@Param('id') id: string) { return this.service.unlock(id); } @Post(':id/kick-sessions') @RequirePermissions(Permissions.user.kickSessions) @AuditLog('user', 'kick-sessions') kickSessions(@Param('id') id: string) { return this.service.kickSessions(id); } }