Files
IM_NEW/ConnectorService/Dtos/MessageHubResponse.cs
T
2026-05-09 17:06:30 +08:00

82 lines
2.8 KiB
C#

using IM.Commons.IntegrationEvents;
namespace ConnectorService.Dtos
{
public record MessageHubResponse
{
public Guid Id { get; init; }
/// <summary>
/// 客户端去重/回执使用的本地 ID
/// </summary>
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; }
/// <summary>
/// 服务器推送到达时间 (毫秒级时间戳,强烈建议加上)
/// </summary>
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<string, string>? Ext,
HubQuoteInfoDto? Quote
);
public record HubQuoteInfoDto(
Guid MessageId,
Guid SenderId,
string SenderName,
string MessageType,
string Preview
);
public static class MessageEventMapper
{
/// <summary>
/// 将内部集成事件转换为对外推送的 DTO
/// </summary>
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!
};
}
}
}