Browse Source

use file-scoped namespacing for blobStoringDatabase module

pull/10696/head
Ahmet Çotur 5 years ago
parent
commit
c71a203058
  1. 25
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobService.cs
  2. 31
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/ConsoleAppConsoleAppHostedService.cs
  3. 64
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/ConsoleAppConsoleAppModule.cs
  4. 21
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/EfCore/BlobStoringHostDbContext.cs
  5. 33
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/EfCore/BlobStoringHostDbContextFactory.cs
  6. 31
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/EfCore/BlobStoringHostDbSchemaMigrator.cs
  7. 11
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/EfCore/IBlobStoringHostDbSchemaMigrator.cs
  8. 11
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/IBlobService.cs
  9. 117
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20201013055337_Initial.cs
  10. 11
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/ProfilePictureContainer.cs
  11. 61
      modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Program.cs
  12. 43
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDomainSharedModule.cs
  13. 9
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseErrorCodes.cs
  14. 25
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/DatabaseBlobConsts.cs
  15. 17
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/DatabaseContainerConsts.cs
  16. 11
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/Localization/BlobStoringDatabaseResource.cs
  17. 13
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs
  18. 31
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDomainModule.cs
  19. 57
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlob.cs
  20. 21
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobContainer.cs
  21. 17
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobContainerConfigurationExtensions.cs
  22. 207
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobProvider.cs
  23. 11
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/IDatabaseBlobContainerRepository.cs
  24. 15
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/IDatabaseBlobRepository.cs
  25. 27
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreModule.cs
  26. 31
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs
  27. 53
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs
  28. 21
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/EfCoreDatabaseBlobContainerRepository.cs
  29. 83
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/EfCoreDatabaseBlobRepository.cs
  30. 15
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs
  31. 23
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo/Abp/BlobStoring/Database/AbpBlobStoringDatabaseInstallerModule.cs
  32. 29
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseInstallerPipelineBuilder.cs
  33. 25
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringDatabaseMongoDbModule.cs
  34. 23
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs
  35. 29
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs
  36. 15
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs
  37. 23
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/MongoDbDatabaseBlobContainerRepository.cs
  38. 71
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/MongoDbDatabaseBlobRepository.cs
  39. 15
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/BlobStoringDatabaseDomainTestBase.cs
  40. 15
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/BlobStoringDatabaseDomainTestModule.cs
  41. 9
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestBase.cs
  42. 51
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestModule.cs
  43. 11
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/EfCoreContainer_Tests.cs
  44. 7
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/EfCoreDatabaseBlobContainer_Tests.cs
  45. 9
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/BlobStoringDatabaseMongoDbTestBase.cs
  46. 33
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/BlobStoringDatabaseMongoDbTestModule.cs
  47. 13
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/MongoDbContainer_Tests.cs
  48. 9
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/MongoDbDatabaseBlobContainer_Tests.cs
  49. 27
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/MongoDbFixture.cs
  50. 13
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/MongoTestCollection.cs
  51. 67
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/BlobStoringDatabaseTestBase.cs
  52. 35
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/BlobStoringDatabaseTestBaseModule.cs
  53. 9
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/DatabaseBlobContainer_Tests.cs
  54. 45
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Security/FakeCurrentPrincipalAccessor.cs

25
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobService.cs

@ -3,21 +3,20 @@ using System.Threading.Tasks;
using Volo.Abp.BlobStoring;
using Volo.Abp.DependencyInjection;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp;
public class BlobService : IBlobService, ITransientDependency
{
public class BlobService : IBlobService, ITransientDependency
{
private readonly IBlobContainer<ProfilePictureContainer> _container;
private readonly IBlobContainer<ProfilePictureContainer> _container;
public BlobService(IBlobContainer<ProfilePictureContainer> container)
{
_container = container;
}
public BlobService(IBlobContainer<ProfilePictureContainer> container)
{
_container = container;
}
public async Task SaveFile(string fileName = "File Name", string fileContent = "File Content")
{
await _container.SaveAsync(fileName, fileContent.GetBytes(), true);
Console.WriteLine($"File: {fileName} is successfully saved");
}
public async Task SaveFile(string fileName = "File Name", string fileContent = "File Content")
{
await _container.SaveAsync(fileName, fileContent.GetBytes(), true);
Console.WriteLine($"File: {fileName} is successfully saved");
}
}

31
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/ConsoleAppConsoleAppHostedService.cs

@ -5,28 +5,27 @@ using Microsoft.Extensions.Hosting;
using Serilog;
using Volo.Abp;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp;
public class ConsoleAppConsoleAppHostedService : IHostedService
{
public class ConsoleAppConsoleAppHostedService : IHostedService
public async Task StartAsync(CancellationToken cancellationToken)
{
public async Task StartAsync(CancellationToken cancellationToken)
using (var application = AbpApplicationFactory.Create<ConsoleAppConsoleAppModule>(options =>
{
options.UseAutofac();
options.Services.AddLogging(c => c.AddSerilog());
}))
{
using (var application = AbpApplicationFactory.Create<ConsoleAppConsoleAppModule>(options =>
{
options.UseAutofac();
options.Services.AddLogging(c => c.AddSerilog());
}))
{
application.Initialize();
application.Initialize();
var blobService = application.ServiceProvider.GetService<BlobService>();
var blobService = application.ServiceProvider.GetService<BlobService>();
await blobService.SaveFile("Test File 2", "Test Content 2");
await blobService.SaveFile("Test File 2", "Test Content 2");
application.Shutdown();
}
application.Shutdown();
}
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}

64
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/ConsoleAppConsoleAppModule.cs

@ -10,47 +10,45 @@ using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.SqlServer;
using Volo.Abp.Modularity;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp
{
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp;
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule)
)]
public class ConsoleAppConsoleAppModule : AbpModule
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule)
)]
public class ConsoleAppConsoleAppModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
ConfigureEntityFramework(context);
ConfigureEntityFramework(context);
context.Services.AddSingleton<IBlobProvider, DatabaseBlobProvider>();
context.Services.AddSingleton<IBlobProvider, DatabaseBlobProvider>();
Configure<AbpBlobStoringOptions>(options =>
Configure<AbpBlobStoringOptions>(options =>
{
options.Containers.ConfigureDefault(container =>
{
options.Containers.ConfigureDefault(container =>
{
container.ProviderType = typeof(DatabaseBlobProvider);
});
container.ProviderType = typeof(DatabaseBlobProvider);
});
}
});
}
private void ConfigureEntityFramework(ServiceConfigurationContext context)
private void ConfigureEntityFramework(ServiceConfigurationContext context)
{
Configure<AbpDbConnectionOptions>(options =>
{
Configure<AbpDbConnectionOptions>(options =>
{
options.ConnectionStrings.Default = "Server=localhost;Database=BlobStoring_Host;Trusted_Connection=True";
});
context.Services.AddAbpDbContext<BlobStoringHostDbContext>(options =>
{
options.AddDefaultRepositories(true);
});
options.ConnectionStrings.Default = "Server=localhost;Database=BlobStoring_Host;Trusted_Connection=True";
});
Configure<AbpDbContextOptions>(x =>
{
x.UseSqlServer();
});
}
context.Services.AddAbpDbContext<BlobStoringHostDbContext>(options =>
{
options.AddDefaultRepositories(true);
});
Configure<AbpDbContextOptions>(x =>
{
x.UseSqlServer();
});
}
}

21
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/EfCore/BlobStoringHostDbContext.cs

@ -2,19 +2,18 @@
using Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore;
public class BlobStoringHostDbContext : AbpDbContext<BlobStoringHostDbContext>
{
public class BlobStoringHostDbContext : AbpDbContext<BlobStoringHostDbContext>
public BlobStoringHostDbContext(DbContextOptions<BlobStoringHostDbContext> options) : base(options)
{
public BlobStoringHostDbContext(DbContextOptions<BlobStoringHostDbContext> options) : base(options)
{
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ConfigureBlobStoring();
}
modelBuilder.ConfigureBlobStoring();
}
}
}

33
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/EfCore/BlobStoringHostDbContextFactory.cs

@ -3,27 +3,26 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore;
public class BlobStoringHostDbContextFactory : IDesignTimeDbContextFactory<BlobStoringHostDbContext>
{
public class BlobStoringHostDbContextFactory : IDesignTimeDbContextFactory<BlobStoringHostDbContext>
public BlobStoringHostDbContext CreateDbContext(string[] args)
{
public BlobStoringHostDbContext CreateDbContext(string[] args)
{
var configuration = BuildConfiguration();
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<BlobStoringHostDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default"));
var builder = new DbContextOptionsBuilder<BlobStoringHostDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default"));
return new BlobStoringHostDbContext(builder.Options);
}
return new BlobStoringHostDbContext(builder.Options);
}
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false);
return builder.Build();
}
return builder.Build();
}
}
}

31
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/EfCore/BlobStoringHostDbSchemaMigrator.cs

@ -4,23 +4,22 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore;
public class BlobStoringHostDbSchemaMigrator : IBlobStoringHostDbSchemaMigrator, ITransientDependency
{
public class BlobStoringHostDbSchemaMigrator : IBlobStoringHostDbSchemaMigrator, ITransientDependency
{
private readonly IServiceProvider _serviceProvider;
private readonly IServiceProvider _serviceProvider;
public BlobStoringHostDbSchemaMigrator(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public BlobStoringHostDbSchemaMigrator(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public async Task MigrateAsync()
{
await _serviceProvider
.GetRequiredService<BlobStoringHostDbContext>()
.Database
.MigrateAsync();
}
public async Task MigrateAsync()
{
await _serviceProvider
.GetRequiredService<BlobStoringHostDbContext>()
.Database
.MigrateAsync();
}
}
}

11
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/EfCore/IBlobStoringHostDbSchemaMigrator.cs

@ -1,9 +1,8 @@
using System.Threading.Tasks;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore;
public interface IBlobStoringHostDbSchemaMigrator
{
public interface IBlobStoringHostDbSchemaMigrator
{
Task MigrateAsync();
}
}
Task MigrateAsync();
}

11
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/IBlobService.cs

@ -1,9 +1,8 @@
using System.Threading.Tasks;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp;
public interface IBlobService
{
public interface IBlobService
{
Task SaveFile(string fileName = "File Name", string fileContent = "File Content");
}
}
Task SaveFile(string fileName = "File Name", string fileContent = "File Content");
}

117
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20201013055337_Initial.cs

@ -1,73 +1,70 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations;
public partial class Initial : Migration
{
public partial class Initial : Migration
protected override void Up(MigrationBuilder migrationBuilder)
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AbpBlobContainers",
columns: table => new
{
Id = table.Column<Guid>(nullable: false),
ExtraProperties = table.Column<string>(nullable: true),
ConcurrencyStamp = table.Column<string>(maxLength: 40, nullable: true),
TenantId = table.Column<Guid>(nullable: true),
Name = table.Column<string>(maxLength: 128, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AbpBlobContainers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "AbpBlobContainers",
columns: table => new {
Id = table.Column<Guid>(nullable: false),
ExtraProperties = table.Column<string>(nullable: true),
ConcurrencyStamp = table.Column<string>(maxLength: 40, nullable: true),
TenantId = table.Column<Guid>(nullable: true),
Name = table.Column<string>(maxLength: 128, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AbpBlobContainers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "AbpBlobs",
columns: table => new
{
Id = table.Column<Guid>(nullable: false),
ExtraProperties = table.Column<string>(nullable: true),
ConcurrencyStamp = table.Column<string>(maxLength: 40, nullable: true),
ContainerId = table.Column<Guid>(nullable: false),
TenantId = table.Column<Guid>(nullable: true),
Name = table.Column<string>(maxLength: 256, nullable: false),
Content = table.Column<byte[]>(maxLength: 2147483647, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AbpBlobs", x => x.Id);
table.ForeignKey(
name: "FK_AbpBlobs_AbpBlobContainers_ContainerId",
column: x => x.ContainerId,
principalTable: "AbpBlobContainers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "AbpBlobs",
columns: table => new {
Id = table.Column<Guid>(nullable: false),
ExtraProperties = table.Column<string>(nullable: true),
ConcurrencyStamp = table.Column<string>(maxLength: 40, nullable: true),
ContainerId = table.Column<Guid>(nullable: false),
TenantId = table.Column<Guid>(nullable: true),
Name = table.Column<string>(maxLength: 256, nullable: false),
Content = table.Column<byte[]>(maxLength: 2147483647, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AbpBlobs", x => x.Id);
table.ForeignKey(
name: "FK_AbpBlobs_AbpBlobContainers_ContainerId",
column: x => x.ContainerId,
principalTable: "AbpBlobContainers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_AbpBlobContainers_TenantId_Name",
table: "AbpBlobContainers",
columns: new[] { "TenantId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_AbpBlobContainers_TenantId_Name",
table: "AbpBlobContainers",
columns: new[] { "TenantId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_AbpBlobs_ContainerId",
table: "AbpBlobs",
column: "ContainerId");
migrationBuilder.CreateIndex(
name: "IX_AbpBlobs_ContainerId",
table: "AbpBlobs",
column: "ContainerId");
migrationBuilder.CreateIndex(
name: "IX_AbpBlobs_TenantId_ContainerId_Name",
table: "AbpBlobs",
columns: new[] { "TenantId", "ContainerId", "Name" });
}
migrationBuilder.CreateIndex(
name: "IX_AbpBlobs_TenantId_ContainerId_Name",
table: "AbpBlobs",
columns: new[] { "TenantId", "ContainerId", "Name" });
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "AbpBlobs");
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "AbpBlobs");
migrationBuilder.DropTable(
name: "AbpBlobContainers");
}
migrationBuilder.DropTable(
name: "AbpBlobContainers");
}
}

11
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/ProfilePictureContainer.cs

@ -1,7 +1,6 @@
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp;
public class ProfilePictureContainer
{
public class ProfilePictureContainer
{
}
}
}

61
modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Program.cs

@ -5,47 +5,46 @@ using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp
namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp;
public class Program
{
public class Program
public static async Task<int> Main(string[] args)
{
public static async Task<int> Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
Log.Logger = new LoggerConfiguration()
#if DEBUG
.MinimumLevel.Debug()
#else
.MinimumLevel.Information()
#endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt"))
.WriteTo.Console()
.CreateLogger();
try
{
Log.Information("Starting console host.");
await CreateHostBuilder(args).RunConsoleAsync();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt"))
.WriteTo.Console()
.CreateLogger();
try
{
Log.Information("Starting console host.");
await CreateHostBuilder(args).RunConsoleAsync();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<ConsoleAppConsoleAppHostedService>();
});
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<ConsoleAppConsoleAppHostedService>();
});
}

43
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDomainSharedModule.cs

@ -6,32 +6,31 @@ using Volo.Abp.Validation;
using Volo.Abp.Validation.Localization;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
[DependsOn(
typeof(AbpValidationModule)
)]
public class BlobStoringDatabaseDomainSharedModule : AbpModule
{
[DependsOn(
typeof(AbpValidationModule)
)]
public class BlobStoringDatabaseDomainSharedModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
Configure<AbpVirtualFileSystemOptions>(options =>
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<BlobStoringDatabaseDomainSharedModule>();
});
options.FileSets.AddEmbedded<BlobStoringDatabaseDomainSharedModule>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<BlobStoringDatabaseResource>("en")
.AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Volo/Abp/BlobStoring/Database/Localization");
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<BlobStoringDatabaseResource>("en")
.AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Volo/Abp/BlobStoring/Database/Localization");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("BlobStoringDatabase", typeof(BlobStoringDatabaseResource));
});
}
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("BlobStoringDatabase", typeof(BlobStoringDatabaseResource));
});
}
}

9
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseErrorCodes.cs

@ -1,7 +1,6 @@
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public static class BlobStoringDatabaseErrorCodes
{
public static class BlobStoringDatabaseErrorCodes
{
//Add your business exception error codes here...
}
//Add your business exception error codes here...
}

25
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/DatabaseBlobConsts.cs

@ -1,15 +1,14 @@
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public static class DatabaseBlobConsts
{
public static class DatabaseBlobConsts
{
/// <summary>
/// Default value: 256.
/// </summary>
public static int MaxNameLength { get; set; } = 256;
/// <summary>
/// Default value: 256.
/// </summary>
public static int MaxNameLength { get; set; } = 256;
/// <summary>
/// Default value: <see cref="int.MaxValue"/> (2GB).
/// </summary>
public static int MaxContentLength { get; set; } = int.MaxValue;
}
}
/// <summary>
/// Default value: <see cref="int.MaxValue"/> (2GB).
/// </summary>
public static int MaxContentLength { get; set; } = int.MaxValue;
}

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

@ -1,10 +1,9 @@
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public static class DatabaseContainerConsts
{
public static class DatabaseContainerConsts
{
/// <summary>
/// Default value: 128.
/// </summary>
public static int MaxNameLength { get; set; } = 128;
}
}
/// <summary>
/// Default value: 128.
/// </summary>
public static int MaxNameLength { get; set; } = 128;
}

11
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/Localization/BlobStoringDatabaseResource.cs

@ -1,10 +1,9 @@
using Volo.Abp.Localization;
namespace Volo.Abp.BlobStoring.Database.Localization
namespace Volo.Abp.BlobStoring.Database.Localization;
[LocalizationResourceName("BlobStoringDatabase")]
public class BlobStoringDatabaseResource
{
[LocalizationResourceName("BlobStoringDatabase")]
public class BlobStoringDatabaseResource
{
}
}

13
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs

@ -1,13 +1,12 @@
using Volo.Abp.Data;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public static class BlobStoringDatabaseDbProperties
{
public static class BlobStoringDatabaseDbProperties
{
public static string DbTablePrefix { get; set; } = AbpCommonDbProperties.DbTablePrefix;
public static string DbTablePrefix { get; set; } = AbpCommonDbProperties.DbTablePrefix;
public static string DbSchema { get; set; } = AbpCommonDbProperties.DbSchema;
public static string DbSchema { get; set; } = AbpCommonDbProperties.DbSchema;
public const string ConnectionStringName = "AbpBlobStoring";
}
public const string ConnectionStringName = "AbpBlobStoring";
}

31
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDomainModule.cs

@ -1,27 +1,26 @@
using Volo.Abp.Domain;
using Volo.Abp.Modularity;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
[DependsOn(
typeof(AbpDddDomainModule),
typeof(AbpBlobStoringModule),
typeof(BlobStoringDatabaseDomainSharedModule)
)]
public class BlobStoringDatabaseDomainModule : AbpModule
{
[DependsOn(
typeof(AbpDddDomainModule),
typeof(AbpBlobStoringModule),
typeof(BlobStoringDatabaseDomainSharedModule)
)]
public class BlobStoringDatabaseDomainModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
Configure<AbpBlobStoringOptions>(options =>
{
Configure<AbpBlobStoringOptions>(options =>
options.Containers.ConfigureDefault(container =>
{
options.Containers.ConfigureDefault(container =>
if (container.ProviderType == null)
{
if (container.ProviderType == null)
{
container.UseDatabase();
}
});
container.UseDatabase();
}
});
}
});
}
}

57
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlob.cs

@ -4,43 +4,42 @@ using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
{
public class DatabaseBlob : AggregateRoot<Guid>, IMultiTenant
{
public virtual Guid ContainerId { get; protected set; }
namespace Volo.Abp.BlobStoring.Database;
public virtual Guid? TenantId { get; protected set; }
public class DatabaseBlob : AggregateRoot<Guid>, IMultiTenant
{
public virtual Guid ContainerId { get; protected set; }
public virtual string Name { get; protected set; }
public virtual Guid? TenantId { get; protected set; }
[DisableAuditing]
public virtual byte[] Content { get; protected set; }
public virtual string Name { get; protected set; }
public DatabaseBlob(Guid id, Guid containerId, [NotNull] string name, [NotNull] byte[] content, Guid? tenantId = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), DatabaseBlobConsts.MaxNameLength);
ContainerId = containerId;
Content = CheckContentLength(content);
TenantId = tenantId;
}
[DisableAuditing]
public virtual byte[] Content { get; protected set; }
public virtual void SetContent(byte[] content)
{
Content = CheckContentLength(content);
}
public DatabaseBlob(Guid id, Guid containerId, [NotNull] string name, [NotNull] byte[] content, Guid? tenantId = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), DatabaseBlobConsts.MaxNameLength);
ContainerId = containerId;
Content = CheckContentLength(content);
TenantId = tenantId;
}
protected virtual byte[] CheckContentLength(byte[] content)
{
Check.NotNull(content, nameof(content));
public virtual void SetContent(byte[] content)
{
Content = CheckContentLength(content);
}
if (content.Length >= DatabaseBlobConsts.MaxContentLength)
{
throw new AbpException($"Blob content size cannot be more than {DatabaseBlobConsts.MaxContentLength} Bytes.");
}
protected virtual byte[] CheckContentLength(byte[] content)
{
Check.NotNull(content, nameof(content));
return content;
if (content.Length >= DatabaseBlobConsts.MaxContentLength)
{
throw new AbpException($"Blob content size cannot be more than {DatabaseBlobConsts.MaxContentLength} Bytes.");
}
return content;
}
}

21
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobContainer.cs

@ -3,19 +3,18 @@ using JetBrains.Annotations;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public class DatabaseBlobContainer : AggregateRoot<Guid>, IMultiTenant
{
public class DatabaseBlobContainer : AggregateRoot<Guid>, IMultiTenant
{
public virtual Guid? TenantId { get; protected set; }
public virtual Guid? TenantId { get; protected set; }
public virtual string Name { get; protected set; }
public virtual string Name { get; protected set; }
public DatabaseBlobContainer(Guid id, [NotNull] string name, Guid? tenantId = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), DatabaseContainerConsts.MaxNameLength);
TenantId = tenantId;
}
public DatabaseBlobContainer(Guid id, [NotNull] string name, Guid? tenantId = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), DatabaseContainerConsts.MaxNameLength);
TenantId = tenantId;
}
}

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

@ -1,12 +1,11 @@
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public static class DatabaseBlobContainerConfigurationExtensions
{
public static class DatabaseBlobContainerConfigurationExtensions
public static BlobContainerConfiguration UseDatabase(
this BlobContainerConfiguration containerConfiguration)
{
public static BlobContainerConfiguration UseDatabase(
this BlobContainerConfiguration containerConfiguration)
{
containerConfiguration.ProviderType = typeof(DatabaseBlobProvider);
return containerConfiguration;
}
containerConfiguration.ProviderType = typeof(DatabaseBlobProvider);
return containerConfiguration;
}
}
}

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

@ -5,137 +5,136 @@ using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public class DatabaseBlobProvider : BlobProviderBase, ITransientDependency
{
public class DatabaseBlobProvider : BlobProviderBase, ITransientDependency
protected IDatabaseBlobRepository DatabaseBlobRepository { get; }
protected IDatabaseBlobContainerRepository DatabaseBlobContainerRepository { get; }
protected IGuidGenerator GuidGenerator { get; }
protected ICurrentTenant CurrentTenant { get; }
public DatabaseBlobProvider(
IDatabaseBlobRepository databaseBlobRepository,
IDatabaseBlobContainerRepository databaseBlobContainerRepository,
IGuidGenerator guidGenerator,
ICurrentTenant currentTenant)
{
protected IDatabaseBlobRepository DatabaseBlobRepository { get; }
protected IDatabaseBlobContainerRepository DatabaseBlobContainerRepository { get; }
protected IGuidGenerator GuidGenerator { get; }
protected ICurrentTenant CurrentTenant { get; }
public DatabaseBlobProvider(
IDatabaseBlobRepository databaseBlobRepository,
IDatabaseBlobContainerRepository databaseBlobContainerRepository,
IGuidGenerator guidGenerator,
ICurrentTenant currentTenant)
{
DatabaseBlobRepository = databaseBlobRepository;
DatabaseBlobContainerRepository = databaseBlobContainerRepository;
GuidGenerator = guidGenerator;
CurrentTenant = currentTenant;
}
DatabaseBlobRepository = databaseBlobRepository;
DatabaseBlobContainerRepository = databaseBlobContainerRepository;
GuidGenerator = guidGenerator;
CurrentTenant = currentTenant;
}
public async override Task SaveAsync(BlobProviderSaveArgs args)
{
var container = await GetOrCreateContainerAsync(args.ContainerName, args.CancellationToken);
public async override Task SaveAsync(BlobProviderSaveArgs args)
{
var container = await GetOrCreateContainerAsync(args.ContainerName, args.CancellationToken);
var blob = await DatabaseBlobRepository.FindAsync(
container.Id,
args.BlobName,
args.CancellationToken
);
var blob = await DatabaseBlobRepository.FindAsync(
container.Id,
args.BlobName,
args.CancellationToken
);
var content = await args.BlobStream.GetAllBytesAsync(args.CancellationToken);
var content = await args.BlobStream.GetAllBytesAsync(args.CancellationToken);
if (blob != null)
if (blob != null)
{
if (!args.OverrideExisting)
{
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.");
}
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.SetContent(content);
blob.SetContent(content);
await DatabaseBlobRepository.UpdateAsync(blob, autoSave: true);
}
else
{
blob = new DatabaseBlob(GuidGenerator.Create(), container.Id, args.BlobName, content, CurrentTenant.Id);
await DatabaseBlobRepository.InsertAsync(blob, autoSave: true);
}
await DatabaseBlobRepository.UpdateAsync(blob, autoSave: true);
}
public async override Task<bool> DeleteAsync(BlobProviderDeleteArgs args)
else
{
var container = await DatabaseBlobContainerRepository.FindAsync(
args.ContainerName,
args.CancellationToken
);
if (container == null)
{
return false;
}
return await DatabaseBlobRepository.DeleteAsync(
container.Id,
args.BlobName,
autoSave: true,
cancellationToken: args.CancellationToken
);
blob = new DatabaseBlob(GuidGenerator.Create(), container.Id, args.BlobName, content, CurrentTenant.Id);
await DatabaseBlobRepository.InsertAsync(blob, autoSave: true);
}
}
public async override Task<bool> ExistsAsync(BlobProviderExistsArgs args)
public async override Task<bool> DeleteAsync(BlobProviderDeleteArgs args)
{
var container = await DatabaseBlobContainerRepository.FindAsync(
args.ContainerName,
args.CancellationToken
);
if (container == null)
{
var container = await DatabaseBlobContainerRepository.FindAsync(
args.ContainerName,
args.CancellationToken
);
return false;
}
if (container == null)
{
return false;
}
return await DatabaseBlobRepository.DeleteAsync(
container.Id,
args.BlobName,
autoSave: true,
cancellationToken: args.CancellationToken
);
}
return await DatabaseBlobRepository.ExistsAsync(
container.Id,
args.BlobName,
args.CancellationToken
);
}
public async override Task<bool> ExistsAsync(BlobProviderExistsArgs args)
{
var container = await DatabaseBlobContainerRepository.FindAsync(
args.ContainerName,
args.CancellationToken
);
public async override Task<Stream> GetOrNullAsync(BlobProviderGetArgs args)
if (container == null)
{
var container = await DatabaseBlobContainerRepository.FindAsync(
args.ContainerName,
args.CancellationToken
);
if (container == null)
{
return null;
}
return false;
}
var blob = await DatabaseBlobRepository.FindAsync(
container.Id,
args.BlobName,
args.CancellationToken
);
return await DatabaseBlobRepository.ExistsAsync(
container.Id,
args.BlobName,
args.CancellationToken
);
}
if (blob == null)
{
return null;
}
public async override Task<Stream> GetOrNullAsync(BlobProviderGetArgs args)
{
var container = await DatabaseBlobContainerRepository.FindAsync(
args.ContainerName,
args.CancellationToken
);
return new MemoryStream(blob.Content);
if (container == null)
{
return null;
}
protected virtual async Task<DatabaseBlobContainer> GetOrCreateContainerAsync(
string name,
CancellationToken cancellationToken = default)
var blob = await DatabaseBlobRepository.FindAsync(
container.Id,
args.BlobName,
args.CancellationToken
);
if (blob == null)
{
var container = await DatabaseBlobContainerRepository.FindAsync(name, cancellationToken);
if (container != null)
{
return container;
}
return null;
}
container = new DatabaseBlobContainer(GuidGenerator.Create(), name, CurrentTenant.Id);
await DatabaseBlobContainerRepository.InsertAsync(container, cancellationToken: cancellationToken);
return new MemoryStream(blob.Content);
}
protected virtual async Task<DatabaseBlobContainer> GetOrCreateContainerAsync(
string name,
CancellationToken cancellationToken = default)
{
var container = await DatabaseBlobContainerRepository.FindAsync(name, cancellationToken);
if (container != null)
{
return container;
}
container = new DatabaseBlobContainer(GuidGenerator.Create(), name, CurrentTenant.Id);
await DatabaseBlobContainerRepository.InsertAsync(container, cancellationToken: cancellationToken);
return container;
}
}

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

@ -4,10 +4,9 @@ using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public interface IDatabaseBlobContainerRepository : IBasicRepository<DatabaseBlobContainer, Guid>
{
public interface IDatabaseBlobContainerRepository : IBasicRepository<DatabaseBlobContainer, Guid>
{
Task<DatabaseBlobContainer> FindAsync([NotNull] string name, CancellationToken cancellationToken = default);
}
}
Task<DatabaseBlobContainer> FindAsync([NotNull] string name, CancellationToken cancellationToken = default);
}

15
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/IDatabaseBlobRepository.cs

@ -4,14 +4,13 @@ using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public interface IDatabaseBlobRepository : IBasicRepository<DatabaseBlob, Guid>
{
public interface IDatabaseBlobRepository : IBasicRepository<DatabaseBlob, Guid>
{
Task<DatabaseBlob> FindAsync(Guid containerId, [NotNull] string name, CancellationToken cancellationToken = default);
Task<DatabaseBlob> FindAsync(Guid containerId, [NotNull] string name, CancellationToken cancellationToken = default);
Task<bool> ExistsAsync(Guid containerId, [NotNull] string name, CancellationToken cancellationToken = default);
Task<bool> ExistsAsync(Guid containerId, [NotNull] string name, CancellationToken cancellationToken = default);
Task<bool> DeleteAsync(Guid containerId, [NotNull] string name, bool autoSave = false, CancellationToken cancellationToken = default);
}
}
Task<bool> DeleteAsync(Guid containerId, [NotNull] string name, bool autoSave = false, CancellationToken cancellationToken = default);
}

27
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreModule.cs

@ -2,22 +2,21 @@
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
[DependsOn(
typeof(BlobStoringDatabaseDomainModule),
typeof(AbpEntityFrameworkCoreModule)
)]
public class BlobStoringDatabaseEntityFrameworkCoreModule : AbpModule
{
[DependsOn(
typeof(BlobStoringDatabaseDomainModule),
typeof(AbpEntityFrameworkCoreModule)
)]
public class BlobStoringDatabaseEntityFrameworkCoreModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
context.Services.AddAbpDbContext<BlobStoringDbContext>(options =>
{
context.Services.AddAbpDbContext<BlobStoringDbContext>(options =>
{
options.AddRepository<DatabaseBlobContainer, EfCoreDatabaseBlobContainerRepository>();
options.AddRepository<DatabaseBlobContainer, EfCoreDatabaseBlobContainerRepository>();
options.AddRepository<DatabaseBlob, EfCoreDatabaseBlobRepository>();
});
}
options.AddRepository<DatabaseBlob, EfCoreDatabaseBlobRepository>();
});
}
}
}

31
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs

@ -2,26 +2,25 @@
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public class BlobStoringDbContext : AbpDbContext<BlobStoringDbContext>, IBlobStoringDbContext
{
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public class BlobStoringDbContext : AbpDbContext<BlobStoringDbContext>, IBlobStoringDbContext
{
public DbSet<DatabaseBlobContainer> BlobContainers { get; set; }
public DbSet<DatabaseBlobContainer> BlobContainers { get; set; }
public DbSet<DatabaseBlob> Blobs { get; set; }
public DbSet<DatabaseBlob> Blobs { get; set; }
public BlobStoringDbContext(DbContextOptions<BlobStoringDbContext> options)
: base(options)
{
public BlobStoringDbContext(DbContextOptions<BlobStoringDbContext> options)
: base(options)
{
}
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ConfigureBlobStoring();
}
builder.ConfigureBlobStoring();
}
}
}

53
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs

@ -1,48 +1,47 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
public static class BlobStoringDbContextModelCreatingExtensions
{
public static class BlobStoringDbContextModelCreatingExtensions
public static void ConfigureBlobStoring(
this ModelBuilder builder)
{
public static void ConfigureBlobStoring(
this ModelBuilder builder)
{
Check.NotNull(builder, nameof(builder));
Check.NotNull(builder, nameof(builder));
builder.Entity<DatabaseBlobContainer>(b =>
{
b.ToTable(BlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers", BlobStoringDatabaseDbProperties.DbSchema);
builder.Entity<DatabaseBlobContainer>(b =>
{
b.ToTable(BlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers", BlobStoringDatabaseDbProperties.DbSchema);
b.ConfigureByConvention();
b.ConfigureByConvention();
b.Property(p => p.Name).IsRequired().HasMaxLength(DatabaseContainerConsts.MaxNameLength);
b.Property(p => p.Name).IsRequired().HasMaxLength(DatabaseContainerConsts.MaxNameLength);
b.HasMany<DatabaseBlob>().WithOne().HasForeignKey(p => p.ContainerId);
b.HasMany<DatabaseBlob>().WithOne().HasForeignKey(p => p.ContainerId);
b.HasIndex(x => new {x.TenantId, x.Name});
b.HasIndex(x => new { x.TenantId, x.Name });
b.ApplyObjectExtensionMappings();
});
b.ApplyObjectExtensionMappings();
});
builder.Entity<DatabaseBlob>(b =>
{
b.ToTable(BlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs", BlobStoringDatabaseDbProperties.DbSchema);
builder.Entity<DatabaseBlob>(b =>
{
b.ToTable(BlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs", BlobStoringDatabaseDbProperties.DbSchema);
b.ConfigureByConvention();
b.ConfigureByConvention();
b.Property(p => p.ContainerId).IsRequired(); //TODO: Foreign key!
b.Property(p => p.ContainerId).IsRequired(); //TODO: Foreign key!
b.Property(p => p.Name).IsRequired().HasMaxLength(DatabaseBlobConsts.MaxNameLength);
b.Property(p => p.Content).HasMaxLength(DatabaseBlobConsts.MaxContentLength);
b.Property(p => p.Content).HasMaxLength(DatabaseBlobConsts.MaxContentLength);
b.HasOne<DatabaseBlobContainer>().WithMany().HasForeignKey(p => p.ContainerId);
b.HasOne<DatabaseBlobContainer>().WithMany().HasForeignKey(p => p.ContainerId);
b.HasIndex(x => new {x.TenantId, x.ContainerId, x.Name});
b.HasIndex(x => new { x.TenantId, x.ContainerId, x.Name });
b.ApplyObjectExtensionMappings();
});
b.ApplyObjectExtensionMappings();
});
builder.TryConfigureObjectExtensions<BlobStoringDbContext>();
}
builder.TryConfigureObjectExtensions<BlobStoringDbContext>();
}
}

21
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/EfCoreDatabaseBlobContainerRepository.cs

@ -6,19 +6,18 @@ using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
public class EfCoreDatabaseBlobContainerRepository : EfCoreRepository<IBlobStoringDbContext, DatabaseBlobContainer, Guid>, IDatabaseBlobContainerRepository
{
public class EfCoreDatabaseBlobContainerRepository : EfCoreRepository<IBlobStoringDbContext, DatabaseBlobContainer, Guid>, IDatabaseBlobContainerRepository
public EfCoreDatabaseBlobContainerRepository(IDbContextProvider<IBlobStoringDbContext> dbContextProvider)
: base(dbContextProvider)
{
public EfCoreDatabaseBlobContainerRepository(IDbContextProvider<IBlobStoringDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
}
public virtual async Task<DatabaseBlobContainer> FindAsync(string name, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.FirstOrDefaultAsync(x => x.Name == name, GetCancellationToken(cancellationToken));
}
public virtual async Task<DatabaseBlobContainer> FindAsync(string name, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.FirstOrDefaultAsync(x => x.Name == name, GetCancellationToken(cancellationToken));
}
}

83
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/EfCoreDatabaseBlobRepository.cs

@ -6,55 +6,54 @@ using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
public class EfCoreDatabaseBlobRepository : EfCoreRepository<IBlobStoringDbContext, DatabaseBlob, Guid>,
IDatabaseBlobRepository
{
public class EfCoreDatabaseBlobRepository : EfCoreRepository<IBlobStoringDbContext, DatabaseBlob, Guid>,
IDatabaseBlobRepository
public EfCoreDatabaseBlobRepository(IDbContextProvider<IBlobStoringDbContext> dbContextProvider)
: base(dbContextProvider)
{
public EfCoreDatabaseBlobRepository(IDbContextProvider<IBlobStoringDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
}
public virtual async Task<DatabaseBlob> FindAsync(
Guid containerId,
string name,
CancellationToken cancellationToken = default)
{
return (await GetDbSetAsync())
.FirstOrDefault(
x => x.ContainerId == containerId && x.Name == name
public virtual async Task<DatabaseBlob> FindAsync(
Guid containerId,
string name,
CancellationToken cancellationToken = default)
{
return (await GetDbSetAsync())
.FirstOrDefault(
x => x.ContainerId == containerId && x.Name == name
);
}
public virtual async Task<bool> ExistsAsync(
Guid containerId,
string name,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.AnyAsync(
x => x.ContainerId == containerId && x.Name == name,
GetCancellationToken(cancellationToken)
);
}
}
public virtual async Task<bool> ExistsAsync(
Guid containerId,
string name,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.AnyAsync(
x => x.ContainerId == containerId && x.Name == name,
GetCancellationToken(cancellationToken)
);
}
public virtual async Task<bool> DeleteAsync(
Guid containerId,
string name,
bool autoSave = false,
CancellationToken cancellationToken = default)
{
//TODO: Should extract this logic to out of the repository and remove this method completely
public virtual async Task<bool> DeleteAsync(
Guid containerId,
string name,
bool autoSave = false,
CancellationToken cancellationToken = default)
var blob = await FindAsync(containerId, name, cancellationToken);
if (blob == null)
{
//TODO: Should extract this logic to out of the repository and remove this method completely
var blob = await FindAsync(containerId, name, cancellationToken);
if (blob == null)
{
return false;
}
await base.DeleteAsync(blob, autoSave, cancellationToken: GetCancellationToken(cancellationToken));
return true;
return false;
}
await base.DeleteAsync(blob, autoSave, cancellationToken: GetCancellationToken(cancellationToken));
return true;
}
}

15
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs

@ -2,13 +2,12 @@
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public interface IBlobStoringDbContext : IEfCoreDbContext
{
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public interface IBlobStoringDbContext : IEfCoreDbContext
{
DbSet<DatabaseBlobContainer> BlobContainers { get; }
DbSet<DatabaseBlobContainer> BlobContainers { get; }
DbSet<DatabaseBlob> Blobs { get; }
}
}
DbSet<DatabaseBlob> Blobs { get; }
}

23
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo/Abp/BlobStoring/Database/AbpBlobStoringDatabaseInstallerModule.cs

@ -2,20 +2,19 @@
using Volo.Abp.Studio;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
[DependsOn(
typeof(AbpStudioModuleInstallerModule),
typeof(AbpVirtualFileSystemModule)
)]
public class AbpBlobStoringDatabaseInstallerModule : AbpModule
{
[DependsOn(
typeof(AbpStudioModuleInstallerModule),
typeof(AbpVirtualFileSystemModule)
)]
public class AbpBlobStoringDatabaseInstallerModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
Configure<AbpVirtualFileSystemOptions>(options =>
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpBlobStoringDatabaseInstallerModule>();
});
}
options.FileSets.AddEmbedded<AbpBlobStoringDatabaseInstallerModule>();
});
}
}

29
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseInstallerPipelineBuilder.cs

@ -3,22 +3,21 @@ using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Studio.ModuleInstalling;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IModuleInstallingPipelineBuilder))]
public class BlobStoringDatabaseInstallerPipelineBuilder : ModuleInstallingPipelineBuilderBase, IModuleInstallingPipelineBuilder, ITransientDependency
{
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IModuleInstallingPipelineBuilder))]
public class BlobStoringDatabaseInstallerPipelineBuilder : ModuleInstallingPipelineBuilderBase, IModuleInstallingPipelineBuilder, ITransientDependency
public async Task<ModuleInstallingPipeline> BuildAsync(ModuleInstallingContext context)
{
public async Task<ModuleInstallingPipeline> BuildAsync(ModuleInstallingContext context)
{
context.AddEfCoreConfigurationMethodDeclaration(
new EfCoreConfigurationMethodDeclaration(
"Volo.Abp.BlobStoring.Database.EntityFrameworkCore",
"ConfigureBlobStoring"
)
);
return GetBasePipeline(context);
}
context.AddEfCoreConfigurationMethodDeclaration(
new EfCoreConfigurationMethodDeclaration(
"Volo.Abp.BlobStoring.Database.EntityFrameworkCore",
"ConfigureBlobStoring"
)
);
return GetBasePipeline(context);
}
}

25
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringDatabaseMongoDbModule.cs

@ -2,21 +2,20 @@
using Volo.Abp.Modularity;
using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
[DependsOn(
typeof(BlobStoringDatabaseDomainModule),
typeof(AbpMongoDbModule)
)]
public class BlobStoringDatabaseMongoDbModule : AbpModule
{
[DependsOn(
typeof(BlobStoringDatabaseDomainModule),
typeof(AbpMongoDbModule)
)]
public class BlobStoringDatabaseMongoDbModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
context.Services.AddMongoDbContext<BlobStoringMongoDbContext>(options =>
{
context.Services.AddMongoDbContext<BlobStoringMongoDbContext>(options =>
{
options.AddRepository<DatabaseBlobContainer, MongoDbDatabaseBlobContainerRepository>();
options.AddRepository<DatabaseBlob, MongoDbDatabaseBlobRepository>();
});
}
options.AddRepository<DatabaseBlobContainer, MongoDbDatabaseBlobContainerRepository>();
options.AddRepository<DatabaseBlob, MongoDbDatabaseBlobRepository>();
});
}
}

23
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs

@ -2,20 +2,19 @@
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public class BlobStoringMongoDbContext : AbpMongoDbContext, IBlobStoringMongoDbContext
{
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public class BlobStoringMongoDbContext : AbpMongoDbContext, IBlobStoringMongoDbContext
{
public IMongoCollection<DatabaseBlobContainer> BlobContainers => Collection<DatabaseBlobContainer>();
public IMongoCollection<DatabaseBlobContainer> BlobContainers => Collection<DatabaseBlobContainer>();
public IMongoCollection<DatabaseBlob> Blobs => Collection<DatabaseBlob>();
public IMongoCollection<DatabaseBlob> Blobs => Collection<DatabaseBlob>();
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{
base.CreateModel(modelBuilder);
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{
base.CreateModel(modelBuilder);
modelBuilder.ConfigureBlobStoring();
}
modelBuilder.ConfigureBlobStoring();
}
}
}

29
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs

@ -1,23 +1,22 @@
using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
public static class BlobStoringMongoDbContextExtensions
{
public static class BlobStoringMongoDbContextExtensions
public static void ConfigureBlobStoring(
this IMongoModelBuilder builder)
{
public static void ConfigureBlobStoring(
this IMongoModelBuilder builder)
{
Check.NotNull(builder, nameof(builder));
Check.NotNull(builder, nameof(builder));
builder.Entity<DatabaseBlobContainer>(b =>
{
b.CollectionName = BlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers";
});
builder.Entity<DatabaseBlobContainer>(b =>
{
b.CollectionName = BlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers";
});
builder.Entity<DatabaseBlob>(b =>
{
b.CollectionName = BlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs";
});
}
builder.Entity<DatabaseBlob>(b =>
{
b.CollectionName = BlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs";
});
}
}

15
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs

@ -2,13 +2,12 @@
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public interface IBlobStoringMongoDbContext : IAbpMongoDbContext
{
[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)]
public interface IBlobStoringMongoDbContext : IAbpMongoDbContext
{
IMongoCollection<DatabaseBlobContainer> BlobContainers { get; }
IMongoCollection<DatabaseBlob> Blobs { get; }
}
IMongoCollection<DatabaseBlobContainer> BlobContainers { get; }
IMongoCollection<DatabaseBlob> Blobs { get; }
}

23
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/MongoDbDatabaseBlobContainerRepository.cs

@ -4,18 +4,17 @@ using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
public class MongoDbDatabaseBlobContainerRepository : MongoDbRepository<IBlobStoringMongoDbContext, DatabaseBlobContainer, Guid>, IDatabaseBlobContainerRepository
{
public class MongoDbDatabaseBlobContainerRepository : MongoDbRepository<IBlobStoringMongoDbContext, DatabaseBlobContainer, Guid>, IDatabaseBlobContainerRepository
public MongoDbDatabaseBlobContainerRepository(IMongoDbContextProvider<IBlobStoringMongoDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<DatabaseBlobContainer> FindAsync(string name, CancellationToken cancellationToken = default)
{
public MongoDbDatabaseBlobContainerRepository(IMongoDbContextProvider<IBlobStoringMongoDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<DatabaseBlobContainer> FindAsync(string name, CancellationToken cancellationToken = default)
{
return await base.FindAsync(x => x.Name == name, cancellationToken: GetCancellationToken(cancellationToken));
}
return await base.FindAsync(x => x.Name == name, cancellationToken: GetCancellationToken(cancellationToken));
}
}
}

71
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/MongoDbDatabaseBlobRepository.cs

@ -5,51 +5,50 @@ using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
public class MongoDbDatabaseBlobRepository : MongoDbRepository<IBlobStoringMongoDbContext, DatabaseBlob, Guid>, IDatabaseBlobRepository
{
public class MongoDbDatabaseBlobRepository : MongoDbRepository<IBlobStoringMongoDbContext, DatabaseBlob, Guid>, IDatabaseBlobRepository
public MongoDbDatabaseBlobRepository(IMongoDbContextProvider<IBlobStoringMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
public MongoDbDatabaseBlobRepository(IMongoDbContextProvider<IBlobStoringMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
}
}
public virtual async Task<DatabaseBlob> FindAsync(Guid containerId, string name, CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
public virtual async Task<DatabaseBlob> FindAsync(Guid containerId, string name, CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
return await (await GetMongoQueryableAsync(cancellationToken))
.FirstOrDefaultAsync(
x => x.ContainerId == containerId && x.Name == name,
cancellationToken
);
}
return await (await GetMongoQueryableAsync(cancellationToken))
.FirstOrDefaultAsync(
x => x.ContainerId == containerId && x.Name == name,
cancellationToken
);
}
public virtual async Task<bool> ExistsAsync(Guid containerId, string name, CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
public virtual async Task<bool> ExistsAsync(Guid containerId, string name, CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
return await (await GetMongoQueryableAsync(cancellationToken))
.AnyAsync(
x => x.ContainerId == containerId && x.Name == name,
cancellationToken
);
}
return await (await GetMongoQueryableAsync(cancellationToken))
.AnyAsync(
x => x.ContainerId == containerId && x.Name == name,
cancellationToken
);
}
public virtual async Task<bool> DeleteAsync(
Guid containerId,
string name,
bool autoSave = false,
CancellationToken cancellationToken = default)
public virtual async Task<bool> DeleteAsync(
Guid containerId,
string name,
bool autoSave = false,
CancellationToken cancellationToken = default)
{
var blob = await FindAsync(containerId, name, cancellationToken);
if (blob == null)
{
var blob = await FindAsync(containerId, name, cancellationToken);
if (blob == null)
{
return false;
}
return false;
}
await base.DeleteAsync(blob, autoSave, cancellationToken);
await base.DeleteAsync(blob, autoSave, cancellationToken);
return true;
}
return true;
}
}

15
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/BlobStoringDatabaseDomainTestBase.cs

@ -1,10 +1,9 @@
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
/* Inherit from this class for your domain layer tests.
* See SampleManager_Tests for example.
*/
public abstract class BlobStoringDatabaseDomainTestBase : BlobStoringDatabaseTestBase<BlobStoringDatabaseDomainTestModule>
{
/* Inherit from this class for your domain layer tests.
* See SampleManager_Tests for example.
*/
public abstract class BlobStoringDatabaseDomainTestBase : BlobStoringDatabaseTestBase<BlobStoringDatabaseDomainTestModule>
{
}
}
}

15
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/BlobStoringDatabaseDomainTestModule.cs

@ -1,13 +1,12 @@
using Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
[DependsOn(
typeof(BlobStoringDatabaseEntityFrameworkCoreTestModule)
)]
public class BlobStoringDatabaseDomainTestModule : AbpModule
{
[DependsOn(
typeof(BlobStoringDatabaseEntityFrameworkCoreTestModule)
)]
public class BlobStoringDatabaseDomainTestModule : AbpModule
{
}
}

9
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestBase.cs

@ -1,7 +1,6 @@
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
public abstract class BlobStoringDatabaseEntityFrameworkCoreTestBase : BlobStoringDatabaseTestBase<BlobStoringDatabaseEntityFrameworkCoreTestModule>
{
public abstract class BlobStoringDatabaseEntityFrameworkCoreTestBase : BlobStoringDatabaseTestBase<BlobStoringDatabaseEntityFrameworkCoreTestModule>
{
}
}
}

51
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/BlobStoringDatabaseEntityFrameworkCoreTestModule.cs

@ -5,37 +5,36 @@ using Microsoft.EntityFrameworkCore.Storage;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
[DependsOn(
typeof(BlobStoringDatabaseTestBaseModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule)
)]
public class BlobStoringDatabaseEntityFrameworkCoreTestModule : AbpModule
{
[DependsOn(
typeof(BlobStoringDatabaseTestBaseModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule)
)]
public class BlobStoringDatabaseEntityFrameworkCoreTestModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var sqliteConnection = CreateDatabaseAndGetConnection();
var sqliteConnection = CreateDatabaseAndGetConnection();
Configure<AbpDbContextOptions>(options =>
Configure<AbpDbContextOptions>(options =>
{
options.Configure(abpDbContextConfigurationContext =>
{
options.Configure(abpDbContextConfigurationContext =>
{
abpDbContextConfigurationContext.DbContextOptions.UseSqlite(sqliteConnection);
});
abpDbContextConfigurationContext.DbContextOptions.UseSqlite(sqliteConnection);
});
}
private static SqliteConnection CreateDatabaseAndGetConnection()
{
var connection = new SqliteConnection("Data Source=:memory:");
connection.Open();
});
}
private static SqliteConnection CreateDatabaseAndGetConnection()
{
var connection = new SqliteConnection("Data Source=:memory:");
connection.Open();
new BlobStoringDbContext(
new DbContextOptionsBuilder<BlobStoringDbContext>().UseSqlite(connection).Options
).GetService<IRelationalDatabaseCreator>().CreateTables();
new BlobStoringDbContext(
new DbContextOptionsBuilder<BlobStoringDbContext>().UseSqlite(connection).Options
).GetService<IRelationalDatabaseCreator>().CreateTables();
return connection;
}
return connection;
}
}

11
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/EfCoreContainer_Tests.cs

@ -1,7 +1,6 @@
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore
namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
public class EfCoreContainer_Tests : BlobContainer_Tests<BlobStoringDatabaseEntityFrameworkCoreTestModule>
{
public class EfCoreContainer_Tests : BlobContainer_Tests<BlobStoringDatabaseEntityFrameworkCoreTestModule>
{
}
}
}

7
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/EntityFrameworkCore/EfCoreDatabaseBlobContainer_Tests.cs

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

9
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/BlobStoringDatabaseMongoDbTestBase.cs

@ -1,7 +1,6 @@
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
public abstract class BlobStoringDatabaseMongoDbTestBase : BlobStoringDatabaseTestBase<BlobStoringDatabaseMongoDbTestModule>
{
public abstract class BlobStoringDatabaseMongoDbTestBase : BlobStoringDatabaseTestBase<BlobStoringDatabaseMongoDbTestModule>
{
}
}
}

33
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/BlobStoringDatabaseMongoDbTestModule.cs

@ -3,25 +3,24 @@ using Volo.Abp.Data;
using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
[DependsOn(
typeof(BlobStoringDatabaseTestBaseModule),
typeof(BlobStoringDatabaseMongoDbModule)
)]
public class BlobStoringDatabaseMongoDbTestModule : AbpModule
{
[DependsOn(
typeof(BlobStoringDatabaseTestBaseModule),
typeof(BlobStoringDatabaseMongoDbModule)
)]
public class BlobStoringDatabaseMongoDbTestModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var stringArray = MongoDbFixture.ConnectionString.Split('?');
var connectionString = stringArray[0].EnsureEndsWith('/') +
"Db_" +
Guid.NewGuid().ToString("N") + "/?" + stringArray[1];
var stringArray = MongoDbFixture.ConnectionString.Split('?');
var connectionString = stringArray[0].EnsureEndsWith('/') +
"Db_" +
Guid.NewGuid().ToString("N") + "/?" + stringArray[1];
Configure<AbpDbConnectionOptions>(options =>
{
options.ConnectionStrings.Default = connectionString;
});
}
Configure<AbpDbConnectionOptions>(options =>
{
options.ConnectionStrings.Default = connectionString;
});
}
}

13
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/MongoDbContainer_Tests.cs

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

9
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/MongoDbDatabaseBlobContainer_Tests.cs

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

27
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/MongoDbFixture.cs

@ -1,22 +1,21 @@
using System;
using Mongo2Go;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
public class MongoDbFixture : IDisposable
{
public class MongoDbFixture : IDisposable
{
private static readonly MongoDbRunner MongoDbRunner;
public static readonly string ConnectionString;
private static readonly MongoDbRunner MongoDbRunner;
public static readonly string ConnectionString;
static MongoDbFixture()
{
MongoDbRunner = MongoDbRunner.Start(singleNodeReplSet: true, singleNodeReplSetWaitTimeout: 20);
ConnectionString = MongoDbRunner.ConnectionString;
}
static MongoDbFixture()
{
MongoDbRunner = MongoDbRunner.Start(singleNodeReplSet: true, singleNodeReplSetWaitTimeout: 20);
ConnectionString = MongoDbRunner.ConnectionString;
}
public void Dispose()
{
MongoDbRunner?.Dispose();
}
public void Dispose()
{
MongoDbRunner?.Dispose();
}
}

13
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/MongoTestCollection.cs

@ -1,10 +1,9 @@
using Xunit;
namespace Volo.Abp.BlobStoring.Database.MongoDB
namespace Volo.Abp.BlobStoring.Database.MongoDB;
[CollectionDefinition(Name)]
public class MongoTestCollection : ICollectionFixture<MongoDbFixture>
{
[CollectionDefinition(Name)]
public class MongoTestCollection : ICollectionFixture<MongoDbFixture>
{
public const string Name = "MongoDB Collection";
}
}
public const string Name = "MongoDB Collection";
}

67
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/BlobStoringDatabaseTestBase.cs

@ -6,53 +6,52 @@ using Volo.Abp.Modularity;
using Volo.Abp.Uow;
using Volo.Abp.Testing;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
public abstract class BlobStoringDatabaseTestBase<TStartupModule> : AbpIntegratedTest<TStartupModule>
where TStartupModule : IAbpModule
{
public abstract class BlobStoringDatabaseTestBase<TStartupModule> : AbpIntegratedTest<TStartupModule>
where TStartupModule : IAbpModule
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
}
options.UseAutofac();
}
protected virtual Task WithUnitOfWorkAsync(Func<Task> func)
{
return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func);
}
protected virtual Task WithUnitOfWorkAsync(Func<Task> func)
{
return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func);
}
protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func<Task> action)
protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func<Task> action)
{
using (var scope = ServiceProvider.CreateScope())
{
using (var scope = ServiceProvider.CreateScope())
{
var uowManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
var uowManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
using (var uow = uowManager.Begin(options))
{
await action();
using (var uow = uowManager.Begin(options))
{
await action();
await uow.CompleteAsync();
}
await uow.CompleteAsync();
}
}
}
protected virtual Task<TResult> WithUnitOfWorkAsync<TResult>(Func<Task<TResult>> func)
{
return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func);
}
protected virtual Task<TResult> WithUnitOfWorkAsync<TResult>(Func<Task<TResult>> func)
{
return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func);
}
protected virtual async Task<TResult> WithUnitOfWorkAsync<TResult>(AbpUnitOfWorkOptions options, Func<Task<TResult>> func)
protected virtual async Task<TResult> WithUnitOfWorkAsync<TResult>(AbpUnitOfWorkOptions options, Func<Task<TResult>> func)
{
using (var scope = ServiceProvider.CreateScope())
{
using (var scope = ServiceProvider.CreateScope())
var uowManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
using (var uow = uowManager.Begin(options))
{
var uowManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
using (var uow = uowManager.Begin(options))
{
var result = await func();
await uow.CompleteAsync();
return result;
}
var result = await func();
await uow.CompleteAsync();
return result;
}
}
}

35
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/BlobStoringDatabaseTestBaseModule.cs

@ -3,28 +3,27 @@ using Volo.Abp.Authorization;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace Volo.Abp.BlobStoring.Database
namespace Volo.Abp.BlobStoring.Database;
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpTestBaseModule),
typeof(AbpAuthorizationModule),
typeof(BlobStoringDatabaseDomainModule),
typeof(AbpBlobStoringTestModule)
)]
public class BlobStoringDatabaseTestBaseModule : AbpModule
{
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpTestBaseModule),
typeof(AbpAuthorizationModule),
typeof(BlobStoringDatabaseDomainModule),
typeof(AbpBlobStoringTestModule)
)]
public class BlobStoringDatabaseTestBaseModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAlwaysAllowAuthorization();
context.Services.AddAlwaysAllowAuthorization();
Configure<AbpBlobStoringOptions>(options =>
Configure<AbpBlobStoringOptions>(options =>
{
options.Containers.ConfigureAll((containerName, containerConfiguration) =>
{
options.Containers.ConfigureAll((containerName, containerConfiguration) =>
{
containerConfiguration.UseDatabase();
});
containerConfiguration.UseDatabase();
});
}
});
}
}

9
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/DatabaseBlobContainer_Tests.cs

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

45
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Security/FakeCurrentPrincipalAccessor.cs

@ -3,41 +3,40 @@ using System.Security.Claims;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Security.Claims;
namespace Volo.Abp.BlobStoring.Database.Security
namespace Volo.Abp.BlobStoring.Database.Security;
[Dependency(ReplaceServices = true)]
public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor
{
[Dependency(ReplaceServices = true)]
public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor
protected override ClaimsPrincipal GetClaimsPrincipal()
{
protected override ClaimsPrincipal GetClaimsPrincipal()
{
return GetPrincipal();
}
return GetPrincipal();
}
private ClaimsPrincipal _principal;
private ClaimsPrincipal _principal;
private ClaimsPrincipal GetPrincipal()
private ClaimsPrincipal GetPrincipal()
{
if (_principal == null)
{
if (_principal == null)
lock (this)
{
lock (this)
if (_principal == null)
{
if (_principal == null)
{
_principal = new ClaimsPrincipal(
new ClaimsIdentity(
new List<Claim>
{
_principal = new ClaimsPrincipal(
new ClaimsIdentity(
new List<Claim>
{
new Claim(AbpClaimTypes.UserId,"2e701e62-0953-4dd3-910b-dc6cc93ccb0d"),
new Claim(AbpClaimTypes.UserName,"admin"),
new Claim(AbpClaimTypes.Email,"admin@abp.io")
}
)
);
}
}
)
);
}
}
return _principal;
}
return _principal;
}
}

Loading…
Cancel
Save