Files
whale-town-end/src/business/user_mgmt/user_status.controller.ts
moyin 0f37130832 refactor:重构业务层服务架构
- 重构共享模块,移除冗余DTO定义
- 优化Zulip服务模块,重新组织控制器结构
- 更新用户管理和认证服务
- 移除过时的登录服务测试文件
2026-01-08 23:05:13 +08:00

243 lines
7.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 用户状态管理控制器
*
* 功能描述:
* - 管理员管理用户账户状态
* - 支持批量状态操作
* - 提供状态变更审计日志
*
* 职责分离:
* - HTTP请求处理和参数验证
* - API文档生成和接口规范定义
* - 业务服务调用和响应格式化
*
* API端点
* - PUT /admin/users/:id/status - 修改用户状态
* - POST /admin/users/batch-status - 批量修改用户状态
* - GET /admin/users/status-stats - 获取用户状态统计
*
* 最近修改:
* - 2026-01-07: 代码规范优化 - 修正文件命名规范,完善注释规范,更新作者信息 (修改者: moyin)
*
* @author moyin
* @version 1.0.1
* @since 2025-12-24
* @lastModified 2026-01-07
*/
import { Body, Controller, Get, HttpCode, HttpStatus, Param, Put, Post, UseGuards, ValidationPipe, UsePipes, Logger } from '@nestjs/common';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger';
import { AdminGuard } from '../admin/admin.guard';
import { UserManagementService } from './user_management.service';
import { Throttle, ThrottlePresets } from '../../core/security_core/throttle.decorator';
import { Timeout, TimeoutPresets } from '../../core/security_core/timeout.decorator';
import { UserStatusDto, BatchUserStatusDto } from './user_status.dto';
import { UserStatusResponseDto, BatchUserStatusResponseDto, UserStatusStatsResponseDto } from './user_status_response.dto';
import { BATCH_OPERATION, UTILS } from './user_mgmt.constants';
/**
* 用户状态管理控制器
*
* 职责:
* - 处理用户状态管理相关的HTTP请求
* - 提供RESTful API接口和Swagger文档
* - 执行请求参数验证和权限控制
*
* 主要方法:
* - updateUserStatus() - 修改单个用户状态
* - batchUpdateUserStatus() - 批量修改用户状态
* - getUserStatusStats() - 获取用户状态统计
*
* 使用场景:
* - 管理员通过API管理用户状态
* - 系统集成和自动化用户管理
* - 用户状态监控和统计分析
*/
@ApiTags('user_management')
@Controller('admin/users')
export class UserStatusController {
private readonly logger = new Logger(UserStatusController.name);
constructor(private readonly userManagementService: UserManagementService) {}
/**
* 修改用户状态
*
* 业务逻辑:
* 1. 验证管理员权限和操作频率限制
* 2. 验证用户ID格式和状态参数有效性
* 3. 记录状态修改操作的审计日志
* 4. 调用业务服务执行状态变更
* 5. 返回操作结果和用户最新状态
*
* @param id 用户ID
* @param userStatusDto 状态修改数据
* @returns 修改结果
* @throws ForbiddenException 管理员权限不足时
* @throws NotFoundException 用户不存在时
* @throws TooManyRequestsException 操作过于频繁时
*
* @example
* ```typescript
* const result = await controller.updateUserStatus('123', {
* status: UserStatus.LOCKED,
* reason: '用户违反社区规定'
* });
* ```
*/
@ApiBearerAuth('JWT-auth')
@ApiOperation({
summary: '修改用户状态',
description: '管理员修改指定用户的账户状态,支持激活、锁定、禁用等操作'
})
@ApiParam({ name: 'id', description: '用户ID' })
@ApiBody({ type: UserStatusDto })
@ApiResponse({
status: 200,
description: '状态修改成功',
type: UserStatusResponseDto
})
@ApiResponse({
status: 403,
description: '权限不足'
})
@ApiResponse({
status: 404,
description: '用户不存在'
})
@ApiResponse({
status: 429,
description: '操作过于频繁'
})
@UseGuards(AdminGuard)
@Throttle(ThrottlePresets.ADMIN_OPERATION)
@Timeout(TimeoutPresets.NORMAL)
@Put(':id/status')
@HttpCode(HttpStatus.OK)
@UsePipes(new ValidationPipe({ transform: true }))
async updateUserStatus(
@Param('id') id: string,
@Body() userStatusDto: UserStatusDto
): Promise<UserStatusResponseDto> {
this.logger.log('管理员修改用户状态', {
operation: 'update_user_status',
userId: id,
newStatus: userStatusDto.status,
reason: userStatusDto.reason,
timestamp: UTILS.getCurrentTimestamp()
});
return await this.userManagementService.updateUserStatus(BigInt(id), userStatusDto);
}
/**
* 批量修改用户状态
*
* 业务逻辑:
* 1. 验证管理员权限和批量操作频率限制
* 2. 验证用户ID列表和状态参数有效性
* 3. 检查批量操作数量限制(最多${BATCH_OPERATION.MAX_USER_COUNT}个用户)
* 4. 记录批量操作的审计日志
* 5. 调用业务服务执行批量状态变更
* 6. 返回批量操作结果统计
*
* @param batchUserStatusDto 批量状态修改数据
* @returns 批量修改结果
* @throws ForbiddenException 管理员权限不足时
* @throws BadRequestException 批量操作数量超限时
* @throws TooManyRequestsException 操作过于频繁时
*
* @example
* ```typescript
* const result = await controller.batchUpdateUserStatus({
* userIds: ['123', '456', '789'],
* status: UserStatus.LOCKED,
* reason: '批量处理违规用户'
* });
* ```
*/
@ApiBearerAuth('JWT-auth')
@ApiOperation({
summary: '批量修改用户状态',
description: '管理员批量修改多个用户的账户状态'
})
@ApiBody({ type: BatchUserStatusDto })
@ApiResponse({
status: 200,
description: '批量修改成功',
type: BatchUserStatusResponseDto
})
@ApiResponse({
status: 403,
description: '权限不足'
})
@ApiResponse({
status: 429,
description: '操作过于频繁'
})
@UseGuards(AdminGuard)
@Throttle(ThrottlePresets.ADMIN_OPERATION)
@Timeout(TimeoutPresets.SLOW)
@Post('batch-status')
@HttpCode(HttpStatus.OK)
@UsePipes(new ValidationPipe({ transform: true }))
async batchUpdateUserStatus(
@Body() batchUserStatusDto: BatchUserStatusDto
): Promise<BatchUserStatusResponseDto> {
this.logger.log('管理员批量修改用户状态', {
operation: 'batch_update_user_status',
userCount: batchUserStatusDto.userIds.length,
newStatus: batchUserStatusDto.status,
reason: batchUserStatusDto.reason,
timestamp: UTILS.getCurrentTimestamp()
});
return await this.userManagementService.batchUpdateUserStatus(batchUserStatusDto);
}
/**
* 获取用户状态统计
*
* 业务逻辑:
* 1. 验证管理员权限
* 2. 调用业务服务获取状态统计数据
* 3. 记录统计查询的审计日志
* 4. 返回各种状态的用户数量统计
* 5. 提供状态分布分析数据
*
* @returns 状态统计信息
* @throws ForbiddenException 管理员权限不足时
* @throws InternalServerErrorException 统计数据获取失败时
*
* @example
* ```typescript
* const stats = await controller.getUserStatusStats();
* // 返回: { active: 1250, inactive: 45, locked: 12, ... }
* ```
*/
@ApiBearerAuth('JWT-auth')
@ApiOperation({
summary: '获取用户状态统计',
description: '获取各种用户状态的数量统计信息'
})
@ApiResponse({
status: 200,
description: '获取成功',
type: UserStatusStatsResponseDto
})
@ApiResponse({
status: 403,
description: '权限不足'
})
@UseGuards(AdminGuard)
@Timeout(TimeoutPresets.DATABASE_QUERY)
@Get('status-stats')
async getUserStatusStats(): Promise<UserStatusStatsResponseDto> {
this.logger.log('管理员获取用户状态统计', {
operation: 'get_user_status_stats',
timestamp: UTILS.getCurrentTimestamp()
});
return await this.userManagementService.getUserStatusStats();
}
}