using System.Threading;
using Dpz.Core.Public.ViewModel.RequestEvent;

namespace Dpz.Core.Service.Event;

public class AddDanmakuCountEvent(
    IRepository<Video> repository,
    IBarrageService barrageService,
    IFusionCache fusionCache
) : IRequestHandler<AddDanmakuCountRequest>
{
    public async Task Handle(AddDanmakuCountRequest request, CancellationToken cancellationToken)
    {
        var count = await barrageService.GetGroupBarrageCountAsync(request.DanmakuGroup);
        var update = Builders<Video>.Update.Set(x => x.DanmakuCount, count);
        await repository.UpdateAsync(x => x.Id == request.DanmakuGroup, update, cancellationToken);

        var key = $"{CacheKey.VideoListKey}:{request.DanmakuGroup}";
        var cacheValue = await fusionCache.TryGetAsync<VmVideo>(key, token: cancellationToken);
        if (cacheValue.HasValue)
        {
            cacheValue.Value.DanmakuCount = count;
            await fusionCache.SetAsync(
                key,
                cacheValue.Value,
                TimeSpan.FromDays(1),
                [CacheKey.VideoListKey],
                token: cancellationToken
            );
        }

        var listCache = await fusionCache.TryGetAsync<List<VmVideo>>(
            CacheKey.VideoListKey,
            token: cancellationToken
        );
        if (listCache.HasValue)
        {
            var video = listCache.Value.FirstOrDefault(x => x.Id == request.DanmakuGroup);
            if (video != null)
            {
                video.DanmakuCount = count;
                await fusionCache.SetAsync(
                    CacheKey.VideoListKey,
                    listCache.Value,
                    TimeSpan.FromDays(1),
                    [CacheKey.VideoListKey],
                    token: cancellationToken
                );
            }
        }
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码功能解释

这段代码是一个事件处理器 AddDanmakuCountEvent,用于处理增加弹幕数量的请求。以下是它的主要功能:

主要功能

  1. 更新视频弹幕数量

    • 通过 barrageService.GetGroupBarrageCountAsync 获取指定弹幕组的弹幕总数
    • 使用 repository.UpdateAsync 更新数据库中对应视频的弹幕数量
  2. 缓存更新

    • 单个视频缓存更新

      • 检查是否存在该视频的缓存(CacheKey.VideoListKey:{DanmakuGroup}
      • 如果存在,更新缓存中的弹幕数量并重新设置缓存(有效期1天)
    • 视频列表缓存更新

      • 检查是否存在视频列表的缓存(CacheKey.VideoListKey
      • 如果存在,找到对应的视频并更新其弹幕数量,然后重新设置整个列表的缓存(有效期1天)

依赖项

  • IRepository<Video>:用于数据库操作
  • IBarrageService:用于获取弹幕数量
  • IFusionCache:用于缓存管理

处理流程

  1. 接收 AddDanmakuCountRequest 请求
  2. 从弹幕服务获取当前弹幕总数
  3. 更新数据库中的弹幕数量
  4. 更新相关缓存(单个视频和视频列表)

这个处理器确保了当弹幕数量变化时,数据库和缓存中的数据都能保持同步。

评论加载中...