using Microsoft.Extensions.Logging; using DomainResults.Common; using MongoDB.Driver; using DataProviders.Abstractions; using MongoDB.Driver.GridFS; namespace DataProviders.Buckets { /// /// /// public interface IImageBucketDataProvider { /// /// /// /// /// /// /// (Guid?, IDomainResult) Upload(BucketFile file); /// /// /// /// /// /// /// (List?, IDomainResult) UploadMany(List files); /// /// /// /// /// /// (BucketFile?, IDomainResult) Download(Guid siteId, Guid fileId); /// /// /// /// /// /// /// (BucketFile?, IDomainResult) Download(Guid siteId, Guid userId, Guid fileId); (List?, IDomainResult) DownloadMany(Guid siteId, Guid userId, List fileIds); /// /// /// /// /// /// /// IDomainResult DeleteOne(Guid siteId, Guid userId, Guid fileId); /// /// /// /// /// /// IDomainResult DeleteMany(Guid siteId, Guid userId); } /// /// /// public class ImageBucketDataProvider : BucketDataProviderBase, IImageBucketDataProvider { /// /// /// /// /// public ImageBucketDataProvider( ILogger logger, IMongoClient client ) : base(logger, client, "images") { } /// /// /// /// /// /// public (BucketFile?, IDomainResult) Download(Guid siteId, Guid fileId) { var filter = Builders.Filter.And( Builders.Filter.Eq(x => x.Metadata["siteId"], $"{siteId}"), Builders.Filter.Not(Builders.Filter.Eq(x => x.Metadata["published"], "")), Builders.Filter.Eq(x => x.Filename, $"{fileId}") ); var (list, result) = Download(filter); if (!result.IsSuccess || list == null) return (null, result); return (list.First(), result); } /// /// /// /// /// /// /// public (BucketFile?, IDomainResult) Download(Guid siteId, Guid userId, Guid fileId) { var filter = Builders.Filter.And( Builders.Filter.Eq(x => x.Metadata["siteId"], $"{siteId}"), Builders.Filter.Eq(x => x.Metadata["userId"], $"{userId}"), Builders.Filter.Eq(x => x.Filename, $"{fileId}") ); var (list, result) = Download(filter); if (!result.IsSuccess || list == null) return (null, result); return (list.First(), result); } /// /// /// /// /// /// /// public (List?, IDomainResult) DownloadMany(Guid siteId, Guid userId, List fileIds) { var builder = Builders.Filter; FilterDefinition? filter = default; foreach (var fileId in fileIds) { filter |= builder.And( Builders.Filter.Eq(x => x.Metadata["siteId"], $"{siteId}"), Builders.Filter.Eq(x => x.Metadata["userId"], $"{userId}"), Builders.Filter.Eq(x => x.Filename, $"{fileId}") ); } var result = Download(filter); return result; } public IDomainResult DeleteOne(Guid siteId, Guid userId, Guid fileId) => DeleteOneAsync(siteId, userId, fileId).Result; public Task DeleteOneAsync(Guid siteId, Guid userId, Guid fileId) => DeleteAsync(Builders.Filter.And( Builders.Filter.Eq(x => x.Metadata["siteId"], $"{siteId}"), Builders.Filter.Eq(x => x.Metadata["userId"], $"{userId}"), Builders.Filter.Eq(x => x.Filename, $"{fileId}") )); public IDomainResult DeleteMany(Guid siteId, Guid userId) => DeleteManyAsync(siteId, userId).Result; public Task DeleteManyAsync(Guid siteId, Guid userId) => DeleteAsync(Builders.Filter.And( Builders.Filter.Eq(x => x.Metadata["siteId"], $"{siteId}"), Builders.Filter.Eq(x => x.Metadata["userId"], $"{userId}") )); } }