Browse Source

Merge branch 'dev' into volo/issue/5635

pull/7889/head
Yunus Emre Kalkan 6 years ago
parent
commit
79dde5c266
  1. 6
      docs/en/Best-Practices/Entity-Framework-Core-Integration.md
  2. 11
      framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs
  3. 2
      framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs
  4. 14
      framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs
  5. 2
      framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs
  6. 14
      framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs
  7. 2
      framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs
  8. 1
      framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs
  9. 12
      framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs
  10. 2
      framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs
  11. 59
      framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs
  12. 7
      framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs
  13. 15
      framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs
  14. 64
      framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs
  15. 2
      framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs
  16. 11
      framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingService.cs
  17. 19
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs
  18. 14
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs
  19. 10
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs
  20. 30
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs
  21. 54
      framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs
  22. 2
      modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/IAuditLoggingDbContext.cs
  23. 10
      modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs
  24. 22
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs
  25. 6
      modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/IDocsDbContext.cs
  26. 2
      modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/IFeatureManagementDbContext.cs
  27. 12
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs
  28. 46
      modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs
  29. 2
      modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/IPermissionManagementDbContext.cs
  30. 2
      modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo/Abp/SettingManagement/EntityFrameworkCore/ISettingManagementDbContext.cs
  31. 4
      modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/ITenantManagementDbContext.cs
  32. 4
      npm/ng-packs/apps/dev-app/src/environments/environment.ts
  33. 68
      npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html
  34. 60
      npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.ts
  35. 1
      npm/ng-packs/packages/setting-management/config/src/enums/index.ts
  36. 3
      npm/ng-packs/packages/setting-management/config/src/enums/setting-tab-names.ts
  37. 1
      npm/ng-packs/packages/setting-management/config/src/providers/index.ts
  38. 26
      npm/ng-packs/packages/setting-management/config/src/providers/setting-tab.provider.ts
  39. 17
      npm/ng-packs/packages/setting-management/config/src/proxy/README.md
  40. 27
      npm/ng-packs/packages/setting-management/config/src/proxy/email-settings.service.ts
  41. 4745
      npm/ng-packs/packages/setting-management/config/src/proxy/generate-proxy.json
  42. 2
      npm/ng-packs/packages/setting-management/config/src/proxy/index.ts
  43. 24
      npm/ng-packs/packages/setting-management/config/src/proxy/models.ts
  44. 2
      npm/ng-packs/packages/setting-management/config/src/public-api.ts
  45. 12
      npm/ng-packs/packages/setting-management/config/src/setting-management-config.module.ts
  46. 4
      npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts

6
docs/en/Best-Practices/Entity-Framework-Core-Integration.md

@ -16,11 +16,13 @@
[ConnectionStringName("AbpIdentity")]
public interface IIdentityDbContext : IEfCoreDbContext
{
DbSet<IdentityUser> Users { get; set; }
DbSet<IdentityRole> Roles { get; set; }
DbSet<IdentityUser> Users { get; }
DbSet<IdentityRole> Roles { get; }
}
````
* **Do not** define `set;` for the properties in this interface.
### DbContext class
* **Do** inherit the `DbContext` from the `AbpDbContext<TDbContext>` class.

11
framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs

@ -10,13 +10,16 @@ namespace Volo.Abp.BlobStoring.Aliyun
{
protected IOssClientFactory OssClientFactory { get; }
protected IAliyunBlobNameCalculator AliyunBlobNameCalculator { get; }
protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; }
public AliyunBlobProvider(
IOssClientFactory ossClientFactory,
IAliyunBlobNameCalculator aliyunBlobNameCalculator)
IAliyunBlobNameCalculator aliyunBlobNameCalculator,
IBlobNormalizeNamingService blobNormalizeNamingService)
{
OssClientFactory = ossClientFactory;
AliyunBlobNameCalculator = aliyunBlobNameCalculator;
BlobNormalizeNamingService = blobNormalizeNamingService;
}
protected virtual IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration)
@ -88,15 +91,15 @@ namespace Volo.Abp.BlobStoring.Aliyun
return memoryStream;
}
private static string GetContainerName(BlobProviderArgs args)
protected virtual string GetContainerName(BlobProviderArgs args)
{
var configuration = args.Configuration.GetAliyunConfiguration();
return configuration.ContainerName.IsNullOrWhiteSpace()
? args.ContainerName
: configuration.ContainerName;
: BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName);
}
private bool BlobExists(IOss ossClient,string containerName, string blobName)
protected virtual bool BlobExists(IOss ossClient,string containerName, string blobName)
{
// Make sure Blob Container exists.
return ossClient.DoesBucketExist(containerName) &&

2
framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs

@ -82,7 +82,7 @@ namespace Volo.Abp.BlobStoring.Aliyun
public string ContainerName
{
get => _containerConfiguration.GetConfigurationOrDefault<string>(AliyunBlobProviderConfigurationNames.ContainerName);
set => _containerConfiguration.SetConfiguration(AliyunBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value)));
set => _containerConfiguration.SetConfiguration(AliyunBlobProviderConfigurationNames.ContainerName, value);
}
/// <summary>

14
framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs

@ -12,12 +12,16 @@ namespace Volo.Abp.BlobStoring.Aws
{
protected IAwsBlobNameCalculator AwsBlobNameCalculator { get; }
protected IAmazonS3ClientFactory AmazonS3ClientFactory { get; }
protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; }
public AwsBlobProvider(IAwsBlobNameCalculator awsBlobNameCalculator,
IAmazonS3ClientFactory amazonS3ClientFactory)
public AwsBlobProvider(
IAwsBlobNameCalculator awsBlobNameCalculator,
IAmazonS3ClientFactory amazonS3ClientFactory,
IBlobNormalizeNamingService blobNormalizeNamingService)
{
AwsBlobNameCalculator = awsBlobNameCalculator;
AmazonS3ClientFactory = amazonS3ClientFactory;
BlobNormalizeNamingService = blobNormalizeNamingService;
}
public override async Task SaveAsync(BlobProviderSaveArgs args)
@ -111,7 +115,7 @@ namespace Volo.Abp.BlobStoring.Aws
return await AmazonS3ClientFactory.GetAmazonS3Client(configuration);
}
private async Task<bool> BlobExistsAsync(AmazonS3Client amazonS3Client, string containerName, string blobName)
protected virtual async Task<bool> BlobExistsAsync(AmazonS3Client amazonS3Client, string containerName, string blobName)
{
// Make sure Blob Container exists.
if (!await AmazonS3Util.DoesS3BucketExistV2Async(amazonS3Client, containerName))
@ -147,12 +151,12 @@ namespace Volo.Abp.BlobStoring.Aws
}
}
private static string GetContainerName(BlobProviderArgs args)
protected virtual string GetContainerName(BlobProviderArgs args)
{
var configuration = args.Configuration.GetAwsConfiguration();
return configuration.ContainerName.IsNullOrWhiteSpace()
? args.ContainerName
: configuration.ContainerName;
: BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName);
}
}
}

2
framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs

@ -82,7 +82,7 @@ namespace Volo.Abp.BlobStoring.Aws
public string ContainerName
{
get => _containerConfiguration.GetConfigurationOrDefault<string>(AwsBlobProviderConfigurationNames.ContainerName);
set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value)));
set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.ContainerName, value);
}
/// <summary>

14
framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs

@ -9,10 +9,14 @@ namespace Volo.Abp.BlobStoring.Azure
public class AzureBlobProvider : BlobProviderBase, ITransientDependency
{
protected IAzureBlobNameCalculator AzureBlobNameCalculator { get; }
protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; }
public AzureBlobProvider(IAzureBlobNameCalculator azureBlobNameCalculator)
public AzureBlobProvider(
IAzureBlobNameCalculator azureBlobNameCalculator,
IBlobNormalizeNamingService blobNormalizeNamingService)
{
AzureBlobNameCalculator = azureBlobNameCalculator;
BlobNormalizeNamingService = blobNormalizeNamingService;
}
public override async Task SaveAsync(BlobProviderSaveArgs args)
@ -87,22 +91,22 @@ namespace Volo.Abp.BlobStoring.Azure
await blobContainerClient.CreateIfNotExistsAsync();
}
private async Task<bool> BlobExistsAsync(BlobProviderArgs args, string blobName)
protected virtual async Task<bool> BlobExistsAsync(BlobProviderArgs args, string blobName)
{
// Make sure Blob Container exists.
return await ContainerExistsAsync(GetBlobContainerClient(args)) &&
(await GetBlobClient(args, blobName).ExistsAsync()).Value;
}
private static string GetContainerName(BlobProviderArgs args)
protected virtual string GetContainerName(BlobProviderArgs args)
{
var configuration = args.Configuration.GetAzureConfiguration();
return configuration.ContainerName.IsNullOrWhiteSpace()
? args.ContainerName
: configuration.ContainerName;
: BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName);
}
private static async Task<bool> ContainerExistsAsync(BlobContainerClient blobContainerClient)
protected virtual async Task<bool> ContainerExistsAsync(BlobContainerClient blobContainerClient)
{
return (await blobContainerClient.ExistsAsync()).Value;
}

2
framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs

@ -17,7 +17,7 @@
public string ContainerName
{
get => _containerConfiguration.GetConfigurationOrDefault<string>(AzureBlobProviderConfigurationNames.ContainerName);
set => _containerConfiguration.SetConfiguration(AzureBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value)));
set => _containerConfiguration.SetConfiguration(AzureBlobProviderConfigurationNames.ContainerName, value);
}
/// <summary>

1
framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs

@ -15,6 +15,7 @@ namespace Volo.Abp.BlobStoring.Minio
Action<MinioBlobProviderConfiguration> minioConfigureAction)
{
containerConfiguration.ProviderType = typeof(MinioBlobProvider);
containerConfiguration.NamingNormalizers.TryAdd<MinioBlobNamingNormalizer>();
minioConfigureAction(new MinioBlobProviderConfiguration(containerConfiguration));

12
framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs

@ -10,10 +10,14 @@ namespace Volo.Abp.BlobStoring.Minio
public class MinioBlobProvider : BlobProviderBase, ITransientDependency
{
protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; }
protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; }
public MinioBlobProvider(IMinioBlobNameCalculator minioBlobNameCalculator)
public MinioBlobProvider(
IMinioBlobNameCalculator minioBlobNameCalculator,
IBlobNormalizeNamingService blobNormalizeNamingService)
{
MinioBlobNameCalculator = minioBlobNameCalculator;
BlobNormalizeNamingService = blobNormalizeNamingService;
}
public override async Task SaveAsync(BlobProviderSaveArgs args)
@ -108,7 +112,7 @@ namespace Volo.Abp.BlobStoring.Minio
}
}
private async Task<bool> BlobExistsAsync(MinioClient client, string containerName , string blobName)
protected virtual async Task<bool> BlobExistsAsync(MinioClient client, string containerName , string blobName)
{
// Make sure Blob Container exists.
if (await client.BucketExistsAsync(containerName))
@ -133,13 +137,13 @@ namespace Volo.Abp.BlobStoring.Minio
return false;
}
private static string GetContainerName(BlobProviderArgs args)
protected virtual string GetContainerName(BlobProviderArgs args)
{
var configuration = args.Configuration.GetMinioConfiguration();
return configuration.BucketName.IsNullOrWhiteSpace()
? args.ContainerName
: configuration.BucketName;
: BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.BucketName);
}
}
}

2
framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs

@ -5,7 +5,7 @@
public string BucketName
{
get => _containerConfiguration.GetConfigurationOrDefault<string>(MinioBlobProviderConfigurationNames.BucketName);
set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.BucketName, Check.NotNullOrWhiteSpace(value, nameof(value)));
set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.BucketName, value);
}
/// <summary>

59
framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs

@ -1,9 +1,7 @@
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
@ -88,12 +86,15 @@ namespace Volo.Abp.BlobStoring
protected IServiceProvider ServiceProvider { get; }
protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; }
public BlobContainer(
string containerName,
BlobContainerConfiguration configuration,
IBlobProvider provider,
ICurrentTenant currentTenant,
ICancellationTokenProvider cancellationTokenProvider,
IBlobNormalizeNamingService blobNormalizeNamingService,
IServiceProvider serviceProvider)
{
ContainerName = containerName;
@ -101,6 +102,7 @@ namespace Volo.Abp.BlobStoring
Provider = provider;
CurrentTenant = currentTenant;
CancellationTokenProvider = cancellationTokenProvider;
BlobNormalizeNamingService = blobNormalizeNamingService;
ServiceProvider = serviceProvider;
}
@ -112,13 +114,13 @@ namespace Volo.Abp.BlobStoring
{
using (CurrentTenant.Change(GetTenantIdOrNull()))
{
var (normalizedContainerName, normalizedBlobName) = NormalizeNaming(ContainerName, name);
var blobNormalizeNaming = BlobNormalizeNamingService.NormalizeNaming(Configuration, ContainerName, name);
await Provider.SaveAsync(
new BlobProviderSaveArgs(
normalizedContainerName,
blobNormalizeNaming.ContainerName,
Configuration,
normalizedBlobName,
blobNormalizeNaming.BlobName,
stream,
overrideExisting,
CancellationTokenProvider.FallbackToProvider(cancellationToken)
@ -133,14 +135,14 @@ namespace Volo.Abp.BlobStoring
{
using (CurrentTenant.Change(GetTenantIdOrNull()))
{
var (normalizedContainerName, normalizedBlobName) =
NormalizeNaming(ContainerName, name);
var blobNormalizeNaming =
BlobNormalizeNamingService.NormalizeNaming(Configuration, ContainerName, name);
return await Provider.DeleteAsync(
new BlobProviderDeleteArgs(
normalizedContainerName,
blobNormalizeNaming.ContainerName,
Configuration,
normalizedBlobName,
blobNormalizeNaming.BlobName,
CancellationTokenProvider.FallbackToProvider(cancellationToken)
)
);
@ -153,14 +155,14 @@ namespace Volo.Abp.BlobStoring
{
using (CurrentTenant.Change(GetTenantIdOrNull()))
{
var (normalizedContainerName, normalizedBlobName) =
NormalizeNaming(ContainerName, name);
var blobNormalizeNaming =
BlobNormalizeNamingService.NormalizeNaming(Configuration, ContainerName, name);
return await Provider.ExistsAsync(
new BlobProviderExistsArgs(
normalizedContainerName,
blobNormalizeNaming.ContainerName,
Configuration,
normalizedBlobName,
blobNormalizeNaming.BlobName,
CancellationTokenProvider.FallbackToProvider(cancellationToken)
)
);
@ -189,14 +191,14 @@ namespace Volo.Abp.BlobStoring
{
using (CurrentTenant.Change(GetTenantIdOrNull()))
{
var (normalizedContainerName, normalizedBlobName) =
NormalizeNaming(ContainerName, name);
var blobNormalizeNaming =
BlobNormalizeNamingService.NormalizeNaming(Configuration, ContainerName, name);
return await Provider.GetOrNullAsync(
new BlobProviderGetArgs(
normalizedContainerName,
blobNormalizeNaming.ContainerName,
Configuration,
normalizedBlobName,
blobNormalizeNaming.BlobName,
CancellationTokenProvider.FallbackToProvider(cancellationToken)
)
);
@ -212,28 +214,5 @@ namespace Volo.Abp.BlobStoring
return CurrentTenant.Id;
}
protected virtual (string, string) NormalizeNaming(string containerName, string blobName)
{
if (!Configuration.NamingNormalizers.Any())
{
return (containerName, blobName);
}
using (var scope = ServiceProvider.CreateScope())
{
foreach (var normalizerType in Configuration.NamingNormalizers)
{
var normalizer = scope.ServiceProvider
.GetRequiredService(normalizerType)
.As<IBlobNamingNormalizer>();
containerName = normalizer.NormalizeContainerName(containerName);
blobName = normalizer.NormalizeBlobName(blobName);
}
return (containerName, blobName);
}
}
}
}

7
framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs

@ -17,18 +17,22 @@ namespace Volo.Abp.BlobStoring
protected IServiceProvider ServiceProvider { get; }
protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; }
public BlobContainerFactory(
IBlobContainerConfigurationProvider configurationProvider,
ICurrentTenant currentTenant,
ICancellationTokenProvider cancellationTokenProvider,
IBlobProviderSelector providerSelector,
IServiceProvider serviceProvider)
IServiceProvider serviceProvider,
IBlobNormalizeNamingService blobNormalizeNamingService)
{
ConfigurationProvider = configurationProvider;
CurrentTenant = currentTenant;
CancellationTokenProvider = cancellationTokenProvider;
ProviderSelector = providerSelector;
ServiceProvider = serviceProvider;
BlobNormalizeNamingService = blobNormalizeNamingService;
}
public virtual IBlobContainer Create(string name)
@ -41,6 +45,7 @@ namespace Volo.Abp.BlobStoring
ProviderSelector.Get(name),
CurrentTenant,
CancellationTokenProvider,
BlobNormalizeNamingService,
ServiceProvider
);
}

15
framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs

@ -0,0 +1,15 @@
namespace Volo.Abp.BlobStoring
{
public class BlobNormalizeNaming
{
public string ContainerName { get; }
public string BlobName { get; }
public BlobNormalizeNaming(string containerName, string blobName)
{
ContainerName = containerName;
BlobName = blobName;
}
}
}

64
framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs

@ -0,0 +1,64 @@
using System;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.BlobStoring
{
public class BlobNormalizeNamingService : IBlobNormalizeNamingService, ITransientDependency
{
protected IServiceProvider ServiceProvider { get; }
public BlobNormalizeNamingService(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
}
public BlobNormalizeNaming NormalizeNaming(
BlobContainerConfiguration configuration,
string containerName,
string blobName)
{
if (!configuration.NamingNormalizers.Any())
{
return new BlobNormalizeNaming(containerName, blobName);
}
using (var scope = ServiceProvider.CreateScope())
{
foreach (var normalizerType in configuration.NamingNormalizers)
{
var normalizer = scope.ServiceProvider
.GetRequiredService(normalizerType)
.As<IBlobNamingNormalizer>();
containerName = containerName.IsNullOrWhiteSpace()? containerName: normalizer.NormalizeContainerName(containerName);
blobName = blobName.IsNullOrWhiteSpace()? blobName: normalizer.NormalizeBlobName(blobName);
}
return new BlobNormalizeNaming(containerName, blobName);
}
}
public string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName)
{
if (!configuration.NamingNormalizers.Any())
{
return containerName;
}
return NormalizeNaming(configuration, containerName, null).ContainerName;
}
public string NormalizeBlobName(BlobContainerConfiguration configuration, string blobName)
{
if (!configuration.NamingNormalizers.Any())
{
return blobName;
}
return NormalizeNaming(configuration, null, blobName).BlobName;
}
}
}

2
framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs

@ -13,4 +13,4 @@ namespace Volo.Abp.BlobStoring
public abstract Task<Stream> GetOrNullAsync(BlobProviderGetArgs args);
}
}
}

11
framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingService.cs

@ -0,0 +1,11 @@
namespace Volo.Abp.BlobStoring
{
public interface IBlobNormalizeNamingService
{
BlobNormalizeNaming NormalizeNaming(BlobContainerConfiguration configuration, string containerName, string blobName);
string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName);
string NormalizeBlobName(BlobContainerConfiguration configuration, string blobName);
}
}

19
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs

@ -29,6 +29,8 @@ namespace Volo.Abp.DependencyInjection
public Dictionary<Type, Type> CustomRepositories { get; }
public List<Type> SpecifiedDefaultRepositories { get; }
public bool SpecifiedDefaultRepositoryTypes => DefaultRepositoryImplementationType != null && DefaultRepositoryImplementationTypeWithoutKey != null;
protected AbpCommonDbContextRegistrationOptions(Type originalDbContextType, IServiceCollection services)
@ -38,6 +40,7 @@ namespace Volo.Abp.DependencyInjection
DefaultRepositoryDbContextType = originalDbContextType;
CustomRepositories = new Dictionary<Type, Type>();
ReplacedDbContextTypes = new List<Type>();
SpecifiedDefaultRepositories = new List<Type>();
}
public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext<TOtherDbContext>()
@ -82,6 +85,20 @@ namespace Volo.Abp.DependencyInjection
return AddDefaultRepositories(typeof(TDefaultRepositoryDbContext), includeAllEntities);
}
public IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository<TEntity>()
{
return AddDefaultRepository(typeof(TEntity));
}
public IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(Type entityType)
{
EntityHelper.CheckEntity(entityType);
SpecifiedDefaultRepositories.AddIfNotContains(entityType);
return this;
}
public IAbpCommonDbContextRegistrationOptionsBuilder AddRepository<TEntity, TRepository>()
{
AddCustomRepository(typeof(TEntity), typeof(TRepository));
@ -118,4 +135,4 @@ namespace Volo.Abp.DependencyInjection
CustomRepositories[entityType] = repositoryType;
}
}
}
}

14
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs

@ -39,6 +39,20 @@ namespace Volo.Abp.DependencyInjection
/// </param>
IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(Type defaultRepositoryDbContextType, bool includeAllEntities = false);
/// <summary>
/// Registers custom repository for a specific entity.
/// </summary>
/// <typeparam name="TEntity">Entity type</typeparam>
IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository<TEntity>();
/// <summary>
/// Registers default repository for a specific entity.
/// </summary>
/// <param name="entityType"></param>
/// <returns></returns>
IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(Type entityType);
/// <summary>
/// Registers custom repository for a specific entity.
/// Custom repositories overrides default repositories.

10
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs

@ -118,9 +118,19 @@ namespace Volo.Abp.Domain.Entities
public static bool IsEntity([NotNull] Type type)
{
Check.NotNull(type, nameof(type));
return typeof(IEntity).IsAssignableFrom(type);
}
public static void CheckEntity([NotNull] Type type)
{
Check.NotNull(type, nameof(type));
if (!IsEntity(type))
{
throw new AbpException($"Given {nameof(type)} is not an entity: {type.AssemblyQualifiedName}. It must implement {typeof(IEntity).AssemblyQualifiedName}.");
}
}
public static bool IsEntityWithId([NotNull] Type type)
{
foreach (var interfaceType in type.GetInterfaces())

30
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs

@ -17,20 +17,27 @@ namespace Volo.Abp.Domain.Repositories
}
public virtual void AddRepositories()
{
RegisterCustomRepositories();
RegisterDefaultRepositories();
RegisterSpecifiedDefaultRepositories();
}
protected virtual void RegisterCustomRepositories()
{
foreach (var customRepository in Options.CustomRepositories)
{
Options.Services.AddDefaultRepository(customRepository.Key, customRepository.Value, replaceExisting: true);
}
if (Options.RegisterDefaultRepositories)
{
RegisterDefaultRepositories();
}
}
protected virtual void RegisterDefaultRepositories()
{
if (!Options.RegisterDefaultRepositories)
{
return;
}
foreach (var entityType in GetEntityTypes(Options.OriginalDbContextType))
{
if (!ShouldRegisterDefaultRepositoryFor(entityType))
@ -42,6 +49,17 @@ namespace Volo.Abp.Domain.Repositories
}
}
protected virtual void RegisterSpecifiedDefaultRepositories()
{
foreach (var entityType in Options.SpecifiedDefaultRepositories)
{
if (!Options.CustomRepositories.ContainsKey(entityType))
{
RegisterDefaultRepository(entityType);
}
}
}
protected virtual void RegisterDefaultRepository(Type entityType)
{
Options.Services.AddDefaultRepository(
@ -92,4 +110,4 @@ namespace Volo.Abp.Domain.Repositories
protected abstract Type GetRepositoryType(Type dbContextType, Type entityType, Type primaryKeyType);
}
}
}

54
framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs

@ -189,6 +189,60 @@ namespace Volo.Abp.Domain.Repositories
services.ShouldContainTransient(typeof(IRepository<MyTestEntityWithInt32Pk, int>), typeof(MyTestCustomBaseRepository<MyTestEntityWithInt32Pk, int>));
}
[Fact]
public void Should_Register_Default_Repository()
{
//Arrange
var services = new ServiceCollection();
var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext), services);
options.AddDefaultRepository<MyTestAggregateRootWithGuidPk>();
//Act
new MyTestRepositoryRegistrar(options).AddRepositories();
//MyTestAggregateRootWithoutPk
services.ShouldNotContainService(typeof(IReadOnlyRepository<MyTestAggregateRootWithoutPk>));
services.ShouldNotContainService(typeof(IBasicRepository<MyTestAggregateRootWithoutPk>));
services.ShouldNotContainService(typeof(IRepository<MyTestAggregateRootWithoutPk>));
//MyTestAggregateRootWithGuidPk
services.ShouldContainTransient(typeof(IReadOnlyRepository<MyTestAggregateRootWithGuidPk>), typeof(MyTestDefaultRepository<MyTestAggregateRootWithGuidPk, Guid>));
services.ShouldContainTransient(typeof(IBasicRepository<MyTestAggregateRootWithGuidPk>), typeof(MyTestDefaultRepository<MyTestAggregateRootWithGuidPk, Guid>));
services.ShouldContainTransient(typeof(IRepository<MyTestAggregateRootWithGuidPk>), typeof(MyTestDefaultRepository<MyTestAggregateRootWithGuidPk, Guid>));
services.ShouldContainTransient(typeof(IReadOnlyRepository<MyTestAggregateRootWithGuidPk, Guid>), typeof(MyTestDefaultRepository<MyTestAggregateRootWithGuidPk, Guid>));
services.ShouldContainTransient(typeof(IBasicRepository<MyTestAggregateRootWithGuidPk, Guid>), typeof(MyTestDefaultRepository<MyTestAggregateRootWithGuidPk, Guid>));
services.ShouldContainTransient(typeof(IRepository<MyTestAggregateRootWithGuidPk, Guid>), typeof(MyTestDefaultRepository<MyTestAggregateRootWithGuidPk, Guid>));
}
[Fact]
public void Should_Not_Register_Default_Repository_If_Registered_Custom_Repository()
{
//Arrange
var services = new ServiceCollection();
var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext), services);
options
.AddDefaultRepository<MyTestAggregateRootWithGuidPk>()
.AddRepository<MyTestAggregateRootWithGuidPk, MyTestAggregateRootWithDefaultPkCustomRepository>();;
//Act
new MyTestRepositoryRegistrar(options).AddRepositories();
//MyTestAggregateRootWithGuidPk
services.ShouldContainTransient(typeof(IReadOnlyRepository<MyTestAggregateRootWithGuidPk>), typeof(MyTestAggregateRootWithDefaultPkCustomRepository));
services.ShouldContainTransient(typeof(IBasicRepository<MyTestAggregateRootWithGuidPk>), typeof(MyTestAggregateRootWithDefaultPkCustomRepository));
services.ShouldContainTransient(typeof(IRepository<MyTestAggregateRootWithGuidPk>), typeof(MyTestAggregateRootWithDefaultPkCustomRepository));
services.ShouldContainTransient(typeof(IReadOnlyRepository<MyTestAggregateRootWithGuidPk, Guid>), typeof(MyTestAggregateRootWithDefaultPkCustomRepository));
services.ShouldContainTransient(typeof(IReadOnlyBasicRepository<MyTestAggregateRootWithGuidPk, Guid>), typeof(MyTestAggregateRootWithDefaultPkCustomRepository));
services.ShouldContainTransient(typeof(IBasicRepository<MyTestAggregateRootWithGuidPk, Guid>), typeof(MyTestAggregateRootWithDefaultPkCustomRepository));
services.ShouldContainTransient(typeof(IRepository<MyTestAggregateRootWithGuidPk, Guid>), typeof(MyTestAggregateRootWithDefaultPkCustomRepository));
}
public class MyTestRepositoryRegistrar : RepositoryRegistrarBase<AbpCommonDbContextRegistrationOptions>
{
public MyTestRepositoryRegistrar(AbpCommonDbContextRegistrationOptions options)

2
modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/IAuditLoggingDbContext.cs

@ -7,6 +7,6 @@ namespace Volo.Abp.AuditLogging.EntityFrameworkCore
[ConnectionStringName(AbpAuditLoggingDbProperties.ConnectionStringName)]
public interface IAuditLoggingDbContext : IEfCoreDbContext
{
DbSet<AuditLog> AuditLogs { get; set; }
DbSet<AuditLog> AuditLogs { get; }
}
}

10
modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs

@ -16,14 +16,14 @@ namespace Volo.Blogging.EntityFrameworkCore
{
DbSet<BlogUser> Users { get; }
DbSet<Blog> Blogs { get; set; }
DbSet<Blog> Blogs { get; }
DbSet<Post> Posts { get; set; }
DbSet<Post> Posts { get; }
DbSet<Comment> Comments { get; set; }
DbSet<Comment> Comments { get; }
DbSet<PostTag> PostTags { get; set; }
DbSet<PostTag> PostTags { get; }
DbSet<Tag> Tags { get; set; }
DbSet<Tag> Tags { get; }
}
}

22
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs

@ -16,16 +16,16 @@ namespace Volo.CmsKit.EntityFrameworkCore
[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)]
public interface ICmsKitDbContext : IEfCoreDbContext
{
DbSet<Content> Contents { get; set; }
DbSet<Comment> Comments { get; set; }
DbSet<CmsUser> User { get; set; }
DbSet<UserReaction> Reactions { get; set; }
DbSet<Rating> Ratings { get; set; }
DbSet<Tag> Tags { get; set; }
DbSet<EntityTag> EntityTags { get; set; }
DbSet<Page> Pages { get; set; }
DbSet<Blog> Blogs { get; set; }
DbSet<BlogPost> BlogPosts { get; set; }
DbSet<MediaDescriptor> MediaDescriptors { get; set; }
DbSet<Content> Contents { get; }
DbSet<Comment> Comments { get; }
DbSet<CmsUser> User { get; }
DbSet<UserReaction> Reactions { get; }
DbSet<Rating> Ratings { get; }
DbSet<Tag> Tags { get; }
DbSet<EntityTag> EntityTags { get; }
DbSet<Page> Pages { get; }
DbSet<Blog> Blogs { get; }
DbSet<BlogPost> BlogPosts { get; }
DbSet<MediaDescriptor> MediaDescriptors { get; }
}
}

6
modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/IDocsDbContext.cs

@ -11,10 +11,10 @@ namespace Volo.Docs.EntityFrameworkCore
[ConnectionStringName(DocsDbProperties.ConnectionStringName)]
public interface IDocsDbContext : IEfCoreDbContext
{
DbSet<Project> Projects { get; set; }
DbSet<Project> Projects { get; }
DbSet<Document> Documents { get; set; }
DbSet<Document> Documents { get; }
DbSet<DocumentContributor> DocumentContributors { get; set; }
DbSet<DocumentContributor> DocumentContributors { get; }
}
}

2
modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/IFeatureManagementDbContext.cs

@ -9,6 +9,6 @@ namespace Volo.Abp.FeatureManagement.EntityFrameworkCore
[ConnectionStringName(FeatureManagementDbProperties.ConnectionStringName)]
public interface IFeatureManagementDbContext : IEfCoreDbContext
{
DbSet<FeatureValue> FeatureValues { get; set; }
DbSet<FeatureValue> FeatureValues { get; }
}
}

12
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs

@ -7,16 +7,16 @@ namespace Volo.Abp.Identity.EntityFrameworkCore
[ConnectionStringName(AbpIdentityDbProperties.ConnectionStringName)]
public interface IIdentityDbContext : IEfCoreDbContext
{
DbSet<IdentityUser> Users { get; set; }
DbSet<IdentityUser> Users { get; }
DbSet<IdentityRole> Roles { get; set; }
DbSet<IdentityRole> Roles { get; }
DbSet<IdentityClaimType> ClaimTypes { get; set; }
DbSet<IdentityClaimType> ClaimTypes { get; }
DbSet<OrganizationUnit> OrganizationUnits { get; set; }
DbSet<OrganizationUnit> OrganizationUnits { get; }
DbSet<IdentitySecurityLog> SecurityLogs { get; set; }
DbSet<IdentitySecurityLog> SecurityLogs { get; }
DbSet<IdentityLinkUser> LinkUsers { get; set; }
DbSet<IdentityLinkUser> LinkUsers { get; }
}
}

46
modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs

@ -17,64 +17,64 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore
{
#region ApiResource
DbSet<ApiResource> ApiResources { get; set; }
DbSet<ApiResource> ApiResources { get; }
DbSet<ApiResourceSecret> ApiResourceSecrets { get; set; }
DbSet<ApiResourceSecret> ApiResourceSecrets { get; }
DbSet<ApiResourceClaim> ApiResourceClaims { get; set; }
DbSet<ApiResourceClaim> ApiResourceClaims { get; }
DbSet<ApiResourceScope> ApiResourceScopes { get; set; }
DbSet<ApiResourceScope> ApiResourceScopes { get; }
DbSet<ApiResourceProperty> ApiResourceProperties { get; set; }
DbSet<ApiResourceProperty> ApiResourceProperties { get; }
#endregion
#region ApiScope
DbSet<ApiScope> ApiScopes { get; set; }
DbSet<ApiScope> ApiScopes { get; }
DbSet<ApiScopeClaim> ApiScopeClaims { get; set; }
DbSet<ApiScopeClaim> ApiScopeClaims { get; }
DbSet<ApiScopeProperty> ApiScopeProperties { get; set; }
DbSet<ApiScopeProperty> ApiScopeProperties { get; }
#endregion
#region IdentityResource
DbSet<IdentityResource> IdentityResources { get; set; }
DbSet<IdentityResource> IdentityResources { get; }
DbSet<IdentityResourceClaim> IdentityClaims { get; set; }
DbSet<IdentityResourceClaim> IdentityClaims { get; }
DbSet<IdentityResourceProperty> IdentityResourceProperties { get; set; }
DbSet<IdentityResourceProperty> IdentityResourceProperties { get; }
#endregion
#region Client
DbSet<Client> Clients { get; set; }
DbSet<Client> Clients { get; }
DbSet<ClientGrantType> ClientGrantTypes { get; set; }
DbSet<ClientGrantType> ClientGrantTypes { get; }
DbSet<ClientRedirectUri> ClientRedirectUris { get; set; }
DbSet<ClientRedirectUri> ClientRedirectUris { get; }
DbSet<ClientPostLogoutRedirectUri> ClientPostLogoutRedirectUris { get; set; }
DbSet<ClientPostLogoutRedirectUri> ClientPostLogoutRedirectUris { get; }
DbSet<ClientScope> ClientScopes { get; set; }
DbSet<ClientScope> ClientScopes { get; }
DbSet<ClientSecret> ClientSecrets { get; set; }
DbSet<ClientSecret> ClientSecrets { get; }
DbSet<ClientClaim> ClientClaims { get; set; }
DbSet<ClientClaim> ClientClaims { get; }
DbSet<ClientIdPRestriction> ClientIdPRestrictions { get; set; }
DbSet<ClientIdPRestriction> ClientIdPRestrictions { get; }
DbSet<ClientCorsOrigin> ClientCorsOrigins { get; set; }
DbSet<ClientCorsOrigin> ClientCorsOrigins { get; }
DbSet<ClientProperty> ClientProperties { get; set; }
DbSet<ClientProperty> ClientProperties { get; }
#endregion
DbSet<PersistedGrant> PersistedGrants { get; set; }
DbSet<PersistedGrant> PersistedGrants { get; }
DbSet<DeviceFlowCodes> DeviceFlowCodes { get; set; }
DbSet<DeviceFlowCodes> DeviceFlowCodes { get; }
}
}

2
modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/IPermissionManagementDbContext.cs

@ -7,6 +7,6 @@ namespace Volo.Abp.PermissionManagement.EntityFrameworkCore
[ConnectionStringName(AbpPermissionManagementDbProperties.ConnectionStringName)]
public interface IPermissionManagementDbContext : IEfCoreDbContext
{
DbSet<PermissionGrant> PermissionGrants { get; set; }
DbSet<PermissionGrant> PermissionGrants { get; }
}
}

2
modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo/Abp/SettingManagement/EntityFrameworkCore/ISettingManagementDbContext.cs

@ -9,6 +9,6 @@ namespace Volo.Abp.SettingManagement.EntityFrameworkCore
[ConnectionStringName(AbpSettingManagementDbProperties.ConnectionStringName)]
public interface ISettingManagementDbContext : IEfCoreDbContext
{
DbSet<Setting> Settings { get; set; }
DbSet<Setting> Settings { get; }
}
}

4
modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/ITenantManagementDbContext.cs

@ -9,8 +9,8 @@ namespace Volo.Abp.TenantManagement.EntityFrameworkCore
[ConnectionStringName(AbpTenantManagementDbProperties.ConnectionStringName)]
public interface ITenantManagementDbContext : IEfCoreDbContext
{
DbSet<Tenant> Tenants { get; set; }
DbSet<Tenant> Tenants { get; }
DbSet<TenantConnectionString> TenantConnectionStrings { get; set; }
DbSet<TenantConnectionString> TenantConnectionStrings { get; }
}
}

4
npm/ng-packs/apps/dev-app/src/environments/environment.ts

@ -38,5 +38,9 @@ export const environment = {
url: 'https://localhost:44305',
rootNamespace: 'Volo.Abp',
},
AbpSettingManagement: {
url: 'https://localhost:44305',
rootNamespace: 'Volo.Abp.SettingManagement',
},
},
} as Environment;

68
npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html

@ -0,0 +1,68 @@
<h2>{{ 'AbpSettingManagement::Menu:Emailing' | abpLocalization }}</h2>
<hr class="my-3" />
<form *ngIf="form" [formGroup]="form" (ngSubmit)="submit()" validateOnSubmit>
<div class="form-group">
<label>{{ 'AbpSettingManagement::DefaultFromDisplayName' | abpLocalization }}</label>
<input type="text" class="form-control" formControlName="defaultFromDisplayName" />
</div>
<div class="form-group">
<label>{{ 'AbpSettingManagement::DefaultFromAddress' | abpLocalization }}</label>
<input type="text" class="form-control" formControlName="defaultFromAddress" />
</div>
<div class="form-group">
<label>{{ 'AbpSettingManagement::SmtpHost' | abpLocalization }}</label>
<input type="text" class="form-control" formControlName="smtpHost" />
</div>
<div class="form-group">
<label>{{ 'AbpSettingManagement::SmtpPort' | abpLocalization }}</label>
<input type="number" class="form-control" formControlName="smtpPort" />
</div>
<div class="custom-checkbox custom-control mb-2">
<input
type="checkbox"
id="smtp-enable-ssl"
class="custom-control-input"
formControlName="smtpEnableSsl"
/>
<label class="custom-control-label" for="smtp-enable-ssl">{{
'AbpSettingManagement::SmtpEnableSsl' | abpLocalization
}}</label>
</div>
<div class="custom-checkbox custom-control mb-2">
<input
type="checkbox"
id="smtp-use-default-credentials"
class="custom-control-input"
formControlName="smtpUseDefaultCredentials"
/>
<label class="custom-control-label" for="smtp-use-default-credentials">{{
'AbpSettingManagement::SmtpUseDefaultCredentials' | abpLocalization
}}</label>
</div>
<div [@collapse]="form.get('smtpUseDefaultCredentials').value ? 'collapsed' : 'expanded'">
<div class="form-group">
<label>{{ 'AbpSettingManagement::SmtpDomain' | abpLocalization }}</label>
<input type="text" class="form-control" formControlName="smtpDomain" />
</div>
<div class="form-group">
<label>{{ 'AbpSettingManagement::SmtpUserName' | abpLocalization }}</label>
<input type="text" class="form-control" formControlName="smtpUserName" />
</div>
<div class="form-group">
<label>{{ 'AbpSettingManagement::SmtpPassword' | abpLocalization }}</label>
<input type="text" class="form-control" formControlName="smtpPassword" />
</div>
</div>
<hr />
<button type="submit" class="btn btn-primary">
{{ 'AbpSettingManagement::Save' | abpLocalization }}
</button>
</form>

60
npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.ts

@ -0,0 +1,60 @@
import { collapse, ToasterService } from '@abp/ng.theme.shared';
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { finalize } from 'rxjs/operators';
import { EmailSettingsService } from '../../proxy/email-settings.service';
import { EmailSettingsDto } from '../../proxy/models';
@Component({
selector: 'abp-email-setting-group',
templateUrl: 'email-setting-group.component.html',
animations: [collapse],
})
export class EmailSettingGroupComponent implements OnInit {
form: FormGroup;
saving = false;
constructor(
private emailSettingsService: EmailSettingsService,
private fb: FormBuilder,
private toasterService: ToasterService,
) {}
ngOnInit() {
this.getData();
}
private getData() {
this.emailSettingsService.get().subscribe(res => {
this.buildForm(res);
});
}
private buildForm(emailSettings: EmailSettingsDto) {
this.form = this.fb.group({
defaultFromDisplayName: [emailSettings.defaultFromDisplayName, [Validators.required]],
defaultFromAddress: [emailSettings.defaultFromAddress, [Validators.required]],
smtpHost: [emailSettings.smtpHost],
smtpPort: [emailSettings.smtpPort, [Validators.required]],
smtpEnableSsl: [emailSettings.smtpEnableSsl],
smtpUseDefaultCredentials: [emailSettings.smtpUseDefaultCredentials],
smtpDomain: [emailSettings.smtpDomain],
smtpUserName: [emailSettings.smtpUserName],
smtpPassword: [emailSettings.smtpPassword],
});
}
submit() {
if (this.saving || this.form.invalid) return;
this.saving = true;
this.emailSettingsService
.update(this.form.value)
.pipe(finalize(() => (this.saving = false)))
.subscribe(() => {
this.toasterService.success('AbpSettingManagement::SuccessfullySaved');
this.getData();
});
}
}

1
npm/ng-packs/packages/setting-management/config/src/enums/index.ts

@ -1 +1,2 @@
export * from './route-names';
export * from './setting-tab-names';

3
npm/ng-packs/packages/setting-management/config/src/enums/setting-tab-names.ts

@ -0,0 +1,3 @@
export const enum eSettingManamagementSettingTabNames {
EmailSettingGroup = 'AbpSettingManagement::Menu:Emailing',
}

1
npm/ng-packs/packages/setting-management/config/src/providers/index.ts

@ -1 +1,2 @@
export * from './route.provider';
export * from './setting-tab.provider';

26
npm/ng-packs/packages/setting-management/config/src/providers/setting-tab.provider.ts

@ -0,0 +1,26 @@
import { SettingTabsService } from '@abp/ng.core';
import { APP_INITIALIZER } from '@angular/core';
import { EmailSettingGroupComponent } from '../components/email-setting-group/email-setting-group.component';
import { eSettingManamagementSettingTabNames } from '../enums/setting-tab-names';
export const SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS = [
{
provide: APP_INITIALIZER,
useFactory: configureSettingTabs,
deps: [SettingTabsService],
multi: true,
},
];
export function configureSettingTabs(settingTabs: SettingTabsService) {
return () => {
settingTabs.add([
{
name: eSettingManamagementSettingTabNames.EmailSettingGroup,
order: 1,
requiredPolicy: 'SettingManagement.Emailing',
component: EmailSettingGroupComponent,
},
]);
};
}

17
npm/ng-packs/packages/setting-management/config/src/proxy/README.md

@ -0,0 +1,17 @@
# Proxy Generation Output
This directory includes the output of the latest proxy generation.
The files and folders in it will be overwritten when proxy generation is run again.
Therefore, please do not place your own content in this folder.
In addition, `generate-proxy.json` works like a lock file.
It includes information used by the proxy generator, so please do not delete or modify it.
Finally, the name of the files and folders should not be changed for two reasons:
- Proxy generator will keep creating them at those paths and you will have multiple copies of the same content.
- ABP Suite generates files which include imports from this folder.
> **Important Notice:** If you are building a module and are planning to publish to npm,
> some of the generated proxies are likely to be exported from public-api.ts file. In such a case,
> please make sure you export files directly and not from barrel exports. In other words,
> do not include index.ts exports in your public-api.ts exports.

27
npm/ng-packs/packages/setting-management/config/src/proxy/email-settings.service.ts

@ -0,0 +1,27 @@
import type { EmailSettingsDto, UpdateEmailSettingsDto } from './models';
import { RestService } from '@abp/ng.core';
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class EmailSettingsService {
apiName = 'SettingManagement';
get = () =>
this.restService.request<any, EmailSettingsDto>({
method: 'GET',
url: '/api/setting-management/emailing',
},
{ apiName: this.apiName });
update = (input: UpdateEmailSettingsDto) =>
this.restService.request<any, void>({
method: 'POST',
url: '/api/setting-management/emailing',
body: input,
},
{ apiName: this.apiName });
constructor(private restService: RestService) {}
}

4745
npm/ng-packs/packages/setting-management/config/src/proxy/generate-proxy.json

File diff suppressed because it is too large

2
npm/ng-packs/packages/setting-management/config/src/proxy/index.ts

@ -0,0 +1,2 @@
export * from './email-settings.service';
export * from './models';

24
npm/ng-packs/packages/setting-management/config/src/proxy/models.ts

@ -0,0 +1,24 @@
export interface EmailSettingsDto {
smtpHost?: string;
smtpPort: number;
smtpUserName?: string;
smtpPassword?: string;
smtpDomain?: string;
smtpEnableSsl: boolean;
smtpUseDefaultCredentials: boolean;
defaultFromAddress?: string;
defaultFromDisplayName?: string;
}
export interface UpdateEmailSettingsDto {
smtpHost?: string;
smtpPort: number;
smtpUserName?: string;
smtpPassword?: string;
smtpDomain?: string;
smtpEnableSsl: boolean;
smtpUseDefaultCredentials: boolean;
defaultFromAddress: string;
defaultFromDisplayName: string;
}

2
npm/ng-packs/packages/setting-management/config/src/public-api.ts

@ -1,3 +1,5 @@
export * from './enums';
export * from './providers';
export * from './setting-management-config.module';
export * from './proxy';
export * from './components/email-setting-group/email-setting-group.component';

12
npm/ng-packs/packages/setting-management/config/src/setting-management-config.module.ts

@ -1,12 +1,20 @@
import { ModuleWithProviders, NgModule } from '@angular/core';
import { CoreModule } from '@abp/ng.core';
import { EmailSettingGroupComponent } from './components/email-setting-group/email-setting-group.component';
import { SETTING_MANAGEMENT_ROUTE_PROVIDERS } from './providers/route.provider';
import { SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS } from './providers/setting-tab.provider';
import { NgxValidateCoreModule } from '@ngx-validate/core';
@NgModule()
@NgModule({
imports: [CoreModule, NgxValidateCoreModule],
declarations: [EmailSettingGroupComponent],
exports: [EmailSettingGroupComponent],
})
export class SettingManagementConfigModule {
static forRoot(): ModuleWithProviders<SettingManagementConfigModule> {
return {
ngModule: SettingManagementConfigModule,
providers: [SETTING_MANAGEMENT_ROUTE_PROVIDERS],
providers: [SETTING_MANAGEMENT_ROUTE_PROVIDERS, SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS],
};
}
}

4
npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts

@ -138,4 +138,8 @@ background-color: rgba(0, 0, 0, 0.6);
border-top: 1px solid #eee;
margin-top: -1px;
}
.breadcrumb {
background-color: transparent;
padding: 0.27rem;
}
`;

Loading…
Cancel
Save