using IM.Commons.IntegrationEvents; namespace ConnectorService.Dtos { public record MessageHubResponse { public Guid Id { get; init; } /// /// 客户端去重/回执使用的本地 ID /// public Guid ClientId { get; init; } public string ChatType { get; init; } = string.Empty; public string MsgType { get; init; } = string.Empty; public Guid SenderId { get; init; } public Guid TargetId { get; init; } public string State { get; init; } = string.Empty; public string StreamKey { get; init; } = string.Empty; public long SequenceId { get; init; } /// /// 服务器推送到达时间 (毫秒级时间戳,强烈建议加上) /// public long PushTimestamp { get; init; } = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); public HubMsgContentDto Content { get; init; } = null!; } // 嵌套的内容对象,允许 Ext 和 Quote 为 null 以缩减 JSON 体积 public record HubMsgContentDto( string Fallback, object Body, Dictionary? Ext, HubQuoteInfoDto? Quote ); public record HubQuoteInfoDto( Guid MessageId, Guid SenderId, string SenderName, string MessageType, string Preview ); public static class MessageEventMapper { /// /// 将内部集成事件转换为对外推送的 DTO /// public static MessageHubResponse ToHubResponse(this MsgCreatedEvent @event) { if (@event == null) throw new ArgumentNullException(nameof(@event)); return new MessageHubResponse { Id = @event.Id, ClientId = @event.ClientId, ChatType = @event.ChatType, MsgType = @event.MsgType, SenderId = @event.SenderId, TargetId = @event.TargetId, State = @event.State, StreamKey = @event.StreamKey, SequenceId = @event.SequenceId, // 嵌套映射 Content = @event.Content != null ? new HubMsgContentDto( @event.Content.Fallback, @event.Content.Body, @event.Content.Ext, @event.Content.Quote != null ? new HubQuoteInfoDto( @event.Content.Quote.MessageId, @event.Content.Quote.SenderId, @event.Content.Quote.SenderName, @event.Content.Quote.MessageType, @event.Content.Quote.Preview ) : null ) : null! }; } } }