using IM.DomainCommons;
using MessageService.Domain.Enums;
using MessageService.Domain.Events;
using MessageService.Domain.Tools;
namespace MessageService.Domain.Entities
{
public class Conversation : AggregateRootEntity
{
///
/// 用户
///
public Guid UserId { get; private set; }
///
/// 对方ID(群聊为群聊ID,单聊为单聊ID)
///
public Guid TargetId { get; private set; }
public string TargetAvatar { get; private set; }
public string TargetName { get; private set; }
///
/// 最后一条未读消息ID
///
public long? LastReadSequenceId { get; private set; }
///
/// 未读消息数
///
public int UnreadCount { get; private set; }
public ChatType ChatType { get; private set; }
///
/// 消息推送唯一标识符
///
public string StreamKey { get; private set; }
///
/// 最后一条最新消息
///
public string LastMessage { get; private set; }
///
/// 最后一条消息产生的时间。已读状态等会话元数据更新不得改变该值。
///
public DateTimeOffset? LastMessageTime { get; private set; }
private Conversation() { }
public Conversation(Guid userId, Guid targetId, string targetAvatar, string targetName, long? lastReadSequenceId, int unreadCount, ChatType chatType, string lastMessage)
{
UserId = userId;
TargetId = targetId;
TargetAvatar = targetAvatar;
TargetName = targetName;
LastReadSequenceId = lastReadSequenceId;
UnreadCount = unreadCount;
ChatType = chatType;
LastMessage = lastMessage;
LastMessageTime = DateTimeOffset.Now;
ModificationTime = DateTime.Now;
StreamKey = ChatType == ChatType.GROUP ? StreamKeyBuilder.Group(targetId) : StreamKeyBuilder.Private(userId, targetId);
AddDomainEvent(new ConversationCreatedDomainEvent(this));
}
public void SetLastReadSequence(long sequenceId)
{
LastReadSequenceId = sequenceId;
NotifyModified();
}
public void IncrementUnread()
{
UnreadCount += 1;
NotifyModified();
}
public void UpdateLastMessage(string lastMessage, DateTimeOffset messageTime)
{
LastMessage = lastMessage;
LastMessageTime = messageTime;
NotifyModified();
}
///
/// 标记会话已读(清零未读数,更新最后已读消息序列号)
///
public void MarkAsRead(long? lastReadSequenceId)
{
UnreadCount = 0;
if (lastReadSequenceId.HasValue)
LastReadSequenceId = lastReadSequenceId.Value;
NotifyModified();
}
public void UpdateProfile(string name, string avatar)
{
TargetAvatar = avatar;
TargetName = name;
}
}
}