网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using Dpz.Core.Public.ViewModel.RequestEvent;
using ZiggyCreatures.Caching.Fusion;

namespace Dpz.Core.Service.V4.Implements;

public class MumbleService(
    IRepository<Mumble> repository,
    IMapper mapper,
    IMediator mediator,
    IFusionCache fusionCache
) : AbstractCacheService(fusionCache), IMumbleService
{
    protected override string CachePrefixKey => "Dpz.Core.Service.V4.Implements.MumbleService";
    protected override TimeSpan CacheDefaultExpiration => TimeSpan.FromDays(3);

    private readonly IFusionCache _fusionCache = fusionCache;

    private async Task ClearCacheAsync()
    {
        var tags = new[]
        {
            CachePrefixKey + nameof(GetPagesAsync),
            CachePrefixKey + nameof(GetRandomMumblesAsync),
            CachePrefixKey + nameof(FindAsync),
        };
        await _fusionCache.RemoveByTagAsync(tags);
    }

    public async Task<VmMumble> CreateAsync(VmMumble talk)
    {
        var entity = mapper.Map<Mumble>(talk);
        await repository.InsertAsync(entity);
        await ClearCacheAsync();
        return mapper.Map<VmMumble>(entity);
    }

    public async Task<VmMumble?> EditContentAsync(VmMumble mumble)
    {
        if (mumble == null)
            throw new ArgumentNullException(nameof(mumble));
        if (mumble.Markdown == null)
            throw new ArgumentNullException(nameof(mumble.Markdown));
        if (mumble.HtmlContent == null)
            throw new ArgumentNullException(nameof(mumble.HtmlContent));

        var entity = await repository.TryGetAsync(mumble.Id);

        if (entity == null)
            return null;

        var request = new EditMarkdownRequest
        {
            Markdown = mumble.Markdown,
            OriginalMarkdown = entity.Markdown,
        };
        await mediator.Send(request);

        var update = Builders<Mumble>
            .Update.Set(x => x.HtmlContent, mumble.HtmlContent)
            .Set(x => x.Markdown, mumble.Markdown)
            .Set(x => x.LastUpdateTime, DateTime.Now);
        await repository.UpdateAsync(x => x.Id == entity.Id, update);
        await ClearCacheAsync();
        return mapper.Map<VmMumble>(await repository.FindAsync(entity.Id));
    }

    public async Task<IPagedList<VmMumble>> GetPagesAsync(
        int pageIndex,
        int pageSize,
        string? content = null,
        string? account = null
    )
    {
        return await GetOrSetPagedListAsync(
            nameof(GetPagesAsync),
            async _ =>
            {
                var predicate = repository.SearchFor(x => true);
                if (!string.IsNullOrEmpty(content))
                    predicate = predicate.Where(x => x.Markdown.Contains(content));
                if (!string.IsNullOrEmpty(account))
                    predicate = predicate.Where(x => x.Author.Id == account);

                return await predicate
                    .OrderByDescending(x => x.CreateTime)
                    .ToPagedListAsync<Mumble, VmMumble>(pageIndex, pageSize);
            },
            new
            {
                content,
                account,
                pageIndex,
                pageSize,
            }
        );
    }

    public async Task<List<VmMumble>> GetRandomMumblesAsync(int count)
    {
        return await GetOrSetCacheAsync<List<VmMumble>>(
            nameof(GetRandomMumblesAsync),
            async (_, cancellationToken) =>
            {
                var date = DateTime.Now;
                var data = await repository
                    .SearchFor(x =>
                        x.CreateTime.Month == date.Month
                        && x.CreateTime.Day == date.Day
                        && x.CreateTime.Year != date.Year
                    )
                    .Take(count)
                    .OrderByDescending(x => x.CreateTime)
                    .ToListAsync(cancellationToken);
                if (data.Count == 0)
                {
                    data = await repository.SearchFor(x => true).Sample(count).ToListAsync();
                }
                return mapper.Map<List<VmMumble>>(data);
            },
            new { count },
            x => x.SetDuration(TimeSpan.FromHours(3))
        );
    }

    public async Task<VmMumble?> FindAsync(string id)
    {
        return await GetOrSetCacheAsync<VmMumble?>(
            nameof(FindAsync),
            async (_, _) => mapper.Map<VmMumble?>(await repository.TryGetAsync(id)),
            new { id }
        );
    }

    public async Task DeleteAsync(params string[] id)
    {
        var list = await repository.TryGetListAsync(id);
        var request = new DeleteMarkdownRequest
        {
            Markdown = list.Select(x => x.Markdown).ToList(),
        };
        await mediator.Send(request);
        await repository.TryDeleteAsync(id);
        await ClearCacheAsync();
    }

    public async Task<VmMumble?> LikeAsync(string id)
    {
        var entity = await repository.TryGetAsync(id);

        if (entity is null)
            return null;

        entity.Like += 1;
        var update = Builders<Mumble>.Update.Inc(x => x.Like, 1);
        await repository.UpdateAsync(z => z.Id == entity.Id, update);
        await ClearCacheAsync();
        return mapper.Map<VmMumble>(entity);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 MumbleService 的服务类,它实现了 IMumbleService 接口,提供了一系列与 Mumble 实体相关的操作。以下是对每个方法的详细解释:

  1. CreateAsync:

    • 功能:创建一个新的 Mumble 实体。
    • 输入:接收一个 VmMumble 视图模型。
    • 过程:将视图模型映射到 Mumble 实体,插入到数据库中,并返回映射后的视图模型。
  2. EditContentAsync:

    • 功能:编辑现有 Mumble 实体的内容。
    • 输入:接收一个 VmMumble 视图模型。
    • 过程:
      • 检查输入是否为 null,并确保 Markdown 和 HTML 内容不为空。
      • 从数据库中查找对应的 Mumble 实体。
      • 如果找到了实体,发送一个编辑请求(EditMarkdownRequest),更新 Markdown 内容。
      • 更新实体的 HTML 内容、Markdown 和最后更新时间,并返回更新后的视图模型。
  3. GetPagesAsync:

    • 功能:获取分页的 Mumble 列表。
    • 输入:页码、每页大小、可选的内容和账户过滤条件。
    • 过程:根据输入条件构建查询,返回符合条件的 Mumble 列表,按创建时间降序排列。
  4. GetRandomMumblesAsync:

    • 功能:获取随机的 Mumble 实体。
    • 输入:请求的数量。
    • 过程:首先尝试获取当天创建的 Mumble 实体。如果没有找到,则从所有 Mumble 中随机选择指定数量的实体。
  5. FindAsync:

    • 功能:根据 ID 查找 Mumble 实体。
    • 输入:实体的 ID。
    • 过程:从数据库中查找对应的 Mumble 实体,并返回映射后的视图模型。
  6. DeleteAsync:

    • 功能:删除指定的 Mumble 实体。
    • 输入:一个或多个实体的 ID。
    • 过程:查找要删除的实体,发送删除请求(DeleteMarkdownRequest),然后从数据库中删除这些实体。
  7. LikeAsync:

    • 功能:为指定的 Mumble 实体增加一个点赞。
    • 输入:实体的 ID。
    • 过程:查找对应的 Mumble 实体,如果存在,则增加其点赞数,并更新数据库中的点赞数,最后返回更新后的视图模型。

总结

MumbleService 类提供了对 Mumble 实体的基本 CRUD(创建、读取、更新、删除)操作,以及一些额外的功能,如获取随机实体和点赞功能。它使用了依赖注入的方式来获取 IRepository<Mumble>IMapperIMediator,以便于进行数据访问、对象映射和请求处理。

loading