Browse Source

Blob database provider added

pull/4161/head
Ahmet 6 years ago
parent
commit
fc17e89cc5
  1. 26
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/Blob.cs
  2. 11
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/Container.cs
  3. 87
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobProvider.cs
  4. 17
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/IBlobRepository.cs
  5. 14
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/IContainerRepository.cs

26
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/Blob.cs

@ -0,0 +1,26 @@
using System;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
{
public class Blob : AggregateRoot<Guid>, IMultiTenant
{
public Guid ContainerId { get; set; }
public Guid? TenantId { get; }
public string Name { get; set; }
public byte[] Content { get; set; }
public Blob(Guid id, Guid containerId, string name, byte[] content, Guid? tenantId) : base(id)
{
ContainerId = containerId;
Name = name;
Content = content;
TenantId = tenantId;
}
}
}

11
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/Container.cs

@ -0,0 +1,11 @@
using System;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
{
public class Container : AggregateRoot<Guid>, IMultiTenant
{
public Guid? TenantId { get; }
}
}

87
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobProvider.cs

@ -0,0 +1,87 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.BlobStoring.Database
{
public class DatabaseBlobProvider : BlobProviderBase, ITransientDependency
{
protected IBlobRepository BlobRepository { get; }
protected IContainerRepository ContainerRepository { get; }
public DatabaseBlobProvider(IBlobRepository blobRepository, IContainerRepository containerRepository)
{
BlobRepository = blobRepository;
ContainerRepository = containerRepository;
}
public override async Task SaveAsync(BlobProviderSaveArgs args)
{
var container = await ContainerRepository.GetContainerAsync(args.ContainerName);
var blob = await BlobRepository.FindAsync(container.Id, args.BlobName, args.TenantId, args.CancellationToken);
var content = await args.BlobStream.GetAllBytesAsync(args.CancellationToken);
if (blob != null)
{
if (!args.OverrideExisting)
{
throw new BlobAlreadyExistsException($"Saving BLOB '{args.BlobName}' does already exists in the container '{args.ContainerName}'! Set {nameof(args.OverrideExisting)} if it should be overwritten.");
}
blob.Content = content;
await BlobRepository.UpdateAsync(blob);
}
else
{
blob = new Blob(Guid.NewGuid(), container.Id, args.BlobName, content, args.TenantId);
await BlobRepository.InsertAsync(blob);
}
}
public override async Task<bool> DeleteAsync(BlobProviderDeleteArgs args)
{
var container = await ContainerRepository.FindContainerAsync(args.ContainerName);
if (container == null)
{
return false;
}
return await BlobRepository.DeleteAsync(container.Id, args.BlobName, args.TenantId, args.CancellationToken);
}
public override async Task<bool> ExistsAsync(BlobProviderExistsArgs args)
{
var container = await ContainerRepository.FindContainerAsync(args.ContainerName);
if (container == null)
{
return false;
}
return await BlobRepository.ExistsAsync(container.Id, args.BlobName, args.TenantId, args.CancellationToken);
}
public override async Task<Stream> GetOrNullAsync(BlobProviderGetArgs args)
{
var container = await ContainerRepository.FindContainerAsync(args.ContainerName);
if (container == null)
{
return null;
}
var blob = await BlobRepository.FindAsync(container.Id, args.BlobName, args.TenantId, args.CancellationToken);
if (blob == null)
{
return null;
}
return new MemoryStream(blob.Content);
}
}
}

17
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/IBlobRepository.cs

@ -0,0 +1,17 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.BlobStoring.Database
{
public interface IBlobRepository : IBasicRepository<Blob, Guid>
{
Task<Blob> FindAsync(Guid containerId, [NotNull] string blobName, Guid? tenantId = null, CancellationToken cancellationToken = default);
Task<bool> ExistsAsync(Guid containerId, [NotNull] string blobName, Guid? tenantId = null, CancellationToken cancellationToken = default);
Task<bool> DeleteAsync(Guid containerId, [NotNull] string blobName, Guid? tenantId = null, CancellationToken cancellationToken = default);
}
}

14
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/IContainerRepository.cs

@ -0,0 +1,14 @@
using System;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.BlobStoring.Database
{
public interface IContainerRepository : IBasicRepository<Container, Guid>
{
Task<Container> GetContainerAsync([NotNull] string name);
Task<Container> FindContainerAsync([NotNull] string name);
}
}
Loading…
Cancel
Save