live-forum/server/webapi/LiveForum/LiveForum.Service/Messages/MessagePublisher.cs
2026-03-24 11:27:37 +08:00

225 lines
7.5 KiB
C#

using FreeSql;
using LiveForum.IService.Messages;
using LiveForum.Model;
using LiveForum.Model.Events;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
namespace LiveForum.Service.Messages
{
/// <summary>
/// 消息发布器实现
/// 轻量级门面,只负责构造事件并发布到队列,不查询数据库
/// </summary>
public class MessagePublisher : IMessagePublisher
{
private readonly IMessageEventBus _eventBus;
private readonly IBaseRepository<T_Messages> _messagesRepository;
private readonly ILogger<MessagePublisher> _logger;
public MessagePublisher(
IMessageEventBus eventBus,
IBaseRepository<T_Messages> messagesRepository,
ILogger<MessagePublisher> logger)
{
_eventBus = eventBus;
_messagesRepository = messagesRepository;
_logger = logger;
}
/// <summary>
/// 发送系统消息(直接写入数据库,不走队列)
/// </summary>
public async Task SendSystemMessageAsync(long receiverId, string title, string content)
{
try
{
var message = new T_Messages
{
ReceiverId = receiverId,
SenderId = null, // 系统消息没有发送者
MessageType = 3, // 系统消息
MessageTitle = title,
MessageContent = content,
ContentType = 0,
ContentId = null,
IsRead = false,
CreatedAt = DateTime.Now
};
await _messagesRepository.InsertAsync(message);
_logger.LogInformation(
"[MessagePublisher] 系统消息已创建: ReceiverId={ReceiverId}, Title={Title}",
receiverId, title);
}
catch (Exception ex)
{
_logger.LogError(ex,
"[MessagePublisher] 发送系统消息失败: ReceiverId={ReceiverId}",
receiverId);
throw;
}
}
/// <summary>
/// 发送回复消息(完整版)
/// </summary>
public async Task SendReplyMessageAsync(
long triggerId,
long receiverId,
long commentId,
string commentContent,
long postId,
string postTitle,
long? parentCommentId = null,
string myCommentContent = null)
{
try
{
var evt = new CommentReplyEvent
{
TriggerId = triggerId,
ReceiverId = receiverId,
CommentId = commentId,
CommentContent = commentContent,
PostId = postId,
PostTitle = postTitle,
ParentCommentId = parentCommentId,
MyCommentContent = myCommentContent,
IsDirectComment = !parentCommentId.HasValue
};
await _eventBus.PublishAsync(evt);
_logger.LogInformation(
"[MessagePublisher] 回复消息事件已发布: EventId={EventId}, ReceiverId={ReceiverId}, CommentId={CommentId}",
evt.EventId, receiverId, commentId);
}
catch (Exception ex)
{
_logger.LogError(ex,
"[MessagePublisher] 发送回复消息失败: TriggerId={TriggerId}, ReceiverId={ReceiverId}",
triggerId, receiverId);
throw;
}
}
/// <summary>
/// 发送回复消息(简化版)
/// </summary>
public async Task SendReplyMessageSimpleAsync(
long triggerId,
long receiverId,
string title,
string content,
string myCommentContent = null)
{
try
{
var evt = new CustomMessageEvent
{
TriggerId = triggerId,
ReceiverId = receiverId,
MessageType = 1, // 回复消息
Title = title,
Content = content,
MyCommentContent = myCommentContent
};
await _eventBus.PublishAsync(evt);
_logger.LogInformation(
"[MessagePublisher] 自定义回复消息事件已发布: EventId={EventId}, ReceiverId={ReceiverId}",
evt.EventId, receiverId);
}
catch (Exception ex)
{
_logger.LogError(ex,
"[MessagePublisher] 发送简化回复消息失败: TriggerId={TriggerId}, ReceiverId={ReceiverId}",
triggerId, receiverId);
throw;
}
}
/// <summary>
/// 发送点赞消息(完整版)
/// </summary>
public async Task SendLikeMessageAsync(
long triggerId,
long receiverId,
byte contentType,
long contentId,
string postTitle = null,
string commentContent = null)
{
try
{
var evt = new LikeEvent
{
TriggerId = triggerId,
ReceiverId = receiverId,
ContentType = contentType,
ContentId = contentId,
Content = new ContentSnapshot
{
PostTitle = postTitle,
CommentContent = commentContent
}
};
await _eventBus.PublishAsync(evt);
_logger.LogInformation(
"[MessagePublisher] 点赞消息事件已发布: EventId={EventId}, ReceiverId={ReceiverId}, ContentType={ContentType}, ContentId={ContentId}",
evt.EventId, receiverId, contentType, contentId);
}
catch (Exception ex)
{
_logger.LogError(ex,
"[MessagePublisher] 发送点赞消息失败: TriggerId={TriggerId}, ReceiverId={ReceiverId}",
triggerId, receiverId);
throw;
}
}
/// <summary>
/// 发送点赞消息(简化版)
/// </summary>
public async Task SendLikeMessageSimpleAsync(
long triggerId,
long receiverId,
string title,
string content)
{
try
{
var evt = new CustomMessageEvent
{
TriggerId = triggerId,
ReceiverId = receiverId,
MessageType = 2, // 点赞消息
Title = title,
Content = content,
MyCommentContent = null
};
await _eventBus.PublishAsync(evt);
_logger.LogInformation(
"[MessagePublisher] 自定义点赞消息事件已发布: EventId={EventId}, ReceiverId={ReceiverId}",
evt.EventId, receiverId);
}
catch (Exception ex)
{
_logger.LogError(ex,
"[MessagePublisher] 发送简化点赞消息失败: TriggerId={TriggerId}, ReceiverId={ReceiverId}",
triggerId, receiverId);
throw;
}
}
}
}