dto:添加聊天系统相关的数据传输对象

- 新增 SendChatMessageDto 用于发送聊天消息请求
- 新增 ChatMessageResponseDto 用于消息发送响应
- 新增 GetChatHistoryDto 用于获取聊天历史请求
- 新增 ChatHistoryResponseDto 用于聊天历史响应
- 新增 SystemStatusResponseDto 用于系统状态查询
- 包含完整的 API 文档注解和数据验证规则
This commit is contained in:
moyin
2026-01-07 15:05:21 +08:00
parent 4bda65d593
commit 7fd6740090

View File

@@ -0,0 +1,313 @@
/**
* 聊天相关的 DTO 定义
*
* @author angjustinl
* @version 1.0.0
* @since 2025-01-07
*/
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsString, IsNotEmpty, IsOptional, IsNumber, IsBoolean, IsEnum, IsArray, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';
/**
* 发送聊天消息请求 DTO
*/
export class SendChatMessageDto {
@ApiProperty({
description: '消息内容',
example: '大家好!我刚进入游戏',
maxLength: 1000
})
@IsString()
@IsNotEmpty()
content: string;
@ApiProperty({
description: '消息范围',
example: 'local',
enum: ['local', 'global'],
default: 'local'
})
@IsString()
@IsNotEmpty()
scope: string;
@ApiPropertyOptional({
description: '地图ID可选用于地图相关消息',
example: 'whale_port'
})
@IsOptional()
@IsString()
mapId?: string;
}
/**
* 聊天消息响应 DTO
*/
export class ChatMessageResponseDto {
@ApiProperty({
description: '是否成功',
example: true
})
success: boolean;
@ApiProperty({
description: '消息ID',
example: 12345
})
messageId: number;
@ApiProperty({
description: '响应消息',
example: '消息发送成功'
})
message: string;
@ApiPropertyOptional({
description: '错误信息(失败时)',
example: '消息内容不能为空'
})
error?: string;
}
/**
* 获取聊天历史请求 DTO
*/
export class GetChatHistoryDto {
@ApiPropertyOptional({
description: '地图ID可选',
example: 'whale_port'
})
@IsOptional()
@IsString()
mapId?: string;
@ApiPropertyOptional({
description: '消息数量限制',
example: 50,
default: 50,
minimum: 1,
maximum: 100
})
@IsOptional()
@IsNumber()
@Type(() => Number)
limit?: number = 50;
@ApiPropertyOptional({
description: '偏移量(分页用)',
example: 0,
default: 0,
minimum: 0
})
@IsOptional()
@IsNumber()
@Type(() => Number)
offset?: number = 0;
}
/**
* 聊天消息信息 DTO
*/
export class ChatMessageInfoDto {
@ApiProperty({
description: '消息ID',
example: 12345
})
id: number;
@ApiProperty({
description: '发送者用户名',
example: 'Player_123'
})
sender: string;
@ApiProperty({
description: '消息内容',
example: '大家好!'
})
content: string;
@ApiProperty({
description: '消息范围',
example: 'local'
})
scope: string;
@ApiProperty({
description: '地图ID',
example: 'whale_port'
})
mapId: string;
@ApiProperty({
description: '发送时间',
example: '2025-01-07T14:30:00.000Z'
})
timestamp: string;
@ApiProperty({
description: 'Zulip Stream 名称',
example: 'Whale Port'
})
streamName: string;
@ApiProperty({
description: 'Zulip Topic 名称',
example: 'Game Chat'
})
topicName: string;
}
/**
* 聊天历史响应 DTO
*/
export class ChatHistoryResponseDto {
@ApiProperty({
description: '是否成功',
example: true
})
success: boolean;
@ApiProperty({
description: '消息列表',
type: [ChatMessageInfoDto]
})
@ValidateNested({ each: true })
@Type(() => ChatMessageInfoDto)
messages: ChatMessageInfoDto[];
@ApiProperty({
description: '总消息数',
example: 150
})
total: number;
@ApiProperty({
description: '当前页消息数',
example: 50
})
count: number;
@ApiPropertyOptional({
description: '错误信息(失败时)',
example: '获取消息历史失败'
})
error?: string;
}
/**
* WebSocket 连接状态 DTO
*/
export class WebSocketStatusDto {
@ApiProperty({
description: '总连接数',
example: 25
})
totalConnections: number;
@ApiProperty({
description: '已认证连接数',
example: 20
})
authenticatedConnections: number;
@ApiProperty({
description: '活跃会话数',
example: 18
})
activeSessions: number;
@ApiProperty({
description: '各地图在线人数',
example: {
'whale_port': 8,
'pumpkin_valley': 5,
'novice_village': 7
}
})
mapPlayerCounts: Record<string, number>;
}
/**
* Zulip 集成状态 DTO
*/
export class ZulipIntegrationStatusDto {
@ApiProperty({
description: 'Zulip 服务器连接状态',
example: true
})
serverConnected: boolean;
@ApiProperty({
description: 'Zulip 服务器版本',
example: '11.4'
})
serverVersion: string;
@ApiProperty({
description: '机器人账号状态',
example: true
})
botAccountActive: boolean;
@ApiProperty({
description: '可用 Stream 数量',
example: 12
})
availableStreams: number;
@ApiProperty({
description: '游戏相关 Stream 列表',
example: ['Whale Port', 'Pumpkin Valley', 'Novice Village']
})
gameStreams: string[];
@ApiProperty({
description: '最近24小时消息数',
example: 156
})
recentMessageCount: number;
}
/**
* 系统状态响应 DTO
*/
export class SystemStatusResponseDto {
@ApiProperty({
description: 'WebSocket 状态',
type: WebSocketStatusDto
})
@ValidateNested()
@Type(() => WebSocketStatusDto)
websocket: WebSocketStatusDto;
@ApiProperty({
description: 'Zulip 集成状态',
type: ZulipIntegrationStatusDto
})
@ValidateNested()
@Type(() => ZulipIntegrationStatusDto)
zulip: ZulipIntegrationStatusDto;
@ApiProperty({
description: '系统运行时间(秒)',
example: 86400
})
uptime: number;
@ApiProperty({
description: '内存使用情况',
example: {
used: '45.2 MB',
total: '64.0 MB',
percentage: 70.6
}
})
memory: {
used: string;
total: string;
percentage: number;
};
}