网站首页 网站源码

using System.Threading;
using Dpz.Core.Public.ViewModel.RequestEvent;
namespace Dpz.Core.Service.V4.Implements;
public class PictureRecordService(
    IRepository<PictureRecord> repository,
    IMapper mapper,
    IFusionCache fusionCache,
    IMediator mediator
) : 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<List<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,
        string? account = null
    )
    {
        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);
                }
                if (!string.IsNullOrEmpty(account))
                {
                    var filter = Builders<PictureRecord>.Filter.Eq(x => x.Creator.Id, account);
                    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,
                account,
            }
        );
    }
    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,
        CancellationToken cancellationToken = default
    )
    {
        var entity = mapper.Map<PictureRecord>(pictureRecord);
        await repository.InsertAsync(entity, cancellationToken);
        if (entity.Tags.Any(x => x == "banner"))
        {
            await _fusionCache.RemoveAsync(CacheKey.HomeContainerKey, token: cancellationToken);
        }
        await ClearCacheAsync();
        return mapper.Map<VmPictureRecord>(entity);
    }
    public async Task<VmPictureRecord?> ChangeInformationAsync(
        VmPictureRecordChange change,
        CancellationToken cancellationToken = default
    )
    {
        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, cancellationToken);
        if (change.Tags.Any(x => x == "banner"))
        {
            await _fusionCache.RemoveAsync(CacheKey.HomeContainerKey, token: cancellationToken);
        }
        await ClearCacheAsync();
        var entity = await repository.FindAsync(oid, cancellationToken);
        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 repository.DeleteAsync(entity.Id);
        await mediator.Send(new RemoveImagesRequest { Images = [entity.AccessUrl] });
        await ClearCacheAsync();
    }
    public async Task ClearCacheAsync()
    {
        var removeTags = new[]
        {
            CachePrefixKey + nameof(GetTagsAsync),
            CachePrefixKey + nameof(GetPagesAsync),
            CachePrefixKey + nameof(GetBannerAsync),
            CachePrefixKey + nameof(GetPictureRecordAsync),
        };
        await _fusionCache.RemoveByTagAsync(removeTags);
    }
}
上述代码定义了一个名为 PictureRecordService 的服务类,它实现了 IPictureRecordService 接口,主要用于处理与图片记录相关的操作。以下是该类的主要功能和方法的详细解释:
public PictureRecordService(IHybridCachingProvider cachingProvider, IRepository<PictureRecord> repository, IMapper mapper)
public async Task<ICollection<string>> GetTagsAsync()
SelectMany 将所有图片记录的标签扁平化,然后通过 GroupBy 和 Select 获取唯一标签列表。public async Task SetBannerAsync(string id)
public async Task<ICollection<VmPictureRecord>> GetBannerAsync()
public async Task<IPagedList<VmPictureRecord>> GetPagesAsync(ICollection<string>? tags, string? description, int pageIndex = 1, int pageSize = 20)
public async Task<VmPictureRecord?> GetPictureRecordAsync(string id)
VmPictureRecord。public async Task<VmPictureRecord> CreateRecordAsync(VmPictureRecord pictureRecord)
public async Task<VmPictureRecord?> ChangeInformationAsync(VmPictureRecordChange change)
public async Task DeleteAsync(string id)
PictureRecordService 类提供了一系列与图片记录相关的操作,包括获取标签、设置和获取横幅、分页查询、创建、更新和删除记录。它利用了 MongoDB 的查询功能和对象映射器来简化数据操作,同时通过缓存机制提高性能。
