Files
IM_NEW/MessageService.Domain/Entities/Conversation.cs

106 lines
3.2 KiB
C#

using IM.DomainCommons;
using MessageService.Domain.Enums;
using MessageService.Domain.Events;
using MessageService.Domain.Tools;
namespace MessageService.Domain.Entities
{
public class Conversation : AggregateRootEntity
{
/// <summary>
/// 用户
/// </summary>
public Guid UserId { get; private set; }
/// <summary>
/// 对方ID(群聊为群聊ID,单聊为单聊ID)
/// </summary>
public Guid TargetId { get; private set; }
public string TargetAvatar { get; private set; }
public string TargetName { get; private set; }
/// <summary>
/// 最后一条未读消息ID
/// </summary>
public long? LastReadSequenceId { get; private set; }
/// <summary>
/// 未读消息数
/// </summary>
public int UnreadCount { get; private set; }
public ChatType ChatType { get; private set; }
/// <summary>
/// 消息推送唯一标识符
/// </summary>
public string StreamKey { get; private set; }
/// <summary>
/// 最后一条最新消息
/// </summary>
public string LastMessage { get; private set; }
/// <summary>
/// 最后一条消息产生的时间。已读状态等会话元数据更新不得改变该值。
/// </summary>
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();
}
/// <summary>
/// 标记会话已读(清零未读数,更新最后已读消息序列号)
/// </summary>
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;
}
}
}