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
}