/** * 管理员数据库管理 DTO * * 功能描述: * - 定义管理员数据库管理相关的请求和响应数据结构 * - 提供完整的数据验证规则 * - 支持Swagger文档自动生成 * * 职责分离: * - 请求数据结构定义和验证 * - 响应数据结构定义 * - API文档生成支持 * - 类型安全保障 * * DTO分类: * - Query DTOs: 查询参数验证 * - Create DTOs: 创建操作数据验证 * - Update DTOs: 更新操作数据验证 * - Response DTOs: 响应数据结构定义 * * 最近修改: * - 2026-01-08: 注释规范优化 - 修正@author字段,更新版本号和修改记录 (修改者: moyin) * - 2026-01-08: 注释规范优化 - 为所有DTO类添加类注释,完善文档说明 (修改者: moyin) * - 2026-01-08: 文件夹扁平化 - 从dto/子文件夹移动到上级目录 (修改者: moyin) * - 2026-01-08: 功能新增 - 创建管理员数据库管理DTO (修改者: assistant) * * @author moyin * @version 1.0.3 * @since 2026-01-08 * @lastModified 2026-01-08 */ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, IsString, IsInt, Min, Max, IsEnum, IsEmail, IsArray, IsBoolean, IsNumber } from 'class-validator'; import { Transform } from 'class-transformer'; import { UserStatus } from '../../core/db/users/user_status.enum'; // ==================== 通用查询 DTOs ==================== /** * 管理员分页查询DTO * * 功能描述: * 定义分页查询的通用参数结构 * * 使用场景: * - 作为其他查询DTO的基类 * - 提供统一的分页参数验证 */ export class AdminPaginationDto { @ApiPropertyOptional({ description: '返回数量(默认20,最大100)', example: 20, minimum: 1, maximum: 100 }) @IsOptional() @IsInt() @Min(1) @Max(100) @Transform(({ value }) => parseInt(value)) limit?: number = 20; @ApiPropertyOptional({ description: '偏移量(默认0)', example: 0, minimum: 0 }) @IsOptional() @IsInt() @Min(0) @Transform(({ value }) => parseInt(value)) offset?: number = 0; } // ==================== 用户管理 DTOs ==================== /** * 管理员查询用户DTO * * 功能描述: * 定义用户查询接口的请求参数结构 * * 使用场景: * - GET /admin/database/users 接口的查询参数 * - 支持关键词搜索和分页查询 */ export class AdminQueryUsersDto extends AdminPaginationDto { @ApiPropertyOptional({ description: '搜索关键词(用户名、邮箱、昵称)', example: 'admin' }) @IsOptional() @IsString() search?: string; @ApiPropertyOptional({ description: '用户状态过滤', enum: UserStatus, example: UserStatus.ACTIVE }) @IsOptional() @IsEnum(UserStatus) status?: UserStatus; @ApiPropertyOptional({ description: '角色过滤', example: 1 }) @IsOptional() @IsInt() @Min(0) @Max(9) role?: number; } /** * 管理员创建用户DTO * * 功能描述: * 定义创建用户接口的请求数据结构和验证规则 * * 使用场景: * - POST /admin/database/users 接口的请求体 * - 包含用户创建所需的所有必要信息 */ export class AdminCreateUserDto { @ApiProperty({ description: '用户名', example: 'newuser' }) @IsString() username: string; @ApiPropertyOptional({ description: '邮箱', example: 'user@example.com' }) @IsOptional() @IsEmail() email?: string; @ApiPropertyOptional({ description: '手机号', example: '13800138000' }) @IsOptional() @IsString() phone?: string; @ApiProperty({ description: '昵称', example: '新用户' }) @IsString() nickname: string; @ApiPropertyOptional({ description: '密码哈希', example: 'hashed_password' }) @IsOptional() @IsString() password_hash?: string; @ApiPropertyOptional({ description: 'GitHub ID', example: 'github123' }) @IsOptional() @IsString() github_id?: string; @ApiPropertyOptional({ description: '头像URL', example: 'https://example.com/avatar.jpg' }) @IsOptional() @IsString() avatar_url?: string; @ApiPropertyOptional({ description: '角色', example: 1, minimum: 0, maximum: 9 }) @IsOptional() @IsInt() @Min(0) @Max(9) role?: number; @ApiPropertyOptional({ description: '邮箱是否已验证', example: false }) @IsOptional() @IsBoolean() email_verified?: boolean; @ApiPropertyOptional({ description: '用户状态', enum: UserStatus, example: UserStatus.ACTIVE }) @IsOptional() @IsEnum(UserStatus) status?: UserStatus; } /** * 管理员更新用户DTO * * 功能描述: * 定义更新用户接口的请求数据结构和验证规则 * * 使用场景: * - PUT /admin/database/users/:id 接口的请求体 * - 支持部分字段更新,所有字段都是可选的 */ export class AdminUpdateUserDto { @ApiPropertyOptional({ description: '用户名', example: 'updateduser' }) @IsOptional() @IsString() username?: string; @ApiPropertyOptional({ description: '邮箱', example: 'updated@example.com' }) @IsOptional() @IsEmail() email?: string; @ApiPropertyOptional({ description: '手机号', example: '13900139000' }) @IsOptional() @IsString() phone?: string; @ApiPropertyOptional({ description: '昵称', example: '更新用户' }) @IsOptional() @IsString() nickname?: string; @ApiPropertyOptional({ description: '头像URL', example: 'https://example.com/new-avatar.jpg' }) @IsOptional() @IsString() avatar_url?: string; @ApiPropertyOptional({ description: '角色', example: 2, minimum: 0, maximum: 9 }) @IsOptional() @IsInt() @Min(0) @Max(9) role?: number; @ApiPropertyOptional({ description: '邮箱是否已验证', example: true }) @IsOptional() @IsBoolean() email_verified?: boolean; @ApiPropertyOptional({ description: '用户状态', enum: UserStatus, example: UserStatus.INACTIVE }) @IsOptional() @IsEnum(UserStatus) status?: UserStatus; } // ==================== 用户档案管理 DTOs ==================== /** * 管理员查询用户档案DTO * * 功能描述: * 定义用户档案查询接口的请求参数结构 * * 使用场景: * - GET /admin/database/user-profiles 接口的查询参数 * - 支持地图过滤和分页查询 */ export class AdminQueryUserProfileDto extends AdminPaginationDto { @ApiPropertyOptional({ description: '当前地图过滤', example: 'plaza' }) @IsOptional() @IsString() current_map?: string; @ApiPropertyOptional({ description: '状态过滤', example: 1 }) @IsOptional() @IsInt() status?: number; @ApiPropertyOptional({ description: '用户ID过滤', example: '1' }) @IsOptional() @IsString() user_id?: string; } /** * 管理员创建用户档案DTO * * 功能描述: * 定义创建用户档案接口的请求数据结构和验证规则 * * 使用场景: * - POST /admin/database/user-profiles 接口的请求体 * - 包含用户档案创建所需的所有信息 */ export class AdminCreateUserProfileDto { @ApiProperty({ description: '用户ID', example: '1' }) @IsString() user_id: string; @ApiPropertyOptional({ description: '个人简介', example: '这是我的个人简介' }) @IsOptional() @IsString() bio?: string; @ApiPropertyOptional({ description: '简历内容', example: '工作经历和技能' }) @IsOptional() @IsString() resume_content?: string; @ApiPropertyOptional({ description: '标签', example: '["开发者", "游戏爱好者"]' }) @IsOptional() @IsString() tags?: string; @ApiPropertyOptional({ description: '社交链接', example: '{"github": "https://github.com/user"}' }) @IsOptional() @IsString() social_links?: string; @ApiPropertyOptional({ description: '皮肤ID', example: 'skin_001' }) @IsOptional() @IsString() skin_id?: string; @ApiPropertyOptional({ description: '当前地图', example: 'plaza' }) @IsOptional() @IsString() current_map?: string; @ApiPropertyOptional({ description: 'X坐标', example: 100.5 }) @IsOptional() @IsNumber() pos_x?: number; @ApiPropertyOptional({ description: 'Y坐标', example: 200.3 }) @IsOptional() @IsNumber() pos_y?: number; @ApiPropertyOptional({ description: '状态', example: 1 }) @IsOptional() @IsInt() status?: number; } /** * 管理员更新用户档案DTO * * 功能描述: * 定义更新用户档案接口的请求数据结构和验证规则 * * 使用场景: * - PUT /admin/database/user-profiles/:id 接口的请求体 * - 支持部分字段更新,所有字段都是可选的 */ export class AdminUpdateUserProfileDto { @ApiPropertyOptional({ description: '个人简介', example: '更新后的个人简介' }) @IsOptional() @IsString() bio?: string; @ApiPropertyOptional({ description: '简历内容', example: '更新后的简历内容' }) @IsOptional() @IsString() resume_content?: string; @ApiPropertyOptional({ description: '标签', example: '["高级开发者", "技术专家"]' }) @IsOptional() @IsString() tags?: string; @ApiPropertyOptional({ description: '社交链接', example: '{"linkedin": "https://linkedin.com/in/user"}' }) @IsOptional() @IsString() social_links?: string; @ApiPropertyOptional({ description: '皮肤ID', example: 'skin_002' }) @IsOptional() @IsString() skin_id?: string; @ApiPropertyOptional({ description: '当前地图', example: 'forest' }) @IsOptional() @IsString() current_map?: string; @ApiPropertyOptional({ description: 'X坐标', example: 150.7 }) @IsOptional() @IsNumber() pos_x?: number; @ApiPropertyOptional({ description: 'Y坐标', example: 250.9 }) @IsOptional() @IsNumber() pos_y?: number; @ApiPropertyOptional({ description: '状态', example: 0 }) @IsOptional() @IsInt() status?: number; } // ==================== Zulip账号关联管理 DTOs ==================== /** * 管理员查询Zulip账号DTO * * 功能描述: * 定义Zulip账号关联查询接口的请求参数结构 * * 使用场景: * - GET /admin/database/zulip-accounts 接口的查询参数 * - 支持用户ID过滤和分页查询 */ export class AdminQueryZulipAccountDto extends AdminPaginationDto { @ApiPropertyOptional({ description: '游戏用户ID过滤', example: '1' }) @IsOptional() @IsString() gameUserId?: string; @ApiPropertyOptional({ description: 'Zulip用户ID过滤', example: 12345 }) @IsOptional() @IsInt() zulipUserId?: number; @ApiPropertyOptional({ description: 'Zulip邮箱过滤', example: 'user@zulip.com' }) @IsOptional() @IsEmail() zulipEmail?: string; @ApiPropertyOptional({ description: '状态过滤', example: 'active', enum: ['active', 'inactive', 'suspended', 'error'] }) @IsOptional() @IsEnum(['active', 'inactive', 'suspended', 'error']) status?: 'active' | 'inactive' | 'suspended' | 'error'; } /** * 管理员创建Zulip账号DTO * * 功能描述: * 定义创建Zulip账号关联接口的请求数据结构和验证规则 * * 使用场景: * - POST /admin/database/zulip-accounts 接口的请求体 * - 包含Zulip账号关联创建所需的所有信息 */ export class AdminCreateZulipAccountDto { @ApiProperty({ description: '游戏用户ID', example: '1' }) @IsString() gameUserId: string; @ApiProperty({ description: 'Zulip用户ID', example: 12345 }) @IsInt() zulipUserId: number; @ApiProperty({ description: 'Zulip邮箱', example: 'user@zulip.com' }) @IsEmail() zulipEmail: string; @ApiProperty({ description: 'Zulip全名', example: '张三' }) @IsString() zulipFullName: string; @ApiProperty({ description: 'Zulip API密钥(加密)', example: 'encrypted_api_key' }) @IsString() zulipApiKeyEncrypted: string; @ApiPropertyOptional({ description: '状态', example: 'active', enum: ['active', 'inactive', 'suspended', 'error'] }) @IsOptional() @IsEnum(['active', 'inactive', 'suspended', 'error']) status?: 'active' | 'inactive' | 'suspended' | 'error'; } /** * 管理员更新Zulip账号DTO * * 功能描述: * 定义更新Zulip账号关联接口的请求数据结构和验证规则 * * 使用场景: * - PUT /admin/database/zulip-accounts/:id 接口的请求体 * - 支持部分字段更新,所有字段都是可选的 */ export class AdminUpdateZulipAccountDto { @ApiPropertyOptional({ description: 'Zulip全名', example: '李四' }) @IsOptional() @IsString() zulipFullName?: string; @ApiPropertyOptional({ description: 'Zulip API密钥(加密)', example: 'new_encrypted_api_key' }) @IsOptional() @IsString() zulipApiKeyEncrypted?: string; @ApiPropertyOptional({ description: '状态', example: 'suspended', enum: ['active', 'inactive', 'suspended', 'error'] }) @IsOptional() @IsEnum(['active', 'inactive', 'suspended', 'error']) status?: 'active' | 'inactive' | 'suspended' | 'error'; @ApiPropertyOptional({ description: '错误信息', example: '连接超时' }) @IsOptional() @IsString() errorMessage?: string; @ApiPropertyOptional({ description: '重试次数', example: 3 }) @IsOptional() @IsInt() @Min(0) retryCount?: number; } /** * 管理员批量更新状态DTO * * 功能描述: * 定义批量更新状态接口的请求数据结构和验证规则 * * 使用场景: * - POST /admin/database/zulip-accounts/batch-update-status 接口的请求体 * - 支持批量更新多个记录的状态 */ export class AdminBatchUpdateStatusDto { @ApiProperty({ description: 'ID列表', example: ['1', '2', '3'] }) @IsArray() @IsString({ each: true }) ids: string[]; @ApiProperty({ description: '目标状态', example: 'active', enum: ['active', 'inactive', 'suspended', 'error'] }) @IsEnum(['active', 'inactive', 'suspended', 'error']) status: 'active' | 'inactive' | 'suspended' | 'error'; @ApiPropertyOptional({ description: '操作原因', example: '批量激活账号' }) @IsOptional() @IsString() reason?: string; } // ==================== 响应 DTOs ==================== /** * 管理员数据库响应DTO * * 功能描述: * 定义管理员数据库操作的通用响应数据结构 * * 使用场景: * - 各种数据库管理接口的响应体基类 * - 包含操作状态、数据和消息信息 */ export class AdminDatabaseResponseDto { @ApiProperty({ description: '是否成功', example: true }) success: boolean; @ApiProperty({ description: '消息', example: '操作成功' }) message: string; @ApiPropertyOptional({ description: '数据' }) data?: any; @ApiPropertyOptional({ description: '错误码', example: 'RESOURCE_NOT_FOUND' }) error_code?: string; @ApiProperty({ description: '时间戳', example: '2026-01-08T10:30:00.000Z' }) timestamp: string; @ApiProperty({ description: '请求ID', example: 'req_1641636600000_abc123' }) request_id: string; } /** * 管理员数据库列表响应DTO * * 功能描述: * 定义管理员数据库列表查询的响应数据结构 * * 使用场景: * - 各种列表查询接口的响应体 * - 包含列表数据和分页信息 */ export class AdminDatabaseListResponseDto extends AdminDatabaseResponseDto { @ApiProperty({ description: '列表数据' }) data: { items: any[]; total: number; limit: number; offset: number; has_more: boolean; }; } /** * 管理员健康检查响应DTO * * 功能描述: * 定义系统健康检查接口的响应数据结构 * * 使用场景: * - GET /admin/database/health 接口的响应体 * - 包含系统健康状态信息 */ export class AdminHealthCheckResponseDto extends AdminDatabaseResponseDto { @ApiProperty({ description: '健康检查数据' }) data: { status: string; timestamp: string; services: { users: string; user_profiles: string; zulip_accounts: string; }; }; }