From 28da906e75f86f7dcf875ab11d76ecede775ee5f Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 30 Dec 2020 17:09:56 +0800 Subject: [PATCH 001/188] Add NormalizeContainerName method --- .../BlobStoring/Aliyun/AliyunBlobProvider.cs | 11 ++++--- .../Abp/BlobStoring/Aws/AwsBlobProvider.cs | 14 +++++---- .../BlobStoring/Azure/AzureBlobProvider.cs | 12 ++++---- ...nioBlobContainerConfigurationExtensions.cs | 1 + .../BlobStoring/Minio/MinioBlobProvider.cs | 10 ++++--- .../Volo/Abp/BlobStoring/BlobProviderBase.cs | 29 +++++++++++++++++-- 6 files changed, 57 insertions(+), 20 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs index d6c9303afd..199c343659 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs +++ b/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 IServiceProvider ServiceProvider { get; } public AliyunBlobProvider( IOssClientFactory ossClientFactory, - IAliyunBlobNameCalculator aliyunBlobNameCalculator) + IAliyunBlobNameCalculator aliyunBlobNameCalculator, + IServiceProvider serviceProvider) { OssClientFactory = ossClientFactory; AliyunBlobNameCalculator = aliyunBlobNameCalculator; + ServiceProvider = serviceProvider; } 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; + : NormalizeContainerName(args, ServiceProvider, 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) && diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs index 191f9a0ac7..dbf2ce3848 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs +++ b/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 IServiceProvider ServiceProvider { get; } - public AwsBlobProvider(IAwsBlobNameCalculator awsBlobNameCalculator, - IAmazonS3ClientFactory amazonS3ClientFactory) + public AwsBlobProvider( + IAwsBlobNameCalculator awsBlobNameCalculator, + IAmazonS3ClientFactory amazonS3ClientFactory, + IServiceProvider serviceProvider) { AwsBlobNameCalculator = awsBlobNameCalculator; AmazonS3ClientFactory = amazonS3ClientFactory; + ServiceProvider = serviceProvider; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -111,7 +115,7 @@ namespace Volo.Abp.BlobStoring.Aws return await AmazonS3ClientFactory.GetAmazonS3Client(configuration); } - private async Task BlobExistsAsync(AmazonS3Client amazonS3Client, string containerName, string blobName) + protected virtual async Task 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; + : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs index 3a9a062e76..58780c17b6 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs @@ -9,10 +9,12 @@ namespace Volo.Abp.BlobStoring.Azure public class AzureBlobProvider : BlobProviderBase, ITransientDependency { protected IAzureBlobNameCalculator AzureBlobNameCalculator { get; } + protected IServiceProvider ServiceProvider { get; } - public AzureBlobProvider(IAzureBlobNameCalculator azureBlobNameCalculator) + public AzureBlobProvider(IAzureBlobNameCalculator azureBlobNameCalculator, IServiceProvider serviceProvider) { AzureBlobNameCalculator = azureBlobNameCalculator; + ServiceProvider = serviceProvider; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -87,22 +89,22 @@ namespace Volo.Abp.BlobStoring.Azure await blobContainerClient.CreateIfNotExistsAsync(); } - private async Task BlobExistsAsync(BlobProviderArgs args, string blobName) + protected virtual async Task 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; + : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); } - private static async Task ContainerExistsAsync(BlobContainerClient blobContainerClient) + protected virtual async Task ContainerExistsAsync(BlobContainerClient blobContainerClient) { return (await blobContainerClient.ExistsAsync()).Value; } diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs index 3465914156..1449623ef4 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs @@ -15,6 +15,7 @@ namespace Volo.Abp.BlobStoring.Minio Action minioConfigureAction) { containerConfiguration.ProviderType = typeof(MinioBlobProvider); + containerConfiguration.NamingNormalizers.TryAdd(); minioConfigureAction(new MinioBlobProviderConfiguration(containerConfiguration)); diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index fca23324dc..f8f1a1e880 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -10,10 +10,12 @@ namespace Volo.Abp.BlobStoring.Minio public class MinioBlobProvider : BlobProviderBase, ITransientDependency { protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; } + protected IServiceProvider ServiceProvider { get; } - public MinioBlobProvider(IMinioBlobNameCalculator minioBlobNameCalculator) + public MinioBlobProvider(IMinioBlobNameCalculator minioBlobNameCalculator, IServiceProvider serviceProvider) { MinioBlobNameCalculator = minioBlobNameCalculator; + ServiceProvider = serviceProvider; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -108,7 +110,7 @@ namespace Volo.Abp.BlobStoring.Minio } } - private async Task BlobExistsAsync(MinioClient client, string containerName , string blobName) + protected virtual async Task BlobExistsAsync(MinioClient client, string containerName , string blobName) { // Make sure Blob Container exists. if (await client.BucketExistsAsync(containerName)) @@ -133,13 +135,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; + : NormalizeContainerName(args, ServiceProvider, configuration.BucketName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs index b1aafb6903..e0a798a7bb 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs @@ -1,5 +1,8 @@ -using System.IO; +using System; +using System.IO; +using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.BlobStoring { @@ -12,5 +15,27 @@ namespace Volo.Abp.BlobStoring public abstract Task ExistsAsync(BlobProviderExistsArgs args); public abstract Task GetOrNullAsync(BlobProviderGetArgs args); + + protected string NormalizeContainerName(BlobProviderArgs args, IServiceProvider serviceProvider, string containerName) + { + if (!args.Configuration.NamingNormalizers.Any()) + { + return containerName; + } + + using (var scope = serviceProvider.CreateScope()) + { + foreach (var normalizerType in args.Configuration.NamingNormalizers) + { + var normalizer = scope.ServiceProvider + .GetRequiredService(normalizerType) + .As(); + + containerName = normalizer.NormalizeContainerName(containerName); + } + + return containerName; + } + } } -} \ No newline at end of file +} From e457a7ede0ac34bdbd94d4fa96adf55b5c4b87b0 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 30 Dec 2020 17:37:34 +0800 Subject: [PATCH 002/188] Improved --- .../Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs | 2 +- .../Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs | 2 +- .../Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs | 2 +- .../Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs index 276cbd8fc7..6b83d9f7a9 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs +++ b/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(AliyunBlobProviderConfigurationNames.ContainerName); - set => _containerConfiguration.SetConfiguration(AliyunBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value))); + set => _containerConfiguration.SetConfiguration(AliyunBlobProviderConfigurationNames.ContainerName, value); } /// diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs index 2be373e428..86d127c0d9 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs +++ b/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(AwsBlobProviderConfigurationNames.ContainerName); - set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value))); + set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.ContainerName, value); } /// diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs index 969057d7d6..8b409e008b 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs @@ -17,7 +17,7 @@ public string ContainerName { get => _containerConfiguration.GetConfigurationOrDefault(AzureBlobProviderConfigurationNames.ContainerName); - set => _containerConfiguration.SetConfiguration(AzureBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value))); + set => _containerConfiguration.SetConfiguration(AzureBlobProviderConfigurationNames.ContainerName, value); } /// diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs index 395aa76a72..fb510843e2 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs @@ -5,7 +5,7 @@ public string BucketName { get => _containerConfiguration.GetConfigurationOrDefault(MinioBlobProviderConfigurationNames.BucketName); - set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.BucketName, Check.NotNullOrWhiteSpace(value, nameof(value))); + set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.BucketName, value); } /// From 26fb70beee671bb273fcab961e6ff0bc1b14e5eb Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 30 Dec 2020 18:12:46 +0800 Subject: [PATCH 003/188] Make NormalizeContainerName mehtod virtual --- .../Volo/Abp/BlobStoring/BlobProviderBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs index e0a798a7bb..d96b6fa94b 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs @@ -16,7 +16,7 @@ namespace Volo.Abp.BlobStoring public abstract Task GetOrNullAsync(BlobProviderGetArgs args); - protected string NormalizeContainerName(BlobProviderArgs args, IServiceProvider serviceProvider, string containerName) + protected virtual string NormalizeContainerName(BlobProviderArgs args, IServiceProvider serviceProvider, string containerName) { if (!args.Configuration.NamingNormalizers.Any()) { From 69a613d3f74b6d9ca4c0dfbfc066af55ef6ab0fe Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 14 Jan 2021 12:11:38 +0800 Subject: [PATCH 004/188] Add IBlobNormalizeNamingFactory --- .../BlobStoring/Aliyun/AliyunBlobProvider.cs | 8 +-- .../Abp/BlobStoring/Aws/AwsBlobProvider.cs | 8 +-- .../BlobStoring/Azure/AzureBlobProvider.cs | 10 +-- .../BlobStoring/Minio/MinioBlobProvider.cs | 10 +-- .../Volo/Abp/BlobStoring/BlobContainer.cs | 37 +++-------- .../Abp/BlobStoring/BlobContainerFactory.cs | 7 +- .../BlobStoring/BlobNormalizeNamingFactory.cs | 64 +++++++++++++++++++ .../Volo/Abp/BlobStoring/BlobProviderBase.cs | 27 +------- .../IBlobNormalizeNamingFactory.cs | 11 ++++ 9 files changed, 110 insertions(+), 72 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs index 199c343659..52d8674c67 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs @@ -10,16 +10,16 @@ namespace Volo.Abp.BlobStoring.Aliyun { protected IOssClientFactory OssClientFactory { get; } protected IAliyunBlobNameCalculator AliyunBlobNameCalculator { get; } - protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } public AliyunBlobProvider( IOssClientFactory ossClientFactory, IAliyunBlobNameCalculator aliyunBlobNameCalculator, - IServiceProvider serviceProvider) + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { OssClientFactory = ossClientFactory; AliyunBlobNameCalculator = aliyunBlobNameCalculator; - ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } protected virtual IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration) @@ -96,7 +96,7 @@ namespace Volo.Abp.BlobStoring.Aliyun var configuration = args.Configuration.GetAliyunConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); + : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); } protected virtual bool BlobExists(IOss ossClient,string containerName, string blobName) diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs index dbf2ce3848..991be2b37c 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs @@ -12,16 +12,16 @@ namespace Volo.Abp.BlobStoring.Aws { protected IAwsBlobNameCalculator AwsBlobNameCalculator { get; } protected IAmazonS3ClientFactory AmazonS3ClientFactory { get; } - protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } public AwsBlobProvider( IAwsBlobNameCalculator awsBlobNameCalculator, IAmazonS3ClientFactory amazonS3ClientFactory, - IServiceProvider serviceProvider) + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { AwsBlobNameCalculator = awsBlobNameCalculator; AmazonS3ClientFactory = amazonS3ClientFactory; - ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -156,7 +156,7 @@ namespace Volo.Abp.BlobStoring.Aws var configuration = args.Configuration.GetAwsConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); + : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs index 58780c17b6..8e401b73c7 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs @@ -9,12 +9,14 @@ namespace Volo.Abp.BlobStoring.Azure public class AzureBlobProvider : BlobProviderBase, ITransientDependency { protected IAzureBlobNameCalculator AzureBlobNameCalculator { get; } - protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } - public AzureBlobProvider(IAzureBlobNameCalculator azureBlobNameCalculator, IServiceProvider serviceProvider) + public AzureBlobProvider( + IAzureBlobNameCalculator azureBlobNameCalculator, + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { AzureBlobNameCalculator = azureBlobNameCalculator; - ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -101,7 +103,7 @@ namespace Volo.Abp.BlobStoring.Azure var configuration = args.Configuration.GetAzureConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); + : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); } protected virtual async Task ContainerExistsAsync(BlobContainerClient blobContainerClient) diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index f8f1a1e880..a182478017 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -10,12 +10,14 @@ namespace Volo.Abp.BlobStoring.Minio public class MinioBlobProvider : BlobProviderBase, ITransientDependency { protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; } - protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } - public MinioBlobProvider(IMinioBlobNameCalculator minioBlobNameCalculator, IServiceProvider serviceProvider) + public MinioBlobProvider( + IMinioBlobNameCalculator minioBlobNameCalculator, + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { MinioBlobNameCalculator = minioBlobNameCalculator; - ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -141,7 +143,7 @@ namespace Volo.Abp.BlobStoring.Minio return configuration.BucketName.IsNullOrWhiteSpace() ? args.ContainerName - : NormalizeContainerName(args, ServiceProvider, configuration.BucketName); + : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.BucketName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs index cd2287e964..a95cdcadbe 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs +++ b/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 IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + public BlobContainer( string containerName, BlobContainerConfiguration configuration, IBlobProvider provider, ICurrentTenant currentTenant, ICancellationTokenProvider cancellationTokenProvider, + IBlobNormalizeNamingFactory blobNormalizeNamingFactory, IServiceProvider serviceProvider) { ContainerName = containerName; @@ -101,6 +102,7 @@ namespace Volo.Abp.BlobStoring Provider = provider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; ServiceProvider = serviceProvider; } @@ -112,7 +114,7 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = NormalizeNaming(ContainerName, name); + var (normalizedContainerName, normalizedBlobName) = BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); await Provider.SaveAsync( new BlobProviderSaveArgs( @@ -134,7 +136,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeNaming(ContainerName, name); + BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); return await Provider.DeleteAsync( new BlobProviderDeleteArgs( @@ -154,7 +156,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeNaming(ContainerName, name); + BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); return await Provider.ExistsAsync( new BlobProviderExistsArgs( @@ -190,7 +192,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeNaming(ContainerName, name); + BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); return await Provider.GetOrNullAsync( new BlobProviderGetArgs( @@ -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(); - - containerName = normalizer.NormalizeContainerName(containerName); - blobName = normalizer.NormalizeBlobName(blobName); - } - - return (containerName, blobName); - } - } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs index 7a4da39ef9..8013762164 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -17,18 +17,22 @@ namespace Volo.Abp.BlobStoring protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + public BlobContainerFactory( IBlobContainerConfigurationProvider configurationProvider, ICurrentTenant currentTenant, ICancellationTokenProvider cancellationTokenProvider, IBlobProviderSelector providerSelector, - IServiceProvider serviceProvider) + IServiceProvider serviceProvider, + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { ConfigurationProvider = configurationProvider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; ProviderSelector = providerSelector; ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } public virtual IBlobContainer Create(string name) @@ -41,6 +45,7 @@ namespace Volo.Abp.BlobStoring ProviderSelector.Get(name), CurrentTenant, CancellationTokenProvider, + BlobNormalizeNamingFactory, ServiceProvider ); } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs new file mode 100644 index 0000000000..cafba9bec2 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs @@ -0,0 +1,64 @@ +using System; +using System.Linq; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlobStoring +{ + public class BlobNormalizeNamingFactory : IBlobNormalizeNamingFactory, ITransientDependency + { + protected IServiceProvider ServiceProvider { get; } + + public BlobNormalizeNamingFactory(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + } + + public (string containerName, string blobName) NormalizeNaming( + BlobContainerConfiguration configuration, + 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(); + + containerName = containerName.IsNullOrWhiteSpace()? containerName: normalizer.NormalizeContainerName(containerName); + blobName = blobName.IsNullOrWhiteSpace()? blobName: normalizer.NormalizeBlobName(blobName); + } + + return (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; + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs index d96b6fa94b..ea2bd1ed72 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs @@ -1,8 +1,5 @@ -using System; -using System.IO; -using System.Linq; +using System.IO; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.BlobStoring { @@ -15,27 +12,5 @@ namespace Volo.Abp.BlobStoring public abstract Task ExistsAsync(BlobProviderExistsArgs args); public abstract Task GetOrNullAsync(BlobProviderGetArgs args); - - protected virtual string NormalizeContainerName(BlobProviderArgs args, IServiceProvider serviceProvider, string containerName) - { - if (!args.Configuration.NamingNormalizers.Any()) - { - return containerName; - } - - using (var scope = serviceProvider.CreateScope()) - { - foreach (var normalizerType in args.Configuration.NamingNormalizers) - { - var normalizer = scope.ServiceProvider - .GetRequiredService(normalizerType) - .As(); - - containerName = normalizer.NormalizeContainerName(containerName); - } - - return containerName; - } - } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs new file mode 100644 index 0000000000..281196051d --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.BlobStoring +{ + public interface IBlobNormalizeNamingFactory + { + (string containerName, string blobName) NormalizeNaming(BlobContainerConfiguration configuration, string containerName, string blobName); + + string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName); + + string NormalizeBlobName(BlobContainerConfiguration configuration, string blobName); + } +} From d980ca961dfe4ea08c5986f123212ba8f986c003 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 14 Jan 2021 13:46:09 +0800 Subject: [PATCH 005/188] Rename IBlobNormalizeNamingFactory to IBlobNormalizeNamingService --- .../BlobStoring/Aliyun/AliyunBlobProvider.cs | 8 ++--- .../Abp/BlobStoring/Aws/AwsBlobProvider.cs | 8 ++--- .../BlobStoring/Azure/AzureBlobProvider.cs | 8 ++--- .../BlobStoring/Minio/MinioBlobProvider.cs | 8 ++--- .../Volo/Abp/BlobStoring/BlobContainer.cs | 36 +++++++++---------- .../Abp/BlobStoring/BlobContainerFactory.cs | 8 ++--- .../Abp/BlobStoring/BlobNormalizeNaming.cs | 15 ++++++++ ...ctory.cs => BlobNormalizeNamingService.cs} | 14 ++++---- ...tory.cs => IBlobNormalizeNamingService.cs} | 4 +-- 9 files changed, 62 insertions(+), 47 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{BlobNormalizeNamingFactory.cs => BlobNormalizeNamingService.cs} (81%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{IBlobNormalizeNamingFactory.cs => IBlobNormalizeNamingService.cs} (55%) diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs index 52d8674c67..b06377245c 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs @@ -10,16 +10,16 @@ namespace Volo.Abp.BlobStoring.Aliyun { protected IOssClientFactory OssClientFactory { get; } protected IAliyunBlobNameCalculator AliyunBlobNameCalculator { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public AliyunBlobProvider( IOssClientFactory ossClientFactory, IAliyunBlobNameCalculator aliyunBlobNameCalculator, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { OssClientFactory = ossClientFactory; AliyunBlobNameCalculator = aliyunBlobNameCalculator; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } protected virtual IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration) @@ -96,7 +96,7 @@ namespace Volo.Abp.BlobStoring.Aliyun var configuration = args.Configuration.GetAliyunConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); + : BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName); } protected virtual bool BlobExists(IOss ossClient,string containerName, string blobName) diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs index 991be2b37c..939e91f4ef 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs @@ -12,16 +12,16 @@ namespace Volo.Abp.BlobStoring.Aws { protected IAwsBlobNameCalculator AwsBlobNameCalculator { get; } protected IAmazonS3ClientFactory AmazonS3ClientFactory { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public AwsBlobProvider( IAwsBlobNameCalculator awsBlobNameCalculator, IAmazonS3ClientFactory amazonS3ClientFactory, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { AwsBlobNameCalculator = awsBlobNameCalculator; AmazonS3ClientFactory = amazonS3ClientFactory; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -156,7 +156,7 @@ namespace Volo.Abp.BlobStoring.Aws var configuration = args.Configuration.GetAwsConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); + : BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs index 8e401b73c7..b43e7eb030 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs @@ -9,14 +9,14 @@ namespace Volo.Abp.BlobStoring.Azure public class AzureBlobProvider : BlobProviderBase, ITransientDependency { protected IAzureBlobNameCalculator AzureBlobNameCalculator { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public AzureBlobProvider( IAzureBlobNameCalculator azureBlobNameCalculator, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { AzureBlobNameCalculator = azureBlobNameCalculator; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -103,7 +103,7 @@ namespace Volo.Abp.BlobStoring.Azure var configuration = args.Configuration.GetAzureConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); + : BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName); } protected virtual async Task ContainerExistsAsync(BlobContainerClient blobContainerClient) diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index a182478017..057e4ea0ba 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -10,14 +10,14 @@ namespace Volo.Abp.BlobStoring.Minio public class MinioBlobProvider : BlobProviderBase, ITransientDependency { protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public MinioBlobProvider( IMinioBlobNameCalculator minioBlobNameCalculator, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { MinioBlobNameCalculator = minioBlobNameCalculator; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -143,7 +143,7 @@ namespace Volo.Abp.BlobStoring.Minio return configuration.BucketName.IsNullOrWhiteSpace() ? args.ContainerName - : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.BucketName); + : BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.BucketName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs index a95cdcadbe..c4d45b840a 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs @@ -86,7 +86,7 @@ namespace Volo.Abp.BlobStoring protected IServiceProvider ServiceProvider { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public BlobContainer( string containerName, @@ -94,7 +94,7 @@ namespace Volo.Abp.BlobStoring IBlobProvider provider, ICurrentTenant currentTenant, ICancellationTokenProvider cancellationTokenProvider, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory, + IBlobNormalizeNamingService blobNormalizeNamingService, IServiceProvider serviceProvider) { ContainerName = containerName; @@ -102,7 +102,7 @@ namespace Volo.Abp.BlobStoring Provider = provider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; ServiceProvider = serviceProvider; } @@ -114,13 +114,13 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = BlobNormalizeNamingFactory.NormalizeNaming(Configuration, 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) @@ -135,14 +135,14 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = - BlobNormalizeNamingFactory.NormalizeNaming(Configuration, 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) ) ); @@ -155,14 +155,14 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = - BlobNormalizeNamingFactory.NormalizeNaming(Configuration, 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) ) ); @@ -191,14 +191,14 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = - BlobNormalizeNamingFactory.NormalizeNaming(Configuration, 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) ) ); diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs index 8013762164..0672554506 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.BlobStoring protected IServiceProvider ServiceProvider { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public BlobContainerFactory( IBlobContainerConfigurationProvider configurationProvider, @@ -25,14 +25,14 @@ namespace Volo.Abp.BlobStoring ICancellationTokenProvider cancellationTokenProvider, IBlobProviderSelector providerSelector, IServiceProvider serviceProvider, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { ConfigurationProvider = configurationProvider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; ProviderSelector = providerSelector; ServiceProvider = serviceProvider; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } public virtual IBlobContainer Create(string name) @@ -45,7 +45,7 @@ namespace Volo.Abp.BlobStoring ProviderSelector.Get(name), CurrentTenant, CancellationTokenProvider, - BlobNormalizeNamingFactory, + BlobNormalizeNamingService, ServiceProvider ); } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs new file mode 100644 index 0000000000..e7ad89425b --- /dev/null +++ b/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; + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs similarity index 81% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs index cafba9bec2..b2e057032a 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs @@ -5,16 +5,16 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.BlobStoring { - public class BlobNormalizeNamingFactory : IBlobNormalizeNamingFactory, ITransientDependency + public class BlobNormalizeNamingService : IBlobNormalizeNamingService, ITransientDependency { protected IServiceProvider ServiceProvider { get; } - public BlobNormalizeNamingFactory(IServiceProvider serviceProvider) + public BlobNormalizeNamingService(IServiceProvider serviceProvider) { ServiceProvider = serviceProvider; } - public (string containerName, string blobName) NormalizeNaming( + public BlobNormalizeNaming NormalizeNaming( BlobContainerConfiguration configuration, string containerName, string blobName) @@ -22,7 +22,7 @@ namespace Volo.Abp.BlobStoring if (!configuration.NamingNormalizers.Any()) { - return (containerName, blobName); + return new BlobNormalizeNaming(containerName, blobName); } using (var scope = ServiceProvider.CreateScope()) @@ -37,7 +37,7 @@ namespace Volo.Abp.BlobStoring blobName = blobName.IsNullOrWhiteSpace()? blobName: normalizer.NormalizeBlobName(blobName); } - return (containerName, blobName); + return new BlobNormalizeNaming(containerName, blobName); } } @@ -48,7 +48,7 @@ namespace Volo.Abp.BlobStoring return containerName; } - return NormalizeNaming(configuration, containerName, null).containerName; + return NormalizeNaming(configuration, containerName, null).ContainerName; } public string NormalizeBlobName(BlobContainerConfiguration configuration, string blobName) @@ -58,7 +58,7 @@ namespace Volo.Abp.BlobStoring return blobName; } - return NormalizeNaming(configuration, null, blobName).blobName; + return NormalizeNaming(configuration, null, blobName).BlobName; } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingService.cs similarity index 55% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingService.cs index 281196051d..fecb75ef6a 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingService.cs @@ -1,8 +1,8 @@ namespace Volo.Abp.BlobStoring { - public interface IBlobNormalizeNamingFactory + public interface IBlobNormalizeNamingService { - (string containerName, string blobName) NormalizeNaming(BlobContainerConfiguration configuration, string containerName, string blobName); + BlobNormalizeNaming NormalizeNaming(BlobContainerConfiguration configuration, string containerName, string blobName); string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName); From b551e42fc98536d3c8062ed215e6ec648e83b756 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Fri, 15 Jan 2021 11:32:26 +0100 Subject: [PATCH 006/188] language selector should use whole row without version selector --- .../docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index 1cdfe7ca2e..dc1ca956ed 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -126,7 +126,7 @@ @if (Model.LanguageSelectListItems.Count > 1) { -
+
From 7120c35161b94ebde819a6558365b90e34104b00 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Mon, 18 Jan 2021 07:45:45 +0100 Subject: [PATCH 007/188] consolidated duplicate `if` --- .../docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index dc1ca956ed..b6a33ec2ad 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -126,7 +126,7 @@ @if (Model.LanguageSelectListItems.Count > 1) { -
+
From 21bc0bdc1171f9aca8e257693ca8bce9a215b202 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 9 Feb 2021 17:54:03 +0800 Subject: [PATCH 008/188] Add AddDefaultRepository method --- .../AbpCommonDbContextRegistrationOptions.cs | 22 +++++++- ...mmonDbContextRegistrationOptionsBuilder.cs | 14 +++++ .../Repositories/RepositoryRegistrarBase.cs | 16 +++++- .../RepositoryRegistration_Tests.cs | 54 +++++++++++++++++++ 4 files changed, 103 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs index dbd46811f2..babe1da1f9 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs @@ -29,6 +29,8 @@ namespace Volo.Abp.DependencyInjection public Dictionary CustomRepositories { get; } + public List DefaultRepositories { 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(); ReplacedDbContextTypes = new List(); + DefaultRepositories = new List(); } public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext() @@ -82,6 +85,23 @@ namespace Volo.Abp.DependencyInjection return AddDefaultRepositories(typeof(TDefaultRepositoryDbContext), includeAllEntities); } + public IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository() + { + return AddDefaultRepository(typeof(TEntity)); + } + + public IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(Type entityType) + { + if (!typeof(IEntity).IsAssignableFrom(entityType)) + { + throw new AbpException($"Given entityType is not an entity: {entityType.AssemblyQualifiedName}. It must implement {typeof(IEntity<>).AssemblyQualifiedName}."); + } + + DefaultRepositories.AddIfNotContains(entityType); + + return this; + } + public IAbpCommonDbContextRegistrationOptionsBuilder AddRepository() { AddCustomRepository(typeof(TEntity), typeof(TRepository)); @@ -118,4 +138,4 @@ namespace Volo.Abp.DependencyInjection CustomRepositories[entityType] = repositoryType; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs index 53d2f142cd..ebe49718b2 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs @@ -39,6 +39,20 @@ namespace Volo.Abp.DependencyInjection /// IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(Type defaultRepositoryDbContextType, bool includeAllEntities = false); + /// + /// Registers custom repository for a specific entity. + /// + /// Entity type + IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(); + + + /// + /// Registers default repository for a specific entity. + /// + /// + /// + IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(Type entityType); + /// /// Registers custom repository for a specific entity. /// Custom repositories overrides default repositories. diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs index f3b2fc388f..35129134c3 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities; @@ -27,6 +28,12 @@ namespace Volo.Abp.Domain.Repositories { RegisterDefaultRepositories(); } + + foreach (var entityType in Options.DefaultRepositories) + { + ShouldRegisterDefaultRepositoryFor(entityType); + RegisterDefaultRepository(entityType); + } } protected virtual void RegisterDefaultRepositories() @@ -68,7 +75,7 @@ namespace Volo.Abp.Domain.Repositories protected virtual bool ShouldRegisterDefaultRepositoryFor(Type entityType) { - if (!Options.RegisterDefaultRepositories) + if (!Options.RegisterDefaultRepositories && !Options.DefaultRepositories.Any()) { return false; } @@ -78,6 +85,11 @@ namespace Volo.Abp.Domain.Repositories return false; } + if (Options.DefaultRepositories.Contains(entityType)) + { + return true; + } + if (!Options.IncludeAllEntitiesForDefaultRepositories && !typeof(IAggregateRoot).IsAssignableFrom(entityType)) { return false; @@ -92,4 +104,4 @@ namespace Volo.Abp.Domain.Repositories protected abstract Type GetRepositoryType(Type dbContextType, Type entityType, Type primaryKeyType); } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs index 85696fae21..32584f293e 100644 --- a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs +++ b/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), typeof(MyTestCustomBaseRepository)); } + [Fact] + public void Should_Register_Default_Repository() + { + //Arrange + + var services = new ServiceCollection(); + + var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext), services); + options.AddDefaultRepository(); + + //Act + + new MyTestRepositoryRegistrar(options).AddRepositories(); + + //MyTestAggregateRootWithoutPk + services.ShouldNotContainService(typeof(IReadOnlyRepository)); + services.ShouldNotContainService(typeof(IBasicRepository)); + services.ShouldNotContainService(typeof(IRepository)); + + //MyTestAggregateRootWithGuidPk + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestDefaultRepository)); + } + + [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() + .AddRepository();; + + //Act + + new MyTestRepositoryRegistrar(options).AddRepositories(); + + //MyTestAggregateRootWithGuidPk + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IReadOnlyBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + } + public class MyTestRepositoryRegistrar : RepositoryRegistrarBase { public MyTestRepositoryRegistrar(AbpCommonDbContextRegistrationOptions options) From 3b6a0ee16c05ff728575be2e0979395e03bbc68b Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 9 Feb 2021 18:02:51 +0800 Subject: [PATCH 009/188] Update RepositoryRegistrarBase --- .../Repositories/RepositoryRegistrarBase.cs | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs index 35129134c3..bf0be45bb6 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs @@ -18,34 +18,48 @@ 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); } + } - if (Options.RegisterDefaultRepositories) + protected virtual void RegisterDefaultRepositories() + { + if (!Options.RegisterDefaultRepositories) { - RegisterDefaultRepositories(); + return; } - foreach (var entityType in Options.DefaultRepositories) + foreach (var entityType in GetEntityTypes(Options.OriginalDbContextType)) { - ShouldRegisterDefaultRepositoryFor(entityType); + if (!ShouldRegisterDefaultRepositoryFor(entityType)) + { + continue; + } + RegisterDefaultRepository(entityType); } } - protected virtual void RegisterDefaultRepositories() + protected virtual void RegisterSpecifiedDefaultRepositories() { - foreach (var entityType in GetEntityTypes(Options.OriginalDbContextType)) + foreach (var entityType in Options.DefaultRepositories) { - if (!ShouldRegisterDefaultRepositoryFor(entityType)) + if (!Options.CustomRepositories.ContainsKey(entityType)) { - continue; + RegisterDefaultRepository(entityType); } - - RegisterDefaultRepository(entityType); } } @@ -75,7 +89,7 @@ namespace Volo.Abp.Domain.Repositories protected virtual bool ShouldRegisterDefaultRepositoryFor(Type entityType) { - if (!Options.RegisterDefaultRepositories && !Options.DefaultRepositories.Any()) + if (!Options.RegisterDefaultRepositories) { return false; } @@ -85,11 +99,6 @@ namespace Volo.Abp.Domain.Repositories return false; } - if (Options.DefaultRepositories.Contains(entityType)) - { - return true; - } - if (!Options.IncludeAllEntitiesForDefaultRepositories && !typeof(IAggregateRoot).IsAssignableFrom(entityType)) { return false; From b8207426d05d81663c02f93ffc54433ce643233c Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 14 Feb 2021 20:59:06 +0800 Subject: [PATCH 010/188] Ignore password validation in IdentityDataSeeder. Resolve #7677 --- .../Volo/Abp/Identity/IdentityDataSeeder.cs | 77 +++++++++---------- .../Volo/Abp/Identity/IdentityUserManager.cs | 11 +++ 2 files changed, 48 insertions(+), 40 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs index 9051dc7d66..851676b840 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs @@ -53,57 +53,54 @@ namespace Volo.Abp.Identity { await IdentityOptions.SetAsync(); - using (IdentityOptions.Value.Password.ClearRequirements()) + var result = new IdentityDataSeedResult(); + //"admin" user + const string adminUserName = "admin"; + var adminUser = await UserRepository.FindByNormalizedUserNameAsync( + LookupNormalizer.NormalizeName(adminUserName) + ); + + if (adminUser != null) { - var result = new IdentityDataSeedResult(); - //"admin" user - const string adminUserName = "admin"; - var adminUser = await UserRepository.FindByNormalizedUserNameAsync( - LookupNormalizer.NormalizeName(adminUserName) - ); + return result; + } - if (adminUser != null) - { - return result; - } + adminUser = new IdentityUser( + GuidGenerator.Create(), + adminUserName, + adminEmail, + tenantId + ) + { + Name = adminUserName + }; + + (await UserManager.CreateAsync(adminUser, adminPassword, validatePassword: false)).CheckErrors(); + result.CreatedAdminUser = true; - adminUser = new IdentityUser( + //"admin" role + const string adminRoleName = "admin"; + var adminRole = + await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName(adminRoleName)); + if (adminRole == null) + { + adminRole = new IdentityRole( GuidGenerator.Create(), - adminUserName, - adminEmail, + adminRoleName, tenantId ) { - Name = adminUserName + IsStatic = true, + IsPublic = true }; - (await UserManager.CreateAsync(adminUser, adminPassword)).CheckErrors(); - result.CreatedAdminUser = true; - - //"admin" role - const string adminRoleName = "admin"; - var adminRole = - await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName(adminRoleName)); - if (adminRole == null) - { - adminRole = new IdentityRole( - GuidGenerator.Create(), - adminRoleName, - tenantId - ) - { - IsStatic = true, - IsPublic = true - }; - - (await RoleManager.CreateAsync(adminRole)).CheckErrors(); - result.CreatedAdminRole = true; - } + (await RoleManager.CreateAsync(adminRole)).CheckErrors(); + result.CreatedAdminRole = true; + } - (await UserManager.AddToRoleAsync(adminUser, adminRoleName)).CheckErrors(); + (await UserManager.AddToRoleAsync(adminUser, adminRoleName)).CheckErrors(); - return result; - } + return result; } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 69376958b7..6450adfad9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -60,6 +60,17 @@ namespace Volo.Abp.Identity CancellationTokenProvider = cancellationTokenProvider; } + public virtual async Task CreateAsync(IdentityUser user, string password, bool validatePassword) + { + var result = await CreateAsync(user); + if (!result.Succeeded) + { + return result; + } + + return await UpdatePasswordHash(user, password, validatePassword); + } + public virtual async Task GetByIdAsync(Guid id) { var user = await Store.FindByIdAsync(id.ToString(), CancellationToken); From 4d829820bbcaaf36b52bdb069a09860d80c54fe6 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 15 Feb 2021 17:29:44 +0800 Subject: [PATCH 011/188] UpdatePasswordHash first when create an user & remove PasswordOptionsExtensions. --- .../Volo/Abp/Identity/IdentityUserManager.cs | 4 +-- .../Abp/Identity/PasswordOptionsExtensions.cs | 35 ------------------- 2 files changed, 2 insertions(+), 37 deletions(-) delete mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/PasswordOptionsExtensions.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 6450adfad9..508728eea1 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -62,13 +62,13 @@ namespace Volo.Abp.Identity public virtual async Task CreateAsync(IdentityUser user, string password, bool validatePassword) { - var result = await CreateAsync(user); + var result = await UpdatePasswordHash(user, password, validatePassword); if (!result.Succeeded) { return result; } - return await UpdatePasswordHash(user, password, validatePassword); + return await CreateAsync(user); } public virtual async Task GetByIdAsync(Guid id) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/PasswordOptionsExtensions.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/PasswordOptionsExtensions.cs deleted file mode 100644 index 793cc6349e..0000000000 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/PasswordOptionsExtensions.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using Microsoft.AspNetCore.Identity; - -namespace Volo.Abp.Identity -{ - public static class PasswordOptionsExtensions - { - public static IDisposable ClearRequirements(this PasswordOptions options) - { - var oldRequireDigit = options.RequireDigit; - var oldRequiredLength = options.RequiredLength; - var oldRequireLowercase = options.RequireLowercase; - var oldRequireUppercase = options.RequireUppercase; - var oldRequiredUniqueChars = options.RequiredUniqueChars; - var oldRequireNonAlphanumeric = options.RequireNonAlphanumeric; - - options.RequireDigit = false; - options.RequiredLength = 1; - options.RequireLowercase = false; - options.RequireUppercase = false; - options.RequiredUniqueChars = 1; - options.RequireNonAlphanumeric = false; - - return new DisposeAction(() => - { - options.RequireDigit = oldRequireDigit; - options.RequiredLength = oldRequiredLength; - options.RequireLowercase = oldRequireLowercase; - options.RequireUppercase = oldRequireUppercase; - options.RequiredUniqueChars = oldRequiredUniqueChars; - options.RequireNonAlphanumeric = oldRequireNonAlphanumeric; - }); - } - } -} From c7c06c13a3e5242251697781d19d130c86170d2a Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 12:48:54 +0300 Subject: [PATCH 012/188] CmsKit - Add BlogFeature Admin --- .../Volo/CmsKit/Admin/Blogs/BlogFeatureDto.cs | 11 +++++ .../Blogs/IBlogFeatureAdminAppService.cs | 15 ++++++ .../Permissions/CmsKitAdminPermissions.cs | 1 + .../Admin/Blogs/BlogFeatureAdminAppService.cs | 46 +++++++++++++++++++ ...CmsKitAdminApplicationAutoMapperProfile.cs | 2 + .../Volo/CmsKit/Blogs/BlogFeatureConsts.cs | 7 +++ .../Volo/CmsKit/Blogs/BlogFeature.cs | 25 ++++++++++ .../Blogs/BlogFeatureDataSeeContributor.cs | 17 +++++++ .../CmsKit/Blogs/IBlogFeatureRepository.cs | 16 +++++++ .../Blogs/EfCoreBlogFeatureRepository.cs | 30 ++++++++++++ .../EntityFrameworkCore/CmsKitDbContext.cs | 1 + .../CmsKitDbContextModelCreatingExtensions.cs | 10 ++++ .../CmsKitEntityFrameworkCoreModule.cs | 1 + .../Blogs/MongoBlogFeatureRepository.cs | 32 +++++++++++++ .../CmsKit/MongoDB/CmsKitMongoDbContext.cs | 4 +- .../MongoDB/CmsKitMongoDbContextExtensions.cs | 5 ++ .../CmsKit/MongoDB/ICmsKitMongoDbContext.cs | 2 + 17 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogFeatureDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogFeatureAdminAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogFeatureConsts.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeeContributor.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogFeatureDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogFeatureDto.cs new file mode 100644 index 0000000000..afeb23642e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogFeatureDto.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace Volo.CmsKit.Admin.Blogs +{ + public class BlogFeatureDto + { + [Required] + public string FeatureName { get; set; } + public bool Enabled { get; set; } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogFeatureAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogFeatureAdminAppService.cs new file mode 100644 index 0000000000..5ddf45d337 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogFeatureAdminAppService.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Volo.CmsKit.Admin.Blogs +{ + public interface IBlogFeatureAdminAppService + { + Task SetAsync(Guid blogId, BlogFeatureDto dto); + + Task> GetListAsync(Guid blogId); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs index 4c106d4d3c..d16a911bc7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs @@ -36,6 +36,7 @@ namespace Volo.CmsKit.Permissions public const string Create = Default + ".Create"; public const string Update = Default + ".Update"; public const string Delete = Default + ".Delete"; + public const string Features = Default + ".Features"; } public static class BlogPosts diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs new file mode 100644 index 0000000000..1831023c19 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs @@ -0,0 +1,46 @@ +using Microsoft.AspNetCore.Authorization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.CmsKit.Admin.Blogs; +using Volo.CmsKit.Blogs; +using Volo.CmsKit.Permissions; + +namespace Volo.CmsKit.Admin.Blogs +{ + public class BlogFeatureAdminAppService : CmsKitAdminAppServiceBase, IBlogFeatureAdminAppService + { + protected IBlogFeatureRepository BlogFeatureRepository { get; } + + public BlogFeatureAdminAppService(IBlogFeatureRepository blogFeatureRepository) + { + BlogFeatureRepository = blogFeatureRepository; + } + + [Authorize(CmsKitAdminPermissions.Blogs.Features)] + public async Task> GetListAsync(Guid blogId) + { + var list = await BlogFeatureRepository.GetListAsync(blogId); + + return ObjectMapper.Map, List>(list); + } + + [Authorize(CmsKitAdminPermissions.Blogs.Features)] + public async Task SetAsync(Guid blogId, BlogFeatureDto dto) + { + var existing = await BlogFeatureRepository.FindAsync(blogId, dto.FeatureName); + if (existing == null) + { + var blogFeature = new BlogFeature(blogId, dto.FeatureName, dto.Enabled); + await BlogFeatureRepository.InsertAsync(blogFeature); + } + else + { + existing.Enabled = dto.Enabled; + await BlogFeatureRepository.UpdateAsync(existing); + } + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs index 33a9d9de84..85f56f5e17 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs @@ -31,6 +31,8 @@ namespace Volo.CmsKit.Admin CreateMap(MemberList.Destination); + CreateMap(); + CreateMap(MemberList.Destination); CreateMap(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogFeatureConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogFeatureConsts.cs new file mode 100644 index 0000000000..b030d97ba5 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogFeatureConsts.cs @@ -0,0 +1,7 @@ +namespace Volo.CmsKit.Blogs +{ + public static class BlogFeatureConsts + { + public const int MaxFeatureNameLenth = 64; + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs new file mode 100644 index 0000000000..59a26fc1a1 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs @@ -0,0 +1,25 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Volo.CmsKit.Blogs +{ + public class BlogFeature : FullAuditedAggregateRoot + { + protected BlogFeature() // Keep for ORM + { + } + + public BlogFeature(Guid blogId, string featureName, bool enabled = true) + { + BlogId = blogId; + FeatureName = featureName; + Enabled = enabled; + } + + public Guid BlogId { get; protected set; } + + public string FeatureName { get; protected set; } + + public bool Enabled { get; set; } = true; + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeeContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeeContributor.cs new file mode 100644 index 0000000000..c3d8dcce53 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeeContributor.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Data; + +namespace Volo.CmsKit.Blogs +{ + public class BlogFeatureDataSeeContributor : IDataSeedContributor + { + public Task SeedAsync(DataSeedContext context) + { + throw new NotImplementedException(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs new file mode 100644 index 0000000000..622ac33338 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Volo.CmsKit.Blogs +{ + public interface IBlogFeatureRepository : IBasicRepository + { + Task> GetListAsync(Guid blogId); + + Task FindAsync(Guid blogId, string featureName); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs new file mode 100644 index 0000000000..80b2cbcf12 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +namespace Volo.CmsKit.Blogs +{ + public class EfCoreBlogFeatureRepository : EfCoreRepository, IBlogFeatureRepository + { + public EfCoreBlogFeatureRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public Task FindAsync(Guid blogId, string featureName) + { + return base.FindAsync(x => x.BlogId == blogId && x.FeatureName == featureName); + } + + public async Task> GetListAsync(Guid blogId) + { + return await (await GetQueryableAsync()) + .Where(x => x.BlogId == blogId) + .ToListAsync(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs index 17a5dc5c34..749a0653f9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs @@ -26,6 +26,7 @@ namespace Volo.CmsKit.EntityFrameworkCore public DbSet Pages { get; set; } public DbSet Blogs { get; set; } public DbSet BlogPosts { get; set; } + public DbSet BlogFeatures { get; set; } public DbSet MediaDescriptors { get; set; } public CmsKitDbContext(DbContextOptions options) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index 9f0ac813fc..273db5ade1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -216,11 +216,21 @@ namespace Volo.CmsKit.EntityFrameworkCore b.HasIndex(x => new { x.Slug, x.BlogId }); }); + + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "BlogFeatures", options.Schema); + + b.ConfigureByConvention(); + + b.Property(p => p.FeatureName).IsRequired().HasMaxLength(BlogFeatureConsts.MaxFeatureNameLenth); + }); } else { builder.Ignore(); builder.Ignore(); + builder.Ignore(); } if (GlobalFeatureManager.Instance.IsEnabled()) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs index e67a4f2d1b..335bbb9f78 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs @@ -35,6 +35,7 @@ namespace Volo.CmsKit.EntityFrameworkCore options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); options.AddRepository(); }); } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs new file mode 100644 index 0000000000..b369345890 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using MongoDB.Driver.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; +using Volo.CmsKit.Blogs; +using MongoDB.Driver; + +namespace Volo.CmsKit.MongoDB.Blogs +{ + public class MongoBlogFeatureRepository : MongoDbRepository , IBlogFeatureRepository + { + public MongoBlogFeatureRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public Task FindAsync(Guid blogId, string featureName) + { + return base.FindAsync(x => x.BlogId == blogId && x.FeatureName == featureName); + } + + public async Task> GetListAsync(Guid blogId) + { + return await (await GetMongoQueryableAsync()) + .Where(x => x.BlogId == blogId) + .ToListAsync(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs index a62ed224df..cd03531448 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs @@ -36,7 +36,9 @@ namespace Volo.CmsKit.MongoDB public IMongoCollection Blogs => Collection(); public IMongoCollection BlogPosts => Collection(); - + + public IMongoCollection BlogFeatures => Collection(); + public IMongoCollection MediaDescriptors => Collection(); protected override void CreateModel(IMongoModelBuilder modelBuilder) diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs index f4e46a38fa..2a542472d2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs @@ -76,6 +76,11 @@ namespace Volo.CmsKit.MongoDB { x.CollectionName = CmsKitDbProperties.DbTablePrefix + "BlogPosts"; }); + + builder.Entity(x => + { + x.CollectionName = CmsKitDbProperties.DbTablePrefix + "BlogFeatures"; + }); builder.Entity(x => { diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs index f3cf7064f8..742d40dfc6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs @@ -36,6 +36,8 @@ namespace Volo.CmsKit.MongoDB IMongoCollection Blogs { get; } IMongoCollection BlogPosts { get; } + + IMongoCollection BlogFeatures { get; } IMongoCollection MediaDescriptors { get; } } From 16261a9d7704ccae9d7643cf89eaf4f9af7149d2 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 12:49:05 +0300 Subject: [PATCH 013/188] CmsKit - Add BlogFeature Admin Tests --- .../Blogs/BlogFeatureAdminAppService.cs | 67 +++++++++++++++++++ .../Blogs/BlogFeatureRepository_Test.cs | 14 ++++ .../Blogs/BlogFeatureRepository_Test.cs | 14 ++++ .../Blogs/BlogFeatureRepository_Test.cs | 58 ++++++++++++++++ .../CmsKitDataSeedContributor.cs | 24 +++++++ .../Volo.CmsKit.TestBase/CmsKitTestData.cs | 12 ++++ 6 files changed, 189 insertions(+) create mode 100644 modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Blogs/BlogFeatureRepository_Test.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Blogs/BlogFeatureRepository_Test.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogFeatureRepository_Test.cs diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService.cs new file mode 100644 index 0000000000..7bfa061e4d --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService.cs @@ -0,0 +1,67 @@ +using Shouldly; +using System.Threading.Tasks; +using Volo.CmsKit.Admin.Blogs; +using Xunit; + +namespace Volo.CmsKit.Blogs +{ + public class BlogFeatureAdminAppService : CmsKitApplicationTestBase + { + private readonly CmsKitTestData testData; + private readonly IBlogFeatureAdminAppService blogFeatureAdminAppService; + private readonly IBlogFeatureRepository blogFeatureRepository; + + public BlogFeatureAdminAppService() + { + testData = GetRequiredService(); + blogFeatureAdminAppService = GetRequiredService(); + blogFeatureRepository = GetRequiredService(); + } + + [Fact] + public async Task SetAsync_ShouldWorkProperly_WithNonExistingFeature() + { + var dto = new BlogFeatureDto + { + FeatureName = "My.Awesome.Feature", + Enabled = true + }; + + await blogFeatureAdminAppService.SetAsync(testData.Blog_Id, dto); + + var feature = await blogFeatureRepository.FindAsync(testData.Blog_Id, dto.FeatureName); + + feature.ShouldNotBeNull(); + feature.BlogId.ShouldBe(testData.Blog_Id); + feature.Enabled.ShouldBe(dto.Enabled); + } + + [Fact] + public async Task SetAsync_ShouldWorkProperly_WithExistingFeature() + { + var dto = new BlogFeatureDto + { + FeatureName = testData.BlogFeature_2_FeatureName, + Enabled = !testData.BlogFeature_2_Enabled + }; + + await blogFeatureAdminAppService.SetAsync(testData.Blog_Id, dto); + + var feature = await blogFeatureRepository.FindAsync(testData.Blog_Id, dto.FeatureName); + + feature.ShouldNotBeNull(); + feature.BlogId.ShouldBe(testData.Blog_Id); + feature.Enabled.ShouldBe(dto.Enabled); + } + + [Fact] + public async Task GetListAsync_ShouldWorkProperly_WithBlogId() + { + var result = await blogFeatureAdminAppService.GetListAsync(testData.Blog_Id); + + result.ShouldNotBeNull(); + result.ShouldNotBeEmpty(); + result.Count.ShouldBe(2); + } + } +} diff --git a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Blogs/BlogFeatureRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Blogs/BlogFeatureRepository_Test.cs new file mode 100644 index 0000000000..d6acb2b162 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Blogs/BlogFeatureRepository_Test.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.CmsKit.Blogs; + +namespace Volo.CmsKit.EntityFrameworkCore.Blogs +{ + public class BlogFeatureRepository_Test : BlogFeatureRepository_Test + { + + } +} diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Blogs/BlogFeatureRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Blogs/BlogFeatureRepository_Test.cs new file mode 100644 index 0000000000..35ccc0664c --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Blogs/BlogFeatureRepository_Test.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.CmsKit.Blogs; + +namespace Volo.CmsKit.MongoDB.Blogs +{ + public class BlogFeatureRepository_Test : BlogFeatureRepository_Test + { + + } +} diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogFeatureRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogFeatureRepository_Test.cs new file mode 100644 index 0000000000..3c1e77976f --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogFeatureRepository_Test.cs @@ -0,0 +1,58 @@ +using Shouldly; +using System; +using System.Threading.Tasks; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.CmsKit.Blogs +{ + public abstract class BlogFeatureRepository_Test : CmsKitTestBase + where TStartupModule : IAbpModule + { + private readonly CmsKitTestData testData; + private readonly IBlogFeatureRepository blogFeatureRepository; + public BlogFeatureRepository_Test() + { + testData = GetRequiredService(); + blogFeatureRepository = GetRequiredService(); + } + + [Fact] + public async Task GetListAsync_ShouldWorkProperly_WithBlogId() + { + var result = await blogFeatureRepository.GetListAsync(testData.Blog_Id); + + result.ShouldNotBeNull(); + result.ShouldNotBeEmpty(); + result.Count.ShouldBe(2); + } + + [Fact] + public async Task FindAsync_ShouldWorkProperly_WithExistingFeatureName() + { + var result = await blogFeatureRepository.FindAsync(testData.Blog_Id, testData.BlogFeature_1_FeatureName); + + result.ShouldNotBeNull(); + result.FeatureName.ShouldBe(testData.BlogFeature_1_FeatureName); + result.Enabled.ShouldBe(testData.BlogFeature_1_Enabled); + } + + [Fact] + public async Task FindAsync_ShouldReturnNull_WithNonExistingFeatureName() + { + var nonExistingFeatureName = "Some.Feature"; + var result = await blogFeatureRepository.FindAsync(testData.Blog_Id, nonExistingFeatureName); + + result.ShouldBeNull(); + } + + [Fact] + public async Task FindAsync_ShouldReturnNull_WithNonExistingBlogId() + { + var nonExistingBlogId = Guid.NewGuid(); + var result = await blogFeatureRepository.FindAsync(nonExistingBlogId, testData.BlogFeature_1_FeatureName); + + result.ShouldBeNull(); + } + } +} diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index 68a65de89e..4089be4053 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -39,6 +39,7 @@ namespace Volo.CmsKit private readonly IEntityTagRepository _entityTagRepository; private readonly IPageRepository _pageRepository; private readonly IBlogRepository _blogRepository; + private readonly IBlogFeatureRepository _blogFeatureRepository; private readonly IBlogPostRepository _blogPostRepository; private readonly IOptions _options; private readonly IOptions _tagOptions; @@ -59,6 +60,7 @@ namespace Volo.CmsKit IPageRepository pageRepository, IBlogRepository blogRepository, IBlogPostRepository blogPostRepository, + IBlogFeatureRepository blogFeatureRepository, IEntityTagManager entityTagManager, IOptions options, IOptions tagOptions, @@ -79,6 +81,7 @@ namespace Volo.CmsKit _pageRepository = pageRepository; _blogRepository = blogRepository; _blogPostRepository = blogPostRepository; + _blogFeatureRepository = blogFeatureRepository; _options = options; _tagOptions = tagOptions; _mediaDescriptorRepository = mediaDescriptorRepository; @@ -107,6 +110,8 @@ namespace Volo.CmsKit await SeedBlogsAsync(); + await SeedBlogFeaturesAsync(); + await SeedMediaAsync(); } } @@ -327,6 +332,25 @@ namespace Volo.CmsKit await _blogPostRepository.InsertAsync(new BlogPost(_cmsKitTestData.BlogPost_2_Id, blog.Id, _cmsKitTestData.BlogPost_2_Title, _cmsKitTestData.BlogPost_2_Slug, "Short desc 2")); } + private async Task SeedBlogFeaturesAsync() + { + var blogFeature1 = await _blogFeatureRepository.InsertAsync( + new BlogFeature( + _cmsKitTestData.Blog_Id, + _cmsKitTestData.BlogFeature_1_FeatureName, + _cmsKitTestData.BlogFeature_1_Enabled)); + + _cmsKitTestData.BlogFeature_1_Id = blogFeature1.Id; + + var blogFeature2 = await _blogFeatureRepository.InsertAsync( + new BlogFeature( + _cmsKitTestData.Blog_Id, + _cmsKitTestData.BlogFeature_2_FeatureName, + _cmsKitTestData.BlogFeature_2_Enabled)); + + _cmsKitTestData.BlogFeature_2_Id = blogFeature2.Id; + } + private async Task SeedMediaAsync() { using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(_cmsKitTestData.Media_1_Content))) diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs index b0b4a5b1ba..7c72bf68cb 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs @@ -91,6 +91,18 @@ namespace Volo.CmsKit public string BlogPost_2_Slug => "how-to-use-cms-kit"; + public Guid BlogFeature_1_Id { get; internal set; } = Guid.NewGuid(); + + public string BlogFeature_1_FeatureName => "Tagging"; + + public bool BlogFeature_1_Enabled => true; + + public Guid BlogFeature_2_Id { get; internal set; } = Guid.NewGuid(); + + public string BlogFeature_2_FeatureName => "Rating"; + + public bool BlogFeature_2_Enabled => false; + public Guid Media_1_Id { get; } = Guid.NewGuid(); public string Media_1_Content = "Hi, this is text file"; From 2912af84456244ad75e7bf400ee23f101422c751 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 13:11:16 +0300 Subject: [PATCH 014/188] CmsKit - Add BlogFeatureAdminController & Permissions --- ...CmsKitAdminPermissionDefinitionProvider.cs | 1 + .../Admin/Blogs/BlogFeatureAdminController.cs | 41 +++++++++++++++++++ .../CmsKit/Localization/Resources/en.json | 11 ++--- .../CmsKit/Localization/Resources/tr.json | 1 + 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminController.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs index a5a30a60ef..672eabbd5f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs @@ -42,6 +42,7 @@ namespace Volo.CmsKit.Permissions blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Create, L("Permission:BlogManagement.Create")); blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Update, L("Permission:BlogManagement.Update")); blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Delete, L("Permission:BlogManagement.Delete")); + blogManagement.AddChild(CmsKitAdminPermissions.Blogs.Features, L("Permission:BlogManagement.Features")); var blogPostManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.BlogPosts.Default, L("Permission:BlogPostManagement")); blogManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Create, L("Permission:BlogPostManagement.Create")); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminController.cs new file mode 100644 index 0000000000..7a00146b92 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminController.cs @@ -0,0 +1,41 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.GlobalFeatures; +using Volo.CmsKit.Permissions; + +namespace Volo.CmsKit.Admin.Blogs +{ + [RequiresGlobalFeature(typeof(BlogsFeature))] + [RemoteService(Name = CmsKitCommonRemoteServiceConsts.RemoteServiceName)] + [Area("cms-kit")] + [Authorize(CmsKitAdminPermissions.Blogs.Features)] + [Route("api/cms-kit-admin/blogs/{blogId}/features")] + public class BlogFeatureAdminController : CmsKitAdminController, IBlogFeatureAdminAppService + { + protected IBlogFeatureAdminAppService BlogFeatureAdminAppService { get; } + + public BlogFeatureAdminController(IBlogFeatureAdminAppService blogFeatureAdminAppService) + { + BlogFeatureAdminAppService = blogFeatureAdminAppService; + } + + [HttpGet] + public Task> GetListAsync(Guid blogId) + { + return BlogFeatureAdminAppService.GetListAsync(blogId); + } + + [HttpPut] + public Task SetAsync(Guid blogId, BlogFeatureDto dto) + { + return BlogFeatureAdminAppService.SetAsync(blogId, dto); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 7b7dd69308..d91ef6744d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -4,6 +4,7 @@ "CmsKit:0002": "Content already exists!", "CmsKit:0003": "The entity {0} is not taggable.", "CmsKit:BlogPost:0001": "Same url slug already exists!", + "CmsKit:Media:0001": "'{Name}' is not a valid media name.", "CmsKit:Page:0001": "The given url ({0}) already exists.", "CmsKit:Tag:0002": "The entity is not taggable!", "CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.", @@ -16,11 +17,15 @@ "LoginToReply": "Login to reply", "Menu:CMS": "CMS", "MessageDeletionConfirmationMessage": "This comment will be deleted completely.", + "Permission:BlogManagement.Features": "Features", "Permission:CmsKit": "CmsKit", "Permission:Contents": "Content Management", "Permission:Contents.Create": "Create Content", "Permission:Contents.Delete": "Delete Content", "Permission:Contents.Update": "Update Content", + "Permission:MediaDescriptorManagement": "Media Management", + "Permission:MediaDescriptorManagement:Create": "Create", + "Permission:MediaDescriptorManagement:Delete": "Delete", "Permission:PageManagement": "Page Management", "Permission:PageManagement:Create": "Create", "Permission:PageManagement:Delete": "Delete", @@ -40,10 +45,6 @@ "Undo": "Undo", "Update": "Update", "YourComment": "Your comment", - "YourReply": "Your reply", - "CmsKit:Media:0001": "'{Name}' is not a valid media name.", - "Permission:MediaDescriptorManagement": "Media Management", - "Permission:MediaDescriptorManagement:Create": "Create", - "Permission:MediaDescriptorManagement:Delete": "Delete" + "YourReply": "Your reply" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 7d77c0649b..af032d5480 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -16,6 +16,7 @@ "LoginToReply": "Cevap vermek için giriş yap", "Menu:CMS": "CMS", "MessageDeletionConfirmationMessage": "Bu yorum tamamen silinecektir", + "Permission:BlogManagement.Features": "Özellikler", "Permission:CmsKit": "CmsKit", "Permission:Contents": "İçerik Yönetimi", "Permission:Contents.Create": "İçerik Oluşturma", From e71051b15c5602c555fd3abbecf1af1cf9a9dcee Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 13:56:47 +0300 Subject: [PATCH 015/188] CmsKit - BlogFeature public implementation --- .../Volo/CmsKit/Blogs/BlogPostConsts.cs | 6 ++ .../Volo/CmsKit/Blogs/BlogFeature.cs | 8 ++- .../CmsKit/Blogs/IBlogFeatureRepository.cs | 2 + .../Blogs/EfCoreBlogFeatureRepository.cs | 7 +++ .../Blogs/MongoBlogFeatureRepository.cs | 7 +++ .../CmsKit/Public/Blogs/BlogFeatureDto.cs | 11 ++++ .../Public/Blogs/GetBlogFeatureInput.cs | 13 ++++ .../Blogs/IBlogFeaturePublicAppService.cs | 13 ++++ .../Volo.CmsKit.Public.Application.csproj | 1 + .../Blogs/BlogFeaturePublicAppService.cs | 61 +++++++++++++++++++ .../Public/CmsKitPublicApplicationModule.cs | 4 +- .../PublicApplicationAutoMapperProfile.cs | 2 + .../Blogs/BlogFeaturePublicController.cs | 34 +++++++++++ .../Pages/CmsKit/Blogs/BlogPost.cshtml | 34 +++++++---- .../Pages/CmsKit/Blogs/BlogPost.cshtml.cs | 34 ++++++++++- 15 files changed, 219 insertions(+), 18 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogFeatureDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/GetBlogFeatureInput.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogFeaturePublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogFeaturePublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogFeaturePublicController.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostConsts.cs index 97b67416cf..2acd2cdeba 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostConsts.cs @@ -11,5 +11,11 @@ public static int MaxShortDescriptionLength { get; set; } = 256; public const string EntityType = "BlogPost"; + + public const string CommentsFeatureName = "Comments"; + + public const string ReactionsFeatureName = "Reactions"; + + public const string RatingsFeatureName = "Ratings"; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs index 59a26fc1a1..eec8223d89 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs @@ -1,4 +1,6 @@ -using System; +using JetBrains.Annotations; +using System; +using Volo.Abp; using Volo.Abp.Domain.Entities.Auditing; namespace Volo.CmsKit.Blogs @@ -9,10 +11,10 @@ namespace Volo.CmsKit.Blogs { } - public BlogFeature(Guid blogId, string featureName, bool enabled = true) + public BlogFeature(Guid blogId, [NotNull] string featureName, bool enabled = true) { BlogId = blogId; - FeatureName = featureName; + FeatureName = Check.NotNullOrWhiteSpace(featureName, nameof(featureName)); Enabled = enabled; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs index 622ac33338..b7ba075e92 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs @@ -11,6 +11,8 @@ namespace Volo.CmsKit.Blogs { Task> GetListAsync(Guid blogId); + Task> GetListAsync(Guid blogId, string[] featureNames); + Task FindAsync(Guid blogId, string featureName); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs index 80b2cbcf12..ee3b7cc4a5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs @@ -26,5 +26,12 @@ namespace Volo.CmsKit.Blogs .Where(x => x.BlogId == blogId) .ToListAsync(); } + + public async Task> GetListAsync(Guid blogId, string[] featureNames) + { + return await (await GetQueryableAsync()) + .Where(x => x.BlogId == blogId && featureNames.Contains(x.FeatureName)) + .ToListAsync(); + } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs index b369345890..69613c01f2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs @@ -28,5 +28,12 @@ namespace Volo.CmsKit.MongoDB.Blogs .Where(x => x.BlogId == blogId) .ToListAsync(); } + + public async Task> GetListAsync(Guid blogId, string[] featureNames) + { + return await (await GetMongoQueryableAsync()) + .Where(x => x.BlogId == blogId && featureNames.Contains(x.FeatureName)) + .ToListAsync(); + } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogFeatureDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogFeatureDto.cs new file mode 100644 index 0000000000..8fb4aa1fd5 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogFeatureDto.cs @@ -0,0 +1,11 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Volo.CmsKit.Public.Blogs +{ + public class BlogFeatureDto : EntityDto + { + public string FeatureName { get; set; } + public bool Enabled { get; set; } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/GetBlogFeatureInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/GetBlogFeatureInput.cs new file mode 100644 index 0000000000..a98dfbc264 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/GetBlogFeatureInput.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Volo.CmsKit.Public.Blogs +{ + public class GetBlogFeatureInput + { + public string[] FeatureNames { get; set; } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogFeaturePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogFeaturePublicAppService.cs new file mode 100644 index 0000000000..017da5d2d3 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogFeaturePublicAppService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Volo.CmsKit.Public.Blogs +{ + public interface IBlogFeaturePublicAppService + { + Task GetAsync(Guid blogId, string featureName); + + Task> GetManyAsync(Guid blogId, GetBlogFeatureInput input); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj index 702523e3c6..5460e29406 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj @@ -11,6 +11,7 @@ + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogFeaturePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogFeaturePublicAppService.cs new file mode 100644 index 0000000000..7cc9088a81 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogFeaturePublicAppService.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.Caching.Distributed; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Caching; +using Volo.CmsKit.Blogs; + +namespace Volo.CmsKit.Public.Blogs +{ + public class BlogFeaturePublicAppService : CmsKitPublicAppServiceBase, IBlogFeaturePublicAppService + { + protected IBlogFeatureRepository BlogFeatureRepository { get; } + protected IDistributedCache Cache { get; } + + public BlogFeaturePublicAppService( + IBlogFeatureRepository blogFeatureRepository, + IDistributedCache cache) + { + BlogFeatureRepository = blogFeatureRepository; + Cache = cache; + } + + public async Task GetAsync(Guid blogId, string featureName) + { + return await Cache.GetOrAddAsync( + $"{blogId}_{featureName}", + () => GetFromDatabaseAsync(blogId, featureName), + () => new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1) + }); + } + + private async Task GetFromDatabaseAsync(Guid blogId, string featureName) + { + var feature = await BlogFeatureRepository.FindAsync(blogId, featureName); + if (feature == null) + { + feature = new BlogFeature(blogId, featureName); + } + + return ObjectMapper.Map(feature); + } + + public async Task> GetManyAsync(Guid blogId, GetBlogFeatureInput input) + { + var features = await BlogFeatureRepository.GetListAsync(blogId); + + var nonExistingFeatures = input.FeatureNames.Where(x => !features.Any(a => a.FeatureName == x)); + + foreach (var featureName in nonExistingFeatures) + { + features.Add(new BlogFeature(blogId, featureName)); + } + + return ObjectMapper.Map, List>(features); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/CmsKitPublicApplicationModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/CmsKitPublicApplicationModule.cs index c8cda19e68..ede4a7ef29 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/CmsKitPublicApplicationModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/CmsKitPublicApplicationModule.cs @@ -1,12 +1,14 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AutoMapper; +using Volo.Abp.Caching; using Volo.Abp.Modularity; namespace Volo.CmsKit.Public { [DependsOn( typeof(CmsKitCommonApplicationModule), - typeof(CmsKitPublicApplicationContractsModule) + typeof(CmsKitPublicApplicationContractsModule), + typeof(AbpCachingModule) )] public class CmsKitPublicApplicationModule : AbpModule { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index 46dab5a9a1..ee8a09e8df 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -34,6 +34,8 @@ namespace Volo.CmsKit.Public CreateMap(); CreateMap(MemberList.None); + + CreateMap(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogFeaturePublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogFeaturePublicController.cs new file mode 100644 index 0000000000..2dd480b78f --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogFeaturePublicController.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.CmsKit.Public.Blogs; + +namespace Volo.CmsKit.Public.HttpApi.Volo.CmsKit.Public.Blogs +{ + public class BlogFeaturePublicController : CmsKitPublicControllerBase, IBlogFeaturePublicAppService + { + protected IBlogFeaturePublicAppService BlogFeaturePublicAppService { get; } + + public BlogFeaturePublicController(IBlogFeaturePublicAppService blogFeaturePublicAppService) + { + BlogFeaturePublicAppService = blogFeaturePublicAppService; + } + + [HttpGet] + [Route("{blogId}/{featureName}")] + public Task GetAsync(Guid blogId, string featureName) + { + return BlogFeaturePublicAppService.GetAsync(blogId, featureName); + } + + [HttpGet] + [Route("{blogId}")] + public Task> GetManyAsync(Guid blogId, GetBlogFeatureInput input) + { + return BlogFeaturePublicAppService.GetManyAsync(blogId, input); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml index 51472ce7c1..763b5ac36b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml @@ -35,29 +35,39 @@ @if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new + if (Model.ReactionsFeature?.Enabled == true) { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) + @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) + + } } @if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(RatingViewComponent), new + if (Model.RatingsFeature?.Enabled == true) { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) + @await Component.InvokeAsync(typeof(RatingViewComponent), new + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) + } }
@if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(DefaultBlogPostCommentViewComponent), new + if (Model.CommentsFeature?.Enabled == true) { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) + @await Component.InvokeAsync(typeof(DefaultBlogPostCommentViewComponent), new + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml.cs index a3f31bb9a2..7c3fb4fa64 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml.cs @@ -2,8 +2,12 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; +using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Blogs; +using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Public.Blogs; namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Blogs @@ -18,16 +22,42 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Blogs public BlogPostPublicDto BlogPost { get; private set; } + public BlogFeatureDto CommentsFeature { get; private set; } + + public BlogFeatureDto ReactionsFeature { get; private set; } + + public BlogFeatureDto RatingsFeature { get; private set; } + protected IBlogPostPublicAppService BlogPostPublicAppService { get; } - public BlogPostModel(IBlogPostPublicAppService blogPostPublicAppService) + protected IBlogFeaturePublicAppService BlogFeaturePublicAppService { get; } + + public BlogPostModel( + IBlogPostPublicAppService blogPostPublicAppService, + IBlogFeaturePublicAppService blogFeaturePublicAppService) { BlogPostPublicAppService = blogPostPublicAppService; + BlogFeaturePublicAppService = blogFeaturePublicAppService; } - public async Task OnGetAsync() + public virtual async Task OnGetAsync() { BlogPost = await BlogPostPublicAppService.GetAsync(BlogSlug, BlogPostSlug); + + if (GlobalFeatureManager.Instance.IsEnabled()) + { + CommentsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.Id, BlogPostConsts.CommentsFeatureName); + } + + if (GlobalFeatureManager.Instance.IsEnabled()) + { + ReactionsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.Id, BlogPostConsts.ReactionsFeatureName); + } + + if (GlobalFeatureManager.Instance.IsEnabled()) + { + RatingsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.Id, BlogPostConsts.RatingsFeatureName); + } } } } From c56189a8b24d00b5a3f74fb8406a45ac6d63042e Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 13:56:59 +0300 Subject: [PATCH 016/188] CmsKit - BlogFeature public tests --- ....cs => BlogFeatureAdminAppService_Test.cs} | 4 +- .../Blogs/BlogFeaturePublicAppService_Test.cs | 43 +++++++++++++++++++ .../Blogs/BlogFeatureRepository_Test.cs | 10 +++++ 3 files changed, 55 insertions(+), 2 deletions(-) rename modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/{BlogFeatureAdminAppService.cs => BlogFeatureAdminAppService_Test.cs} (94%) create mode 100644 modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeaturePublicAppService_Test.cs diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs similarity index 94% rename from modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService.cs rename to modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs index 7bfa061e4d..41792902c4 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs @@ -5,13 +5,13 @@ using Xunit; namespace Volo.CmsKit.Blogs { - public class BlogFeatureAdminAppService : CmsKitApplicationTestBase + public class BlogFeatureAdminAppService_Test : CmsKitApplicationTestBase { private readonly CmsKitTestData testData; private readonly IBlogFeatureAdminAppService blogFeatureAdminAppService; private readonly IBlogFeatureRepository blogFeatureRepository; - public BlogFeatureAdminAppService() + public BlogFeatureAdminAppService_Test() { testData = GetRequiredService(); blogFeatureAdminAppService = GetRequiredService(); diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeaturePublicAppService_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeaturePublicAppService_Test.cs new file mode 100644 index 0000000000..3376173986 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeaturePublicAppService_Test.cs @@ -0,0 +1,43 @@ +using Shouldly; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.CmsKit.Public.Blogs; +using Xunit; + +namespace Volo.CmsKit.Blogs +{ + public class BlogFeaturePublicAppService_Test : CmsKitApplicationTestBase + { + private readonly CmsKitTestData testData; + private readonly IBlogFeaturePublicAppService blogFeaturePublicAppService; + + public BlogFeaturePublicAppService_Test() + { + testData = GetRequiredService(); + blogFeaturePublicAppService = GetRequiredService(); + } + + [Fact] + public async Task GetAsync_ShouldWorkProperly_WithExistingFeatureName() + { + var result = await blogFeaturePublicAppService.GetAsync(testData.Blog_Id, testData.BlogFeature_1_FeatureName); + + result.ShouldNotBeNull(); + result.FeatureName.ShouldBe(testData.BlogFeature_1_FeatureName); + } + + [Fact] + public async Task GetAsync_ShouldReturnDefault_WithNonExistingFeatureName() + { + var nonExistingFeatureName = "AnyOtherFeature"; + var result = await blogFeaturePublicAppService.GetAsync(testData.Blog_Id, nonExistingFeatureName); + + var defaultFeature = new BlogFeature(Guid.Empty, nonExistingFeatureName); + result.ShouldNotBeNull(); + result.Enabled.ShouldBe(defaultFeature.Enabled); + } + } +} diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogFeatureRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogFeatureRepository_Test.cs index 3c1e77976f..af8531425f 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogFeatureRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogFeatureRepository_Test.cs @@ -27,6 +27,16 @@ namespace Volo.CmsKit.Blogs result.Count.ShouldBe(2); } + [Fact] + public async Task GetListAsync_ShouldWorkProperly_WithBlogIdWithFeatureNames() + { + var result = await blogFeatureRepository.GetListAsync(testData.Blog_Id, new[] { testData.BlogFeature_1_FeatureName }); + + result.ShouldNotBeNull(); + result.ShouldNotBeEmpty(); + result.Count.ShouldBe(1); + } + [Fact] public async Task FindAsync_ShouldWorkProperly_WithExistingFeatureName() { From 0eec8800c8e7d8414d8da0d9f9f7f369f9006fe7 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 14:00:15 +0300 Subject: [PATCH 017/188] CmsKit - Remove GetMany from BlogFeature --- .../Public/Blogs/IBlogFeaturePublicAppService.cs | 2 -- .../Public/Blogs/BlogFeaturePublicAppService.cs | 14 -------------- .../Public/Blogs/BlogFeaturePublicController.cs | 7 ------- 3 files changed, 23 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogFeaturePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogFeaturePublicAppService.cs index 017da5d2d3..4606198932 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogFeaturePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogFeaturePublicAppService.cs @@ -7,7 +7,5 @@ namespace Volo.CmsKit.Public.Blogs public interface IBlogFeaturePublicAppService { Task GetAsync(Guid blogId, string featureName); - - Task> GetManyAsync(Guid blogId, GetBlogFeatureInput input); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogFeaturePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogFeaturePublicAppService.cs index 7cc9088a81..2e8e553a6c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogFeaturePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogFeaturePublicAppService.cs @@ -43,19 +43,5 @@ namespace Volo.CmsKit.Public.Blogs return ObjectMapper.Map(feature); } - - public async Task> GetManyAsync(Guid blogId, GetBlogFeatureInput input) - { - var features = await BlogFeatureRepository.GetListAsync(blogId); - - var nonExistingFeatures = input.FeatureNames.Where(x => !features.Any(a => a.FeatureName == x)); - - foreach (var featureName in nonExistingFeatures) - { - features.Add(new BlogFeature(blogId, featureName)); - } - - return ObjectMapper.Map, List>(features); - } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogFeaturePublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogFeaturePublicController.cs index 2dd480b78f..6c3579da4b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogFeaturePublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogFeaturePublicController.cs @@ -23,12 +23,5 @@ namespace Volo.CmsKit.Public.HttpApi.Volo.CmsKit.Public.Blogs { return BlogFeaturePublicAppService.GetAsync(blogId, featureName); } - - [HttpGet] - [Route("{blogId}")] - public Task> GetManyAsync(Guid blogId, GetBlogFeatureInput input) - { - return BlogFeaturePublicAppService.GetManyAsync(blogId, input); - } } } From 285a78790b4ac374c4b773e2c7633bad1b8585d3 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 14:28:32 +0300 Subject: [PATCH 018/188] CmsKit - Add BlogFeature migrations to Unified project --- .../20210216112738_BlogFeatures.Designer.cs | 1951 +++++++++++++++++ .../Migrations/20210216112738_BlogFeatures.cs | 40 + .../UnifiedDbContextModelSnapshot.cs | 62 + 3 files changed, 2053 insertions(+) create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210216112738_BlogFeatures.Designer.cs create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210216112738_BlogFeatures.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210216112738_BlogFeatures.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210216112738_BlogFeatures.Designer.cs new file mode 100644 index 0000000000..c043de5396 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210216112738_BlogFeatures.Designer.cs @@ -0,0 +1,1951 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +namespace Volo.CmsKit.Migrations +{ + [DbContext(typeof(UnifiedDbContext))] + [Migration("20210216112738_BlogFeatures")] + partial class BlogFeatures + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.3") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)") + .HasColumnName("Exceptions"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasColumnType("nvarchar(max)"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContainerId") + .HasColumnType("uniqueidentifier"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("varbinary(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("TenantId", "ContainerId", "Name"); + + b.ToTable("AbpBlobs"); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AbpBlobContainers"); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles"); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpPermissionGrants"); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpSettings"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AbpTenants"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings"); + }); + + modelBuilder.Entity("Volo.CmsKit.Blogs.Blog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Slug") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("CmsBlogs"); + }); + + modelBuilder.Entity("Volo.CmsKit.Blogs.BlogFeature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("BlogId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("FeatureName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.HasKey("Id"); + + b.ToTable("CmsBlogFeatures"); + }); + + modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("BlogId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ShortDescription") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Slug") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("DeleterId"); + + b.HasIndex("LastModifierId"); + + b.HasIndex("Slug", "BlogId"); + + b.ToTable("CmsBlogPosts"); + }); + + modelBuilder.Entity("Volo.CmsKit.Comments.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("RepliedCommentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Text") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "RepliedCommentId"); + + b.HasIndex("TenantId", "EntityType", "EntityId"); + + b.ToTable("CmsComments"); + }); + + modelBuilder.Entity("Volo.CmsKit.Contents.Content", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2147483647) + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "EntityType", "EntityId"); + + b.ToTable("CmsContents"); + }); + + modelBuilder.Entity("Volo.CmsKit.MediaDescriptors.MediaDescriptor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("MimeType") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Size") + .HasMaxLength(2147483647) + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("CmsMediaDescriptors"); + }); + + modelBuilder.Entity("Volo.CmsKit.Ratings.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("StarCount") + .HasColumnType("smallint"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "EntityType", "EntityId", "CreatorId"); + + b.ToTable("CmsRatings"); + }); + + modelBuilder.Entity("Volo.CmsKit.Reactions.UserReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ReactionName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "EntityType", "EntityId", "ReactionName"); + + b.HasIndex("TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName"); + + b.ToTable("CmsUserReactions"); + }); + + modelBuilder.Entity("Volo.CmsKit.Tags.EntityTag", b => + { + b.Property("EntityId") + .HasColumnType("nvarchar(450)"); + + b.Property("TagId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("EntityId", "TagId"); + + b.HasIndex("TenantId", "EntityId", "TagId"); + + b.ToTable("CmsEntityTags"); + }); + + modelBuilder.Entity("Volo.CmsKit.Tags.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("CmsTags"); + }); + + modelBuilder.Entity("Volo.CmsKit.Users.CmsUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Email"); + + b.HasIndex("TenantId", "UserName"); + + b.ToTable("CmsUsers"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null) + .WithMany() + .HasForeignKey("ContainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b => + { + b.HasOne("Volo.CmsKit.Users.CmsUser", "Creator") + .WithMany() + .HasForeignKey("CreatorId"); + + b.HasOne("Volo.CmsKit.Users.CmsUser", "Deleter") + .WithMany() + .HasForeignKey("DeleterId"); + + b.HasOne("Volo.CmsKit.Users.CmsUser", "LastModifier") + .WithMany() + .HasForeignKey("LastModifierId"); + + b.Navigation("Creator"); + + b.Navigation("Deleter"); + + b.Navigation("LastModifier"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210216112738_BlogFeatures.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210216112738_BlogFeatures.cs new file mode 100644 index 0000000000..367cf1d92c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210216112738_BlogFeatures.cs @@ -0,0 +1,40 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Volo.CmsKit.Migrations +{ + public partial class BlogFeatures : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CmsBlogFeatures", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + BlogId = table.Column(type: "uniqueidentifier", nullable: false), + FeatureName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Enabled = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_CmsBlogFeatures", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CmsBlogFeatures"); + } + } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 80080860e9..54e4f1a4b8 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -1189,6 +1189,68 @@ namespace Volo.CmsKit.Migrations b.ToTable("CmsBlogs"); }); + modelBuilder.Entity("Volo.CmsKit.Blogs.BlogFeature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("BlogId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("FeatureName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.HasKey("Id"); + + b.ToTable("CmsBlogFeatures"); + }); + modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b => { b.Property("Id") From 32588793191891dd139cb9c4fa55fb454a3e97bb Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 15:14:01 +0300 Subject: [PATCH 019/188] CmsKit - Remove BlogFeatureDataSeedContributor --- .../Blogs/BlogFeatureDataSeeContributor.cs | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeeContributor.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeeContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeeContributor.cs deleted file mode 100644 index c3d8dcce53..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeeContributor.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Volo.Abp.Data; - -namespace Volo.CmsKit.Blogs -{ - public class BlogFeatureDataSeeContributor : IDataSeedContributor - { - public Task SeedAsync(DataSeedContext context) - { - throw new NotImplementedException(); - } - } -} From 24853725630bc49cac35c215a10ce0a2f8932f03 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 15:14:18 +0300 Subject: [PATCH 020/188] CmsKit - Add IBlogFeatureManager --- .../Admin/Blogs/BlogFeatureAdminAppService.cs | 5 +-- .../Volo/CmsKit/Blogs/BlogFeatureManager.cs | 31 +++++++++++++++++++ .../Volo/CmsKit/Blogs/IBlogFeatureManager.cs | 15 +++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureManager.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs index 1831023c19..8e600a3cbd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs @@ -13,6 +13,7 @@ namespace Volo.CmsKit.Admin.Blogs public class BlogFeatureAdminAppService : CmsKitAdminAppServiceBase, IBlogFeatureAdminAppService { protected IBlogFeatureRepository BlogFeatureRepository { get; } + protected IBlogFeatureManager BlogFeatureManager { get; } public BlogFeatureAdminAppService(IBlogFeatureRepository blogFeatureRepository) { @@ -22,9 +23,9 @@ namespace Volo.CmsKit.Admin.Blogs [Authorize(CmsKitAdminPermissions.Blogs.Features)] public async Task> GetListAsync(Guid blogId) { - var list = await BlogFeatureRepository.GetListAsync(blogId); + var blogFeatures = await BlogFeatureManager.GetListAsync(blogId); - return ObjectMapper.Map, List>(list); + return ObjectMapper.Map, List>(blogFeatures); } [Authorize(CmsKitAdminPermissions.Blogs.Features)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs new file mode 100644 index 0000000000..0c4d1c1d94 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; +using Volo.CmsKit.Blogs; + +namespace Volo.CmsKit.Blogs +{ + public class BlogFeatureManager : DomainService, IBlogFeatureManager + { + protected IBlogFeatureRepository BlogFeatureRepository { get; } + + public BlogFeatureManager(IBlogFeatureRepository blogFeatureRepository) + { + BlogFeatureRepository = blogFeatureRepository; + } + + public async Task> GetListAsync(Guid blogId) + { + var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId); + + blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.CommentsFeatureName)); + blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.ReactionsFeatureName)); + blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.RatingsFeatureName)); + + return blogFeatures; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureManager.cs new file mode 100644 index 0000000000..87e721a913 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureManager.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; +using Volo.CmsKit.Blogs; + +namespace Volo.CmsKit.Blogs +{ + public interface IBlogFeatureManager : IDomainService + { + Task> GetListAsync(Guid blogId); + } +} From c1f640dee01ce327af7f7100bc864a0b47a2dece Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 15:24:45 +0300 Subject: [PATCH 021/188] CmsKit - Add IBlogFeatureManager to ctor of AppService --- .../Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs index 8e600a3cbd..d578d00c92 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs @@ -15,9 +15,12 @@ namespace Volo.CmsKit.Admin.Blogs protected IBlogFeatureRepository BlogFeatureRepository { get; } protected IBlogFeatureManager BlogFeatureManager { get; } - public BlogFeatureAdminAppService(IBlogFeatureRepository blogFeatureRepository) + public BlogFeatureAdminAppService( + IBlogFeatureRepository blogFeatureRepository, + IBlogFeatureManager blogFeatureManager) { BlogFeatureRepository = blogFeatureRepository; + BlogFeatureManager = blogFeatureManager; } [Authorize(CmsKitAdminPermissions.Blogs.Features)] From 2384e2c4558e1ab1b58176260715a7c61ef7f755 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 15:41:01 +0300 Subject: [PATCH 022/188] CmsKit - IEquatable implementation for BlogFeature --- .../Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs index eec8223d89..eba38d9c53 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs @@ -5,7 +5,7 @@ using Volo.Abp.Domain.Entities.Auditing; namespace Volo.CmsKit.Blogs { - public class BlogFeature : FullAuditedAggregateRoot + public class BlogFeature : FullAuditedAggregateRoot, IEquatable { protected BlogFeature() // Keep for ORM { @@ -23,5 +23,10 @@ namespace Volo.CmsKit.Blogs public string FeatureName { get; protected set; } public bool Enabled { get; set; } = true; + + public bool Equals(BlogFeature other) + { + return BlogId == other?.BlogId && FeatureName == other?.FeatureName; + } } } From 5381aa23b0472c063ce1265b8e6cbd6498b7d66c Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 15:50:40 +0300 Subject: [PATCH 023/188] CmsKit - Refactor BlogsFeature & Manager --- .../src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs | 4 ---- .../Volo/CmsKit/Blogs/BlogFeatureManager.cs | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs index eba38d9c53..a5c66f4119 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs @@ -7,10 +7,6 @@ namespace Volo.CmsKit.Blogs { public class BlogFeature : FullAuditedAggregateRoot, IEquatable { - protected BlogFeature() // Keep for ORM - { - } - public BlogFeature(Guid blogId, [NotNull] string featureName, bool enabled = true) { BlogId = blogId; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs index 0c4d1c1d94..9393a5e488 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs @@ -21,6 +21,7 @@ namespace Volo.CmsKit.Blogs { var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId); + // TODO: Move them IDefaultBlogFeatureProvider blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.CommentsFeatureName)); blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.ReactionsFeatureName)); blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.RatingsFeatureName)); From 6e32d5a0c4114aed12eb3251c89e0003cb011d96 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 15:51:16 +0300 Subject: [PATCH 024/188] CmsKit - Fix passing wrong BlogId from BlogPost Page --- .../Pages/CmsKit/Blogs/BlogPost.cshtml.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml.cs index 7c3fb4fa64..fb7a8de563 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml.cs @@ -46,17 +46,17 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Blogs if (GlobalFeatureManager.Instance.IsEnabled()) { - CommentsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.Id, BlogPostConsts.CommentsFeatureName); + CommentsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.BlogId, BlogPostConsts.CommentsFeatureName); } if (GlobalFeatureManager.Instance.IsEnabled()) { - ReactionsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.Id, BlogPostConsts.ReactionsFeatureName); + ReactionsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.BlogId, BlogPostConsts.ReactionsFeatureName); } if (GlobalFeatureManager.Instance.IsEnabled()) { - RatingsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.Id, BlogPostConsts.RatingsFeatureName); + RatingsFeature = await BlogFeaturePublicAppService.GetAsync(BlogPost.BlogId, BlogPostConsts.RatingsFeatureName); } } } From b7e106a6d59ffe48b532e885649187ec8d3ca30e Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 16:45:50 +0300 Subject: [PATCH 025/188] CmsKit - Move Default BlogFeatures to IDefaultBlogFeatureProvider --- .../Volo/CmsKit/Blogs/BlogPostConsts.cs | 12 ++++++---- .../Volo/CmsKit/Blogs/BlogFeatureManager.cs | 17 +++++++------- .../DefaultDefaultBlogFeatureProvider.cs | 23 +++++++++++++++++++ .../Blogs/IDefaultBlogFeatureProvider.cs | 14 +++++++++++ 4 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/DefaultDefaultBlogFeatureProvider.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IDefaultBlogFeatureProvider.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostConsts.cs index 2acd2cdeba..7d24f76d09 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostConsts.cs @@ -1,4 +1,6 @@ -namespace Volo.CmsKit.Blogs +using Volo.CmsKit.GlobalFeatures; + +namespace Volo.CmsKit.Blogs { public static class BlogPostConsts { @@ -12,10 +14,12 @@ public const string EntityType = "BlogPost"; - public const string CommentsFeatureName = "Comments"; + public const string CommentsFeatureName = CommentsFeature.Name; + + public const string ReactionsFeatureName = ReactionsFeature.Name; - public const string ReactionsFeatureName = "Reactions"; + public const string RatingsFeatureName = RatingsFeature.Name; - public const string RatingsFeatureName = "Ratings"; + public const string TagsFeatureName = TagsFeature.Name; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs index 9393a5e488..c1ccb0f16f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs @@ -1,10 +1,7 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Volo.Abp.Domain.Services; -using Volo.CmsKit.Blogs; namespace Volo.CmsKit.Blogs { @@ -12,19 +9,23 @@ namespace Volo.CmsKit.Blogs { protected IBlogFeatureRepository BlogFeatureRepository { get; } - public BlogFeatureManager(IBlogFeatureRepository blogFeatureRepository) + protected IDefaultBlogFeatureProvider DefaultBlogFeatureProvider { get; } + + public BlogFeatureManager( + IBlogFeatureRepository blogFeatureRepository, + IDefaultBlogFeatureProvider defaultBlogFeatureProvider) { BlogFeatureRepository = blogFeatureRepository; + DefaultBlogFeatureProvider = defaultBlogFeatureProvider; } public async Task> GetListAsync(Guid blogId) { var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId); - // TODO: Move them IDefaultBlogFeatureProvider - blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.CommentsFeatureName)); - blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.ReactionsFeatureName)); - blogFeatures.AddIfNotContains(new BlogFeature(blogId, BlogPostConsts.RatingsFeatureName)); + var defaultFeatures = await DefaultBlogFeatureProvider.GetDefaultFeaturesAsync(blogId); + + defaultFeatures.ForEach(x => blogFeatures.AddIfNotContains(x)); return blogFeatures; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/DefaultDefaultBlogFeatureProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/DefaultDefaultBlogFeatureProvider.cs new file mode 100644 index 0000000000..f9b2d36800 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/DefaultDefaultBlogFeatureProvider.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.CmsKit.Blogs +{ + public class DefaultDefaultBlogFeatureProvider : IDefaultBlogFeatureProvider, ITransientDependency + { + public Task> GetDefaultFeaturesAsync(Guid blogId) + { + return Task.FromResult(new List + { + new BlogFeature(blogId, BlogPostConsts.CommentsFeatureName), + new BlogFeature(blogId, BlogPostConsts.ReactionsFeatureName), + new BlogFeature(blogId, BlogPostConsts.RatingsFeatureName), + new BlogFeature(blogId, BlogPostConsts.RatingsFeatureName), + }); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IDefaultBlogFeatureProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IDefaultBlogFeatureProvider.cs new file mode 100644 index 0000000000..51234e3cbd --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IDefaultBlogFeatureProvider.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.CmsKit.Blogs; + +namespace Volo.CmsKit.Blogs +{ + public interface IDefaultBlogFeatureProvider + { + Task> GetDefaultFeaturesAsync(Guid blogId); + } +} From cb0afcbe27a8c3a5e725a05ca88fb6335f02448d Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 16 Feb 2021 16:57:15 +0300 Subject: [PATCH 026/188] Added CommentAdminAppService dtos --- .../Volo/CmsKit/Admin/Comments/CommentDto.cs | 21 +++++++++++++++ .../Admin/Comments/CommentGetListInput.cs | 22 +++++++++++++++ .../Admin/Comments/CommentWithDetailsDto.cs | 27 +++++++++++++++++++ .../Admin/Comments/ICommentAdminAppService.cs | 15 +++++++++++ 4 files changed, 85 insertions(+) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithDetailsDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs new file mode 100644 index 0000000000..bf43a1e50a --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs @@ -0,0 +1,21 @@ +using System; + +namespace Volo.CmsKit.Admin.Comments +{ + public class CommentDto + { + public Guid Id { get; set; } + + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public string Text { get; set; } + + public Guid? RepliedCommentId { get; set; } + + public Guid CreatorId { get; set; } + + public DateTime CreationTime { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs new file mode 100644 index 0000000000..2113f93e99 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs @@ -0,0 +1,22 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Volo.CmsKit.Admin.Comments +{ + public class CommentGetListInput : PagedAndSortedResultRequestDto + { + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public string Text { get; set; } + + public Guid? RepliedCommentId { get; set; } + + public Guid CreatorId { get; set; } + + public DateTime CreationStartDate { get; set; } + + public DateTime CreationEndDate { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithDetailsDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithDetailsDto.cs new file mode 100644 index 0000000000..451b30ba86 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithDetailsDto.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using Volo.CmsKit.Users; + +namespace Volo.CmsKit.Admin.Comments +{ + public class CommentWithDetailsDto + { + public Guid Id { get; set; } + + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public string Text { get; set; } + + public Guid? RepliedCommentId { get; set; } + + public Guid CreatorId { get; set; } + + public DateTime CreationTime { get; set; } + + public List Replies { get; set; } + + public CmsUserDto Author { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs new file mode 100644 index 0000000000..54b07c6f0a --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs @@ -0,0 +1,15 @@ +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace Volo.CmsKit.Admin.Comments +{ + public interface ICommentAdminAppService : IApplicationService + { + Task> GetListAsync(CommentGetListInput input); + + Task GetAsync(string entityType, string entityId); + + Task DeleteAsync(string entityType, string entityId); + } +} \ No newline at end of file From 1843bae87137ebf3c1f50d58c12d2d39248793ff Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 16 Feb 2021 18:00:12 +0300 Subject: [PATCH 027/188] Added get comment to CommentAdminAppService --- .../Volo/CmsKit/Admin/Comments/CmsUserDto.cs | 15 +++++++ ...hDetailsDto.cs => CommentWithAuthorDto.cs} | 4 +- .../Admin/Comments/ICommentAdminAppService.cs | 7 ++-- ...CmsKitAdminApplicationAutoMapperProfile.cs | 11 ++++- .../Admin/Comments/CommentAdminAppService.cs | 40 +++++++++++++++++++ .../CmsKit/Comments/ICommentRepository.cs | 2 + .../Comments/EfCoreCommentRepository.cs | 22 ++++++++++ .../Comments/MongoCommentRepository.cs | 22 ++++++++++ 8 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CmsUserDto.cs rename modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/{CommentWithDetailsDto.cs => CommentWithAuthorDto.cs} (84%) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CmsUserDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CmsUserDto.cs new file mode 100644 index 0000000000..90eb3d7fb2 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CmsUserDto.cs @@ -0,0 +1,15 @@ +using System; + +namespace Volo.CmsKit.Admin.Comments +{ + public class CmsUserDto + { + public Guid Id { get; set; } + + public string UserName { get; set; } + + public string Name { get; set; } + + public string Surname { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithDetailsDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs similarity index 84% rename from modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithDetailsDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs index 451b30ba86..833a52180b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithDetailsDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs @@ -4,7 +4,7 @@ using Volo.CmsKit.Users; namespace Volo.CmsKit.Admin.Comments { - public class CommentWithDetailsDto + public class CommentWithAuthorDto { public Guid Id { get; set; } @@ -20,8 +20,6 @@ namespace Volo.CmsKit.Admin.Comments public DateTime CreationTime { get; set; } - public List Replies { get; set; } - public CmsUserDto Author { get; set; } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs index 54b07c6f0a..48fbd2d108 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs @@ -1,4 +1,5 @@ -using System.Linq.Dynamic.Core; +using System; +using System.Linq.Dynamic.Core; using System.Threading.Tasks; using Volo.Abp.Application.Services; @@ -8,8 +9,8 @@ namespace Volo.CmsKit.Admin.Comments { Task> GetListAsync(CommentGetListInput input); - Task GetAsync(string entityType, string entityId); + Task GetAsync(Guid id); - Task DeleteAsync(string entityType, string entityId); + Task DeleteAsync(Guid id); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs index 33a9d9de84..f5624c5046 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs @@ -1,14 +1,18 @@ using AutoMapper; +using Volo.Abp.AutoMapper; using Volo.CmsKit.Admin.Blogs; +using Volo.CmsKit.Admin.Comments; using Volo.CmsKit.Admin.Contents; using Volo.CmsKit.Admin.MediaDescriptors; using Volo.CmsKit.Admin.Pages; using Volo.CmsKit.Blogs; using Volo.CmsKit.Admin.Tags; +using Volo.CmsKit.Comments; using Volo.CmsKit.Contents; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Pages; using Volo.CmsKit.Tags; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Admin { @@ -16,6 +20,12 @@ namespace Volo.CmsKit.Admin { public CmsKitAdminApplicationAutoMapperProfile() { + CreateMap(); + + CreateMap(); + CreateMap() + .Ignore(x=> x.Author); + CreateMap(); CreateMap(MemberList.Destination); @@ -24,7 +34,6 @@ namespace Volo.CmsKit.Admin CreateMap(MemberList.Source); CreateMap(MemberList.Destination); - CreateMap(MemberList.Source); CreateMap(MemberList.Destination) .ReverseMap(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs new file mode 100644 index 0000000000..44c763cd7c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs @@ -0,0 +1,40 @@ +using System; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; +using Volo.CmsKit.Comments; +using Volo.CmsKit.Users; + +namespace Volo.CmsKit.Admin.Comments +{ + public class CommentAdminAppService : CmsKitAdminAppServiceBase, ICommentAdminAppService + { + protected readonly ICommentRepository CommentRepository; + + public CommentAdminAppService(ICommentRepository commentRepository) + { + CommentRepository = commentRepository; + } + + public virtual Task> GetListAsync(CommentGetListInput input) + { + throw new System.NotImplementedException(); + } + + public virtual async Task GetAsync(Guid id) + { + var comment = await CommentRepository.GetWithAuthorAsync(id); + + var dto = ObjectMapper.Map(comment.Comment); + dto.Author = ObjectMapper.Map(comment.Author); + + return dto; + } + + public virtual async Task DeleteAsync(Guid id) + { + var comment = await CommentRepository.GetAsync(id); + + await CommentRepository.DeleteWithRepliesAsync(comment); + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs index 0c61a22f02..523b03dd2f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs @@ -9,6 +9,8 @@ namespace Volo.CmsKit.Comments { public interface ICommentRepository : IBasicRepository { + Task GetWithAuthorAsync(Guid id, CancellationToken cancellationToken = default); + Task> GetListWithAuthorsAsync( [NotNull] string entityType, [NotNull] string entityId, diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs index 40496aaef8..725aa64e89 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs @@ -5,6 +5,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Volo.Abp; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.EntityFrameworkCore; @@ -20,6 +21,27 @@ namespace Volo.CmsKit.Comments { } + public async Task GetWithAuthorAsync(Guid id, CancellationToken cancellationToken = default) + { + var query = from comment in (await GetDbSetAsync()) + join user in (await GetDbContextAsync()).Set() on comment.CreatorId equals user.Id + where id == comment.Id + select new CommentWithAuthorQueryResultItem + { + Comment = comment, + Author = user + }; + + var commentWithAuthor = await query.FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + + if (commentWithAuthor == null) + { + throw new EntityNotFoundException(typeof(Comment), id); + } + + return commentWithAuthor; + } + public async Task> GetListWithAuthorsAsync( string entityType, string entityId, diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs index 5d16c6d55c..7e6a434c3f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using MongoDB.Driver.Linq; using MongoDB.Driver; using Volo.Abp; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; using Volo.CmsKit.Comments; @@ -18,6 +19,27 @@ namespace Volo.CmsKit.MongoDB.Comments { } + public async Task GetWithAuthorAsync(Guid id, CancellationToken cancellationToken = default) + { + var query = from comment in (await GetMongoQueryableAsync(cancellationToken)) + join user in (await GetDbContextAsync(cancellationToken)).CmsUsers on comment.CreatorId equals user.Id + where id == comment.Id + select new CommentWithAuthorQueryResultItem + { + Comment = comment, + Author = user + }; + + var commentWithAuthor = await query.FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + + if (commentWithAuthor == null) + { + throw new EntityNotFoundException(typeof(Comment), id); + } + + return commentWithAuthor; + } + public async Task> GetListWithAuthorsAsync( string entityType, string entityId, From 4630a4c91f9d1ce47625e8af43dfe99fb54c4716 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 16 Feb 2021 18:19:55 +0300 Subject: [PATCH 028/188] CmsKit - Update BlogFeature tests --- .../Blogs/BlogFeatureAdminAppService_Test.cs | 2 +- modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs index 41792902c4..bc310ca681 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs @@ -61,7 +61,7 @@ namespace Volo.CmsKit.Blogs result.ShouldNotBeNull(); result.ShouldNotBeEmpty(); - result.Count.ShouldBe(2); + result.Count.ShouldBeGreaterThan(2); // 2 are seeded and there are built-in Features. } } } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs index 7c72bf68cb..e062ac6c93 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs @@ -93,13 +93,13 @@ namespace Volo.CmsKit public Guid BlogFeature_1_Id { get; internal set; } = Guid.NewGuid(); - public string BlogFeature_1_FeatureName => "Tagging"; + public string BlogFeature_1_FeatureName => "Analytics"; public bool BlogFeature_1_Enabled => true; public Guid BlogFeature_2_Id { get; internal set; } = Guid.NewGuid(); - public string BlogFeature_2_FeatureName => "Rating"; + public string BlogFeature_2_FeatureName => "Hotjar"; public bool BlogFeature_2_Enabled => false; From 681414dcd744143bc04ed5caa3d7e67c5a540d4f Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 16 Feb 2021 18:37:39 +0300 Subject: [PATCH 029/188] Added getlist to comment appservice and repositories --- .../Admin/Comments/CommentGetListInput.cs | 2 + .../Admin/Comments/ICommentAdminAppService.cs | 4 +- .../Admin/Comments/CommentAdminAppService.cs | 30 ++++++- .../CmsKit/Comments/ICommentRepository.cs | 25 ++++++ .../Comments/EfCoreCommentRepository.cs | 72 +++++++++++++++++ .../Comments/MongoCommentRepository.cs | 79 ++++++++++++++++++- 6 files changed, 207 insertions(+), 5 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs index 2113f93e99..69462870ff 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs @@ -5,6 +5,8 @@ namespace Volo.CmsKit.Admin.Comments { public class CommentGetListInput : PagedAndSortedResultRequestDto { + public string Filter { get; set; } + public string EntityType { get; set; } public string EntityId { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs index 48fbd2d108..d6903c0cc5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs @@ -1,13 +1,13 @@ using System; -using System.Linq.Dynamic.Core; using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; namespace Volo.CmsKit.Admin.Comments { public interface ICommentAdminAppService : IApplicationService { - Task> GetListAsync(CommentGetListInput input); + Task> GetListAsync(CommentGetListInput input); Task GetAsync(Guid id); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs index 44c763cd7c..a8e8faf6a2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using System.Linq.Dynamic.Core; using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; using Volo.CmsKit.Comments; using Volo.CmsKit.Users; @@ -15,9 +17,33 @@ namespace Volo.CmsKit.Admin.Comments CommentRepository = commentRepository; } - public virtual Task> GetListAsync(CommentGetListInput input) + public virtual async Task> GetListAsync(CommentGetListInput input) { - throw new System.NotImplementedException(); + var totalCount = await CommentRepository.GetCountAsync( + input.Filter, + input.EntityType, + input.EntityId, + input.RepliedCommentId, + input.CreatorId, + input.CreationStartDate, + input.CreationEndDate); + + var comments = await CommentRepository.GetListAsync( + input.Filter, + input.EntityType, + input.EntityId, + input.RepliedCommentId, + input.CreatorId, + input.CreationStartDate, + input.CreationEndDate, + input.Sorting, + input.MaxResultCount, + input.SkipCount + ); + + var dtos = ObjectMapper.Map, List>(comments); + + return new PagedResultDto(totalCount, dtos); } public virtual async Task GetAsync(Guid id) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs index 523b03dd2f..7ea61d47bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs @@ -10,6 +10,31 @@ namespace Volo.CmsKit.Comments public interface ICommentRepository : IBasicRepository { Task GetWithAuthorAsync(Guid id, CancellationToken cancellationToken = default); + + Task> GetListAsync( + string filter = null, + string entityType = null, + string entityId = null, + Guid? repliedCommentId = null, + Guid? creatorId = null, + DateTime? creationStartDate = null, + DateTime? creationEndDate = null, + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + CancellationToken cancellationToken = default + ); + + Task GetCountAsync( + string filter = null, + string entityType = null, + string entityId = null, + Guid? repliedCommentId = null, + Guid? creatorId = null, + DateTime? creationStartDate = null, + DateTime? creationEndDate = null, + CancellationToken cancellationToken = default + ); Task> GetListWithAuthorsAsync( [NotNull] string entityType, diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs index 725aa64e89..95781ae496 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; @@ -42,6 +43,57 @@ namespace Volo.CmsKit.Comments return commentWithAuthor; } + public async Task> GetListAsync( + string filter = null, + string entityType = null, + string entityId = null, + Guid? repliedCommentId = null, + Guid? creatorId = null, + DateTime? creationStartDate = null, + DateTime? creationEndDate = null, + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + CancellationToken cancellationToken = default + ) + { + var query = await GetListQueryAsync( + filter, + entityType, + entityId, + repliedCommentId, + creatorId, + creationStartDate, + creationEndDate); + + return await query.OrderBy(sorting ?? "creationTime desc") + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public async Task GetCountAsync( + string filter = null, + string entityType = null, + string entityId = null, + Guid? repliedCommentId = null, + Guid? creatorId = null, + DateTime? creationStartDate = null, + DateTime? creationEndDate = null, + CancellationToken cancellationToken = default + ) + { + var query = await GetListQueryAsync( + filter, + entityType, + entityId, + repliedCommentId, + creatorId, + creationStartDate, + creationEndDate); + + return await query.LongCountAsync(GetCancellationToken(cancellationToken)); + } + public async Task> GetListWithAuthorsAsync( string entityType, string entityId, @@ -81,5 +133,25 @@ namespace Volo.CmsKit.Comments await DeleteAsync(comment, cancellationToken: GetCancellationToken(cancellationToken)); } + + protected virtual async Task> GetListQueryAsync( + string filter = null, + string entityType = null, + string entityId = null, + Guid? repliedCommentId = null, + Guid? creatorId = null, + DateTime? creationStartDate = null, + DateTime? creationEndDate = null + ) + { + return (await GetDbSetAsync()) + .WhereIf(!filter.IsNullOrWhiteSpace(), c => c.Text.Contains(filter)) + .WhereIf(!entityType.IsNullOrWhiteSpace(), c => c.EntityType == entityType) + .WhereIf(!entityId.IsNullOrWhiteSpace(), c => c.EntityId == entityId) + .WhereIf(repliedCommentId.HasValue, c => c.RepliedCommentId == repliedCommentId) + .WhereIf(creatorId.HasValue, c => c.CreatorId == creatorId) + .WhereIf(creationStartDate.HasValue, c => c.CreationTime >= creationStartDate) + .WhereIf(creationEndDate.HasValue, c => c.CreationTime <= creationEndDate); + } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs index 7e6a434c3f..78d727b57c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs @@ -1,10 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; -using MongoDB.Driver.Linq; using MongoDB.Driver; +using MongoDB.Driver.Linq; using Volo.Abp; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MongoDB; @@ -40,6 +41,61 @@ namespace Volo.CmsKit.MongoDB.Comments return commentWithAuthor; } + public async Task> GetListAsync( + string filter = null, + string entityType = null, + string entityId = null, + Guid? repliedCommentId = null, + Guid? creatorId = null, + DateTime? creationStartDate = null, + DateTime? creationEndDate = null, + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + CancellationToken cancellationToken = default + ) + { + var query = await GetListQueryAsync( + filter, + entityType, + entityId, + repliedCommentId, + creatorId, + creationStartDate, + creationEndDate, + cancellationToken); + + return await query.OrderBy(sorting ?? "creationTime desc") + .As>() + .PageBy>(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public async Task GetCountAsync( + string filter = null, + string entityType = null, + string entityId = null, + Guid? repliedCommentId = null, + Guid? creatorId = null, + DateTime? creationStartDate = null, + DateTime? creationEndDate = null, + CancellationToken cancellationToken = default + ) + { + var query = await GetListQueryAsync( + filter, + entityType, + entityId, + repliedCommentId, + creatorId, + creationStartDate, + creationEndDate, + cancellationToken); + + return await query.As>() + .LongCountAsync(GetCancellationToken(cancellationToken)); + } + public async Task> GetListWithAuthorsAsync( string entityType, string entityId, @@ -92,5 +148,26 @@ namespace Volo.CmsKit.MongoDB.Comments cancellationToken: GetCancellationToken(cancellationToken) ); } + + protected virtual async Task> GetListQueryAsync( + string filter = null, + string entityType = null, + string entityId = null, + Guid? repliedCommentId = null, + Guid? creatorId = null, + DateTime? creationStartDate = null, + DateTime? creationEndDate = null, + CancellationToken cancellationToken = default + ) + { + return (await GetMongoQueryableAsync(cancellationToken)) + .WhereIf(!filter.IsNullOrWhiteSpace(), c => c.Text.Contains(filter)) + .WhereIf(!entityType.IsNullOrWhiteSpace(), c => c.EntityType == entityType) + .WhereIf(!entityId.IsNullOrWhiteSpace(), c => c.EntityId == entityId) + .WhereIf(repliedCommentId.HasValue, c => c.RepliedCommentId == repliedCommentId) + .WhereIf(creatorId.HasValue, c => c.CreatorId == creatorId) + .WhereIf(creationStartDate.HasValue, c => c.CreationTime >= creationStartDate) + .WhereIf(creationEndDate.HasValue, c => c.CreationTime <= creationEndDate); + } } } From 393f86babf42b4d1af6ba22684cabafb3a068d30 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Tue, 16 Feb 2021 23:33:51 +0300 Subject: [PATCH 030/188] added security header middleware. closes #7752 --- .../AbpApplicationBuilderExtensions.cs | 6 +++ .../Volo.Abp.AspNetCore.csproj | 1 + .../Security/AbpSecurityHeadersMiddleware.cs | 37 +++++++++++++++++++ .../Mvc/AbpAspNetCoreMvcTestModule.cs | 1 + .../app/VoloDocs.Web/VoloDocsWebModule.cs | 4 +- .../MyProjectNameHttpApiHostModule.cs | 1 + .../MyProjectNameHttpApiHostModule.cs | 1 + .../MyProjectNameIdentityServerModule.cs | 1 + .../MyProjectNameWebModule.cs | 1 + .../MyProjectNameWebModule.cs | 1 + 10 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index 568ecfef7b..fab4a4bb80 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Hosting; using Volo.Abp; using Volo.Abp.AspNetCore.Auditing; using Volo.Abp.AspNetCore.ExceptionHandling; +using Volo.Abp.AspNetCore.Security; using Volo.Abp.AspNetCore.Security.Claims; using Volo.Abp.AspNetCore.Tracing; using Volo.Abp.AspNetCore.Uow; @@ -82,5 +83,10 @@ namespace Microsoft.AspNetCore.Builder { return app.UseMiddleware(); } + + public static void UseAbpSecurityHeaders(this IApplicationBuilder app) + { + app.UseMiddleware(); + } } } diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index b191872339..eaa053c91a 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -25,6 +25,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs new file mode 100644 index 0000000000..09dddfabe7 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs @@ -0,0 +1,37 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Volo.Abp.AspNetCore.Security +{ + public class AbpSecurityHeadersMiddleware + { + private readonly RequestDelegate _next; + + public AbpSecurityHeadersMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext httpContext) + { + /*X-Content-Type-Options header tells the browser to not try and “guess” what a mimetype of a resource might be, and to just take what mimetype the server has returned as fact.*/ + AddHeaderIfNotExists(httpContext, "X-Content-Type-Options", "nosniff"); + + /*X-XSS-Protection is a feature of Internet Explorer, Chrome and Safari that stops pages from loading when they detect reflected cross-site scripting (XSS) attacks*/ + AddHeaderIfNotExists(httpContext, "X-XSS-Protection", "1; mode=block"); + + /*The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a ,