Handle multi-tenant in DatabaseBlobProvider.

Resolve #4943
pull/4944/head
maliming 5 years ago
parent fae64bf317
commit df4200932d

@ -3,7 +3,9 @@ using System.Linq;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.BlobStoring.TestObjects;
using Volo.Abp.Clients;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Testing;
using Xunit;
@ -14,11 +16,14 @@ namespace Volo.Abp.BlobStoring
{
protected IBlobContainer<TestContainer1> Container { get; }
protected ICurrentTenant CurrentTenant { get; }
protected BlobContainer_Tests()
{
Container = GetRequiredService<IBlobContainer<TestContainer1>>();
CurrentTenant = GetRequiredService<ICurrentTenant>();
}
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
@ -37,35 +42,68 @@ namespace Volo.Abp.BlobStoring
result.SequenceEqual(testContent).ShouldBeTrue();
}
[Fact]
public async Task Should_Save_And_Get_Blobs_In_Different_Tenant()
{
var blobName = "test-blob-1";
var testContent = "test content".GetBytes();
using (CurrentTenant.Change(Guid.NewGuid()))
{
await Container.SaveAsync(blobName, testContent);
(await Container.GetAllBytesAsync(blobName)).SequenceEqual(testContent).ShouldBeTrue();
}
using (CurrentTenant.Change(Guid.NewGuid()))
{
await Container.SaveAsync(blobName, testContent);
(await Container.GetAllBytesAsync(blobName)).SequenceEqual(testContent).ShouldBeTrue();
using (CurrentTenant.Change(null))
{
// Could not found the requested BLOB...
await Assert.ThrowsAsync<AbpException>(async () =>
await Container.GetAllBytesAsync(blobName)
);
}
}
using (CurrentTenant.Change(null))
{
await Container.SaveAsync(blobName, testContent);
(await Container.GetAllBytesAsync(blobName)).SequenceEqual(testContent).ShouldBeTrue();
}
}
[Fact]
public async Task Should_Overwrite_Pre_Saved_Blob_If_Requested()
{
var blobName = "test-blob-1";
var testContent = "test content".GetBytes();
await Container.SaveAsync(blobName, testContent);
var testContentOverwritten = "test content overwritten".GetBytes();
await Container.SaveAsync(blobName, testContentOverwritten, true);
var result = await Container.GetAllBytesAsync(blobName);
result.SequenceEqual(testContentOverwritten).ShouldBeTrue();
}
[Fact]
public async Task Should_Not_Allow_To_Overwrite_Pre_Saved_Blob_By_Default()
{
var blobName = "test-blob-1";
var testContent = "test content".GetBytes();
await Container.SaveAsync(blobName, testContent);
var testContentOverwritten = "test content overwritten".GetBytes();
await Assert.ThrowsAsync<BlobAlreadyExistsException>(() =>
Container.SaveAsync(blobName, testContentOverwritten)
);
}
[Theory]
[InlineData("test-blob-1")]
[InlineData("test-blob-1.txt")]
@ -91,7 +129,7 @@ namespace Volo.Abp.BlobStoring
await Container.DeleteAsync(blobName);
(await Container.ExistsAsync(blobName)).ShouldBeFalse();
}
[Theory]
[InlineData("test-blob-1")]
[InlineData("test-blob-1.txt")]
@ -102,4 +140,4 @@ namespace Volo.Abp.BlobStoring
(await Container.ExistsAsync(blobName)).ShouldBeFalse();
}
}
}
}

@ -3,6 +3,7 @@ using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
{
@ -11,15 +12,18 @@ namespace Volo.Abp.BlobStoring.Database
protected IDatabaseBlobRepository DatabaseBlobRepository { get; }
protected IDatabaseBlobContainerRepository DatabaseBlobContainerRepository { get; }
protected IGuidGenerator GuidGenerator { get; }
protected ICurrentTenant CurrentTenant { get; }
public DatabaseBlobProvider(
IDatabaseBlobRepository databaseBlobRepository,
IDatabaseBlobContainerRepository databaseBlobContainerRepository,
IGuidGenerator guidGenerator)
IGuidGenerator guidGenerator,
ICurrentTenant currentTenant)
{
DatabaseBlobRepository = databaseBlobRepository;
DatabaseBlobContainerRepository = databaseBlobContainerRepository;
GuidGenerator = guidGenerator;
CurrentTenant = currentTenant;
}
public override async Task SaveAsync(BlobProviderSaveArgs args)
@ -48,7 +52,7 @@ namespace Volo.Abp.BlobStoring.Database
}
else
{
blob = new DatabaseBlob(GuidGenerator.Create(), container.Id, args.BlobName, content);
blob = new DatabaseBlob(GuidGenerator.Create(), container.Id, args.BlobName, content, CurrentTenant.Id);
await DatabaseBlobRepository.InsertAsync(blob, autoSave: true);
}
}
@ -128,10 +132,10 @@ namespace Volo.Abp.BlobStoring.Database
return container;
}
container = new DatabaseBlobContainer(GuidGenerator.Create(), name);
container = new DatabaseBlobContainer(GuidGenerator.Create(), name, CurrentTenant.Id);
await DatabaseBlobContainerRepository.InsertAsync(container, cancellationToken: cancellationToken);
return container;
}
}
}
}

@ -0,0 +1,7 @@
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
{
public class EfCoreDatabaseBlobContainer_Tests : DatabaseBlobContainer_Tests<BlobStoringDatabaseEntityFrameworkCoreTestModule>
{
}
}

@ -0,0 +1,10 @@
using Xunit;
namespace Volo.Abp.BlobStoring.Database.MongoDB
{
[Collection(MongoTestCollection.Name)]
public class MongoDbDatabaseBlobContainer_Tests : DatabaseBlobContainer_Tests<BlobStoringDatabaseMongoDbTestModule>
{
}
}

@ -0,0 +1,10 @@
using Volo.Abp.Modularity;
namespace Volo.Abp.BlobStoring.Database
{
public abstract class DatabaseBlobContainer_Tests<TStartupModule> : BlobContainer_Tests<TStartupModule>
where TStartupModule : IAbpModule
{
}
}
Loading…
Cancel
Save