using FreeSql;
using LiveForum.Code.Base;
using LiveForum.Code.JwtInfrastructure;
using LiveForum.IService.Flowers;
using LiveForum.IService.Messages;
using LiveForum.IService.Others;
using LiveForum.Model;
using LiveForum.Model.Dto.Flowers;
using LiveForum.Model.Dto.Messages;
using System;
using System.Linq;
using System.Threading.Tasks;
using TencentCloud.Tbm.V20180129.Models;
namespace LiveForum.Service.Flowers
{
///
/// 送花服务实现
///
public class FlowersService : IFlowersService
{
private readonly JwtUserInfoModel _userInfoModel;
private readonly IFreeSql _fsql;
private readonly IBaseRepository _flowerRecordsInfoRepository;
private readonly IBaseRepository _flowerRecordsRepository;
private readonly IBaseRepository _streamersRepository;
private readonly IBaseRepository _postsRepository;
private readonly IMessagePublisher _messagePublisher;
private readonly IFlowerService _flowerService;
private readonly IAntiAddictionService _antiAddictionService;
///
/// 构造函数
///
/// JWT用户信息模型
/// FreeSql实例
/// 送花详细记录仓储
/// 送花月度汇总仓储
/// 主播仓储
/// 帖子仓储
/// 消息发布器
/// 送花服务
public FlowersService(
JwtUserInfoModel userInfoModel,
IFreeSql fsql,
IBaseRepository flowerRecordsInfoRepository,
IBaseRepository flowerRecordsRepository,
IBaseRepository streamersRepository,
IBaseRepository postsRepository,
IMessagePublisher messagePublisher,
IFlowerService flowerService,
IAntiAddictionService antiAddictionService
)
{
_userInfoModel = userInfoModel;
_fsql = fsql;
_flowerRecordsInfoRepository = flowerRecordsInfoRepository;
_flowerRecordsRepository = flowerRecordsRepository;
_streamersRepository = streamersRepository;
_postsRepository = postsRepository;
_messagePublisher = messagePublisher;
_flowerService = flowerService;
_antiAddictionService = antiAddictionService;
}
///
/// 送花
///
/// 请求参数
///
public async Task> SendFlower(SendFlowerReq request)
{
try
{
var currentUserId = (long)_userInfoModel.UserId;
// 防沉迷校验
if (await _antiAddictionService.IsRestrictedAsync("Flower"))
{
return new BaseResponse(ResponseCode.Error, "防沉迷时间内无法操作");
}
// 1. 验证目标是否存在并获取接收者ID
long? receiverId = null;
if (request.TargetType == "Streamer")
{
var streamer = await _streamersRepository.Select
.Where(s => s.Id == request.TargetId)
.FirstAsync();
if (streamer == null)
{
return new BaseResponse(ResponseCode.Error, "主播不存在");
}
}
else if (request.TargetType == "Post")
{
var post = await _postsRepository.Select
.Where(p => p.Id == request.TargetId && !p.IsDeleted)
.FirstAsync();
if (post == null)
{
return new BaseResponse(ResponseCode.Error, "帖子不存在");
}
receiverId = post.UserId;
}
else
{
return new BaseResponse(ResponseCode.Error, "无效的目标类型");
}
// 2. 检查1小时限制
var canSend = await _flowerService.CanSendFlowerAsync(currentUserId, request.TargetType, request.TargetId);
if (!canSend)
{
return new BaseResponse(ResponseCode.Error, "每小时只能赠送1次");
}
// 3. 执行送花操作(Redis+队列)
await _flowerService.SendFlowerAsync(currentUserId, request.TargetType, request.TargetId, receiverId ?? 0);
// 4. 获取最新花数
var flowerCount = await _flowerService.GetFlowerCountAsync(request.TargetType, request.TargetId);
// 5. 发送送花消息(如果是帖子且不是自己的帖子)
if (request.TargetType == "Post" && receiverId.HasValue && receiverId.Value != currentUserId)
{
try
{
var post = await _postsRepository.Select
.Where(p => p.Id == request.TargetId)
.FirstAsync();
if (post != null)
{
await _messagePublisher.SendLikeMessageAsync(
triggerId: currentUserId,
receiverId: receiverId.Value,
contentType: 3, // 送花类型
contentId: post.Id,
postTitle: post.Title,
commentContent: null
);
}
}
catch (Exception ex)
{
// 记录日志但不影响送花操作
Console.WriteLine($"发送送花消息失败: {ex.Message}");
}
}
// 6. 返回成功响应
return new BaseResponse("送花成功!", new SendFlowerRespDto
{
FlowerCount = flowerCount
});
}
catch (Exception ex)
{
return new BaseResponse(ResponseCode.Error, "系统出错");
}
}
}
}