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

namespace Dpz.Core.Service;

internal static class RepositoryExtensions
{
    /// <summary>
    /// 扩展方法 根据id删除一个或多个记录
    /// </summary>
    /// <param name="repository"></param>
    /// <param name="id"></param>
    /// <typeparam name="T"></typeparam>
    public static async Task TryDeleteAsync<T>(this IRepository<T> repository, params string[] id)
        where T : BaseEntity, new()
    {
        var ids = id
            .Select(x => ObjectId.TryParse(x, out var oid) ? oid : (ObjectId?) null)
            .Where(x => x.HasValue)
            .Select(x => x!.Value);
        await repository.DeleteAsync(x => ids.Contains(x.Id));
    }

    public static async Task<T?> TryGetAsync<T>(this IRepository<T> repository, string id)
        where T : BaseEntity, new()
    {
        if (ObjectId.TryParse(id, out var oid))
        {
            return await repository.FindAsync(oid);
        }

        return default;
    }

    #region Mongodb GridFS

    /// <summary>
    /// 获取储存桶
    /// </summary>
    /// <returns></returns>
    private static IGridFSBucket GetBucket(this IRepository repository)
    {
        return new GridFSBucket(repository.Database);
    }

    /// <summary>
    /// 删除文件
    /// </summary>
    /// <param name="repository"></param>
    /// <param name="id"></param>
    public static async Task DeleteFileAsync(this IRepository repository, ObjectId id)
    {
        var gridFs = repository.GetBucket();
        try
        {
            await gridFs.DeleteAsync(id);
        }
        catch (GridFSFileNotFoundException)
        {
        }
    }

    /// <summary>
    /// 下载文件
    /// </summary>
    /// <param name="repository"></param>
    /// <param name="id"></param>
    /// <returns></returns>
    public static async Task<GridFSDownloadStream<ObjectId>> DownloadAsync(this IRepository repository, ObjectId id)
    {
        var gridFs = repository.GetBucket();
        var result = await gridFs.OpenDownloadStreamAsync(id);
        return result;
    }

    public static async Task DownloadAsync(this IRepository repository, ObjectId id, Stream stream)
    {
        var gridFs = repository.GetBucket();
        await gridFs.DownloadToStreamAsync(id, stream);
    }

    /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="repository"></param>
    /// <param name="fileName"></param>
    /// <param name="stream"></param>
    /// <returns></returns>
    public static async Task<ObjectId> UploadAsync(this IRepository repository, string fileName, Stream stream)
    {
        var gridFs = repository.GetBucket();
        return await gridFs.UploadFromStreamAsync(fileName, stream);
    }

    public static async Task<List<GridFSFileInfo>> GetBucketFileInfos(this IRepository repository, params ObjectId[] id)
    {
        var gridFs = repository.GetBucket();
        var filter = Builders<GridFSFileInfo>.Filter.In("_id", id);
        var result = await gridFs.FindAsync(filter);
        return await result.ToListAsync();
    }

    /// <summary>
    /// 获取文件名称
    /// </summary>
    /// <param name="repository"></param>
    /// <param name="id"></param>
    /// <returns></returns>
    public static async IAsyncEnumerable<string> BucketFilenameAsync(this IRepository repository, params ObjectId[] id)
    {
        var gridFs = repository.GetBucket();
        var filter = Builders<GridFSFileInfo>.Filter.In("_id", id);
        var result = await gridFs.FindAsync(filter);
        while (await result.MoveNextAsync())
        {
            foreach (var current in result.Current)
            {
                yield return current.Filename;
            }
        }
    }

    #endregion
}
loading