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

namespace Dpz.Core.Service.V4.Implements;

public class PictureRecordService(
    IRepository<PictureRecord> repository,
    IMapper mapper,
    IFusionCache fusionCache
) : AbstractCacheService(fusionCache), IPictureRecordService
{
    protected override string CachePrefixKey =>
        "Dpz.Core.Service.V4.Implements.PictureRecordService";
    protected override TimeSpan CacheDefaultExpiration => TimeSpan.FromDays(1);

    private readonly IFusionCache _fusionCache = fusionCache;

    public async Task<ICollection<string>> GetTagsAsync()
    {
        return await GetOrSetCacheAsync<List<string>>(
            nameof(GetTagsAsync),
            async (_, cancellationToken) =>
            {
                var tags = await repository
                    .MongodbQueryable
                    //.Select(x => x.Tags)
                    .SelectMany(x => x.Tags)
                    .GroupBy(x => x)
                    .Select(x => x.Key)
                    .ToListAsync(cancellationToken);
                return tags;
            }
        );
    }

    public async Task<ICollection<VmPictureRecord>> GetBannerAsync()
    {
        return await GetOrSetCacheAsync<List<VmPictureRecord>>(
            nameof(GetBannerAsync),
            async (_, _) =>
            {
                var pagedList = await repository
                    .SearchFor(x => x.Tags.Any(y => y == "banner"))
                    .OrderByDescending(x => x.UploadTime)
                    .ToListAsync<PictureRecord, VmPictureRecord>();
                pagedList.ForEach(x => x.AccessUrl += "!banner");
                return pagedList;
            }
        );
    }

    public async Task<IPagedList<VmPictureRecord>> GetPagesAsync(
        List<string>? tags,
        string? description,
        int pageIndex = 1,
        int pageSize = 20
    )
    {
        return await GetOrSetPagedListAsync<VmPictureRecord>(
            nameof(GetPagesAsync),
            async _ =>
            {
                var filterEmpty = Builders<PictureRecord>.Filter.Empty;
                var filters = new List<FilterDefinition<PictureRecord>>();

                var clearTags =
                    tags?.Where(x => !string.IsNullOrEmpty(x)).Select(x => x).ToList() ?? [];
                if (clearTags.Count > 0)
                {
                    var filter = Builders<PictureRecord>.Filter.AnyIn(x => x.Tags, clearTags);
                    filters.Add(filter);
                }

                if (!string.IsNullOrEmpty(description))
                {
                    var filter = Builders<PictureRecord>.Filter.Regex(
                        x => x.Description,
                        new BsonRegularExpression(description, "i")
                    );
                    filters.Add(filter);
                }

                var filterResult =
                    filters.Count > 0 ? Builders<PictureRecord>.Filter.And(filters) : filterEmpty;

                return await repository
                    .SearchFor(filterResult)
                    .SortByDescending(x => x.Id)
                    .ToPagedListAsync<PictureRecord, VmPictureRecord>(pageIndex, pageSize);
            },
            new
            {
                tags,
                description,
                pageIndex,
                pageSize,
            }
        );
    }

    public async Task<VmPictureRecord?> GetPictureRecordAsync(string id)
    {
        return await GetOrSetCacheAsync<VmPictureRecord?>(
            nameof(GetPictureRecordAsync),
            async (_, _) =>
            {
                var entity = await repository.TryGetAsync(id);
                return entity == null ? null : mapper.Map<VmPictureRecord>(entity);
            },
            new { id }
        );
    }

    public async Task<VmPictureRecord> CreateRecordAsync(VmPictureRecord pictureRecord)
    {
        var entity = mapper.Map<PictureRecord>(pictureRecord);
        await repository.InsertAsync(entity);
        if (entity.Tags.Any(x => x == "banner"))
        {
            await _fusionCache.RemoveAsync(CacheKey.HomeContainerKey);
        }
        await ClearCacheAsync();
        return mapper.Map<VmPictureRecord>(entity);
    }

    public async Task<VmPictureRecord?> ChangeInformationAsync(VmPictureRecordChange change)
    {
        if (!ObjectId.TryParse(change.Id, out var oid))
        {
            return null;
        }

        var update = Builders<PictureRecord>
            .Update.Set(x => x.Category, change.Category)
            .Set(x => x.Description, change.Description)
            .Set(x => x.Tags, change.Tags);

        await repository.UpdateAsync(x => x.Id == oid, update);
        if (change.Tags.Any(x => x == "banner"))
        {
            await _fusionCache.RemoveAsync(CacheKey.HomeContainerKey);
        }

        await ClearCacheAsync();

        var entity = await repository.FindAsync(oid);
        return entity == null ? null : mapper.Map<VmPictureRecord>(entity);
    }

    public async Task DeleteAsync(string id)
    {
        var entity = await repository.TryGetAsync(id);
        if (entity == null)
        {
            return;
        }

        await ClearCacheAsync();

        await repository.DeleteAsync(entity.Id);
    }

    public async Task ClearCacheAsync()
    {
        var removeTags = new[]
        {
            CachePrefixKey + nameof(GetTagsAsync),
            CachePrefixKey + nameof(GetPagesAsync),
            CachePrefixKey + nameof(GetBannerAsync),
            CachePrefixKey + nameof(GetPictureRecordAsync),
        };

        await _fusionCache.RemoveByTagAsync(removeTags);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 PictureRecordService 的服务类,它实现了 IPictureRecordService 接口,主要用于处理与图片记录相关的操作。以下是该类的主要功能和方法的详细解释:

1. 构造函数

public PictureRecordService(IHybridCachingProvider cachingProvider, IRepository<PictureRecord> repository, IMapper mapper)
  • 依赖注入:构造函数接受三个参数,分别是缓存提供者、图片记录的仓储接口和对象映射器。通过依赖注入,这些服务可以在类中使用。

2. 获取标签

public async Task<ICollection<string>> GetTagsAsync()
  • 功能:从数据库中获取所有唯一的标签。使用 SelectMany 将所有图片记录的标签扁平化,然后通过 GroupBySelect 获取唯一标签列表。

3. 设置横幅

public async Task SetBannerAsync(string id)
  • 功能:根据给定的图片记录 ID 设置或取消横幅标签。如果记录已经有 "banner" 标签,则将其移除;否则,添加 "banner" 标签。更新后,保存更改到数据库。

4. 获取横幅

public async Task<ICollection<VmPictureRecord>> GetBannerAsync()
  • 功能:获取所有带有 "banner" 标签的图片记录,并按上传时间降序排列。返回的每个记录的访问 URL 后面会附加 "!banner"。

5. 分页获取图片记录

public async Task<IPagedList<VmPictureRecord>> GetPagesAsync(ICollection<string>? tags, string? description, int pageIndex = 1, int pageSize = 20)
  • 功能:根据标签和描述进行过滤,分页获取图片记录。支持根据标签和描述进行模糊搜索,并返回指定页码和页大小的结果。

6. 获取单个图片记录

public async Task<VmPictureRecord?> GetPictureRecordAsync(string id)
  • 功能:根据 ID 获取单个图片记录。如果记录存在,则将其映射为视图模型 VmPictureRecord

7. 创建记录

public async Task<VmPictureRecord> CreateRecordAsync(VmPictureRecord pictureRecord)
  • 功能:创建新的图片记录。将视图模型映射为实体并插入到数据库中。如果新记录包含 "banner" 标签,则更新缓存中的横幅数据。

8. 修改信息

public async Task<VmPictureRecord?> ChangeInformationAsync(VmPictureRecordChange change)
  • 功能:根据提供的更改信息更新图片记录的类别、描述和标签。如果更新后的标签包含 "banner",则更新缓存中的横幅数据。返回更新后的记录。

9. 删除记录

public async Task DeleteAsync(string id)
  • 功能:根据 ID 删除图片记录。如果记录包含 "banner" 标签,则更新缓存中的横幅数据。删除操作完成后,记录将从数据库中移除。

总结

PictureRecordService 类提供了一系列与图片记录相关的操作,包括获取标签、设置和获取横幅、分页查询、创建、更新和删除记录。它利用了 MongoDB 的查询功能和对象映射器来简化数据操作,同时通过缓存机制提高性能。

loading