570 lines
16 KiB
TypeScript
570 lines
16 KiB
TypeScript
/**
|
||
* 管理员数据库管理 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;
|
||
};
|
||
};
|
||
} |