From 24498a052d7fb2900db45e45023bd3054e6fe2f3 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 22 Apr 2021 10:18:27 +0800 Subject: [PATCH 001/129] Introduce the SimpleStateChecker. --- .../Toolbars/ToolbarItem.cs | 8 +- .../Toolbars/ToolbarManager.cs | 21 ++-- .../Permissions/AbpPermissionOptions.cs | 3 - .../Permissions/IPermissionStateManager.cs | 9 -- .../Permissions/IPermissionStateProvider.cs | 9 -- .../Permissions/PermissionDefinition.cs | 7 +- .../PermissionDefinitionExtensions.cs | 19 --- .../PermissionSimpleStateCheckerExtensions.cs | 53 +++++++++ ...quirePermissionsSimpleBatchStateChecker.cs | 57 +++++++++ ...PermissionsSimpleBatchStateCheckerModel.cs | 24 ++++ .../RequirePermissionsSimpleStateChecker.cs | 34 ++++++ .../Permissions/PermissionChecker.cs | 11 +- .../Permissions/PermissionStateManager.cs | 51 -------- .../InternalServiceCollectionExtensions.cs | 3 + .../AbpSimpleStateCheckerOptions.cs | 15 +++ .../IHasSimpleStateCheckers.cs | 10 ++ .../ISimpleBatchStateChecker.cs | 10 ++ .../ISimpleStateChecker.cs | 10 ++ .../ISimpleStateCheckerManager.cs | 12 ++ .../SimpleBatchStateCheckerBase.cs | 16 +++ .../SimpleBatchStateCheckerContext.cs | 18 +++ .../SimpleStateCheckerContext.cs | 18 +++ .../SimpleStateCheckerManager.cs | 112 ++++++++++++++++++ .../SimpleStateCheckerResult.cs | 21 ++++ .../FeatureSimpleStateCheckerExtensions.cs | 30 +++++ .../PermissionDefinitionExtensions.cs | 28 ----- .../RequireFeaturesPermissionStateProvider.cs | 32 ----- .../RequireFeaturesSimpleStateChecker.cs | 32 +++++ .../GlobalFeatureDefinitionExtensions.cs | 50 -------- ...obalFeatureSimpleStateCheckerExtensions.cs | 51 ++++++++ ...equireGlobalFeaturesSimpleStateChecker.cs} | 15 +-- .../Abp/Ui/Navigation/ApplicationMenuItem.cs | 8 +- .../Volo/Abp/Ui/Navigation/MenuManager.cs | 41 ++++--- .../UI/Theme/Shared/Toolbars/Toolbar_Tests.cs | 7 +- .../PermissionStateProvider_Tests.cs | 20 ++-- ...equireRolePermissionSimpleStateChecker.cs} | 5 +- ...ireEditionPermissionSimpleStateChecker.cs} | 5 +- ...izationTestPermissionDefinitionProvider.cs | 2 +- .../Volo/Abp/AbpTestModule.cs | 9 ++ .../SimpleStateCheckerTestBase.cs | 105 ++++++++++++++++ .../SimpleStateChecker_CheckCount_Test.cs | 81 +++++++++++++ ...impleStateChecker_GlobalCheckCount_Test.cs | 95 +++++++++++++++ .../SimpleStateChecker_Tests.cs | 105 ++++++++++++++++ .../Abp/Ui/Navigation/MenuManager_Tests.cs | 13 +- .../BloggingAdminMenuContributor.cs | 5 +- .../Navigation/DocsMenuContributor.cs | 5 +- .../AbpIdentityWebMainMenuContributor.cs | 7 +- .../AbpIdentityWebMainMenuContributor.cs | 5 +- .../PermissionAppService.cs | 9 +- .../PermissionManagement/PermissionManager.cs | 11 +- .../TestPermissionDefinitionProvider.cs | 2 +- .../TestRequireRolePermissionStateProvider.cs | 5 +- .../TenantManagementBlazorMenuContributor.cs | 6 +- ...pTenantManagementWebMainMenuContributor.cs | 3 +- 54 files changed, 1052 insertions(+), 291 deletions(-) delete mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionStateManager.cs delete mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionStateProvider.cs delete mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionExtensions.cs create mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs create mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs create mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs create mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs delete mode 100644 framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionStateManager.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/AbpSimpleStateCheckerOptions.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/IHasSimpleStateCheckers.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleBatchStateChecker.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateChecker.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerManager.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleBatchStateCheckerBase.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleBatchStateCheckerContext.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerContext.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerManager.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerResult.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureSimpleStateCheckerExtensions.cs delete mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/PermissionDefinitionExtensions.cs delete mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesPermissionStateProvider.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesSimpleStateChecker.cs delete mode 100644 framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDefinitionExtensions.cs create mode 100644 framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureSimpleStateCheckerExtensions.cs rename framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/{RequireGlobalFeaturesPermissionStateProvider.cs => RequireGlobalFeaturesSimpleStateChecker.cs} (61%) rename framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/{TestGlobalRequireRolePermissionStateProvider.cs => TestGlobalRequireRolePermissionSimpleStateChecker.cs} (65%) rename framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/{TestRequireEditionPermissionStateProvider.cs => TestRequireEditionPermissionSimpleStateChecker.cs} (66%) create mode 100644 framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpTestModule.cs create mode 100644 framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateCheckerTestBase.cs create mode 100644 framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_CheckCount_Test.cs create mode 100644 framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_GlobalCheckCount_Test.cs create mode 100644 framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_Tests.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarItem.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarItem.cs index 4676202c24..f884e3436b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarItem.cs @@ -1,9 +1,11 @@ using System; +using System.Collections.Generic; using JetBrains.Annotations; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars { - public class ToolbarItem + public class ToolbarItem : IHasSimpleStateCheckers { public Type ComponentType { @@ -15,13 +17,17 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars public int Order { get; set; } [CanBeNull] + [Obsolete("Use RequirePermissions extension method.")] public string RequiredPermissionName { get; set; } + public List> SimpleStateCheckers { get; } + public ToolbarItem([NotNull] Type componentType, int order = 0, string requiredPermissionName = null) { Order = order; ComponentType = Check.NotNull(componentType, nameof(componentType)); RequiredPermissionName = requiredPermissionName; + SimpleStateCheckers = new List>(); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs index 2e97cebecb..b8e1e4687b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc.UI.Theming; using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars { @@ -15,13 +16,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars protected IThemeManager ThemeManager { get; } protected AbpToolbarOptions Options { get; } protected IServiceProvider ServiceProvider { get; } + protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } public ToolbarManager( IOptions options, IServiceProvider serviceProvider, - IThemeManager themeManager) + IThemeManager themeManager, + ISimpleStateCheckerManager simpleStateCheckerManager) { ThemeManager = themeManager; + SimpleStateCheckerManager = simpleStateCheckerManager; ServiceProvider = serviceProvider; Options = options.Value; } @@ -47,17 +51,20 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars protected virtual async Task CheckPermissionsAsync(IServiceProvider serviceProvider, Toolbar toolbar) { - var requiredPermissionItems = toolbar.Items.Where(x => !x.RequiredPermissionName.IsNullOrWhiteSpace()).ToList(); + foreach (var item in toolbar.Items.Where(x => !x.RequiredPermissionName.IsNullOrWhiteSpace())) + { + item.RequirePermissions(item.RequiredPermissionName); + } - if (requiredPermissionItems.Any()) + var checkPermissionsToolbarItems = toolbar.Items.Where(x => x.SimpleStateCheckers.Any()).ToArray(); + if (checkPermissionsToolbarItems.Any()) { - var permissionChecker = serviceProvider.GetRequiredService(); - var grantResult = await permissionChecker.IsGrantedAsync(requiredPermissionItems.Select(x => x.RequiredPermissionName).Distinct().ToArray()); + var result = await SimpleStateCheckerManager.IsEnabledAsync(checkPermissionsToolbarItems); var toBeDeleted = new HashSet(); - foreach (var item in requiredPermissionItems) + foreach (var item in checkPermissionsToolbarItems) { - if (grantResult.Result[item.RequiredPermissionName!] != PermissionGrantResult.Granted) + if (!result[item]) { toBeDeleted.Add(item); } diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/AbpPermissionOptions.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/AbpPermissionOptions.cs index eb2ac920ac..ce9dc06798 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/AbpPermissionOptions.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/AbpPermissionOptions.cs @@ -8,13 +8,10 @@ namespace Volo.Abp.Authorization.Permissions public ITypeList ValueProviders { get; } - public ITypeList GlobalStateProviders { get; } - public AbpPermissionOptions() { DefinitionProviders = new TypeList(); ValueProviders = new TypeList(); - GlobalStateProviders = new TypeList(); } } } diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionStateManager.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionStateManager.cs deleted file mode 100644 index 6195e02545..0000000000 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionStateManager.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace Volo.Abp.Authorization.Permissions -{ - public interface IPermissionStateManager - { - Task IsEnabledAsync(PermissionDefinition permission); - } -} diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionStateProvider.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionStateProvider.cs deleted file mode 100644 index 7bc3087f50..0000000000 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionStateProvider.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace Volo.Abp.Authorization.Permissions -{ - public interface IPermissionStateProvider - { - Task IsEnabledAsync(PermissionStateContext context); - } -} diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs index ac525367ad..bf2dcbded7 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs @@ -3,10 +3,11 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Volo.Abp.Localization; using Volo.Abp.MultiTenancy; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.Authorization.Permissions { - public class PermissionDefinition + public class PermissionDefinition : IHasSimpleStateCheckers { /// /// Unique name of the permission. @@ -31,7 +32,7 @@ namespace Volo.Abp.Authorization.Permissions /// public List Providers { get; } //TODO: Rename to AllowedProviders? - public List StateProviders { get; } + public List> SimpleStateCheckers { get; } public ILocalizableString DisplayName { @@ -88,7 +89,7 @@ namespace Volo.Abp.Authorization.Permissions Properties = new Dictionary(); Providers = new List(); - StateProviders = new List(); + SimpleStateCheckers = new List>(); _children = new List(); } diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionExtensions.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionExtensions.cs deleted file mode 100644 index 7e5de5a1f1..0000000000 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionExtensions.cs +++ /dev/null @@ -1,19 +0,0 @@ -using JetBrains.Annotations; - -namespace Volo.Abp.Authorization.Permissions -{ - public static class PermissionDefinitionExtensions - { - public static PermissionDefinition AddStateProviders( - [NotNull] this PermissionDefinition permissionDefinition, - [NotNull] params IPermissionStateProvider[] permissionStateProviders) - { - Check.NotNull(permissionDefinition, nameof(permissionDefinition)); - Check.NotNull(permissionStateProviders, nameof(permissionStateProviders)); - - permissionDefinition.StateProviders.AddRange(permissionStateProviders); - - return permissionDefinition; - } - } -} diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs new file mode 100644 index 0000000000..56b50ab50a --- /dev/null +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs @@ -0,0 +1,53 @@ +using JetBrains.Annotations; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.Authorization.Permissions +{ + public static class PermissionSimpleStateCheckerExtensions + { + public static TState RequirePermissions( + [NotNull] this TState state, + params string[] permissions) + where TState : IHasSimpleStateCheckers + { + state.RequirePermissions(requiresAll: true, batchCheck: true, permissions); + return state; + } + + public static TState RequirePermissions( + [NotNull] this TState state, + bool requiresAll, + params string[] permissions) + where TState : IHasSimpleStateCheckers + { + state.RequirePermissions(requiresAll: requiresAll, batchCheck: true, permissions); + return state; + } + + public static TState RequirePermissions( + [NotNull] this TState state, + bool requiresAll, + bool batchCheck = true, + params string[] permissions) + where TState : IHasSimpleStateCheckers + { + Check.NotNull(state, nameof(state)); + Check.NotNullOrEmpty(permissions, nameof(permissions)); + + if (batchCheck) + { + lock (state) + { + RequirePermissionsSimpleBatchStateChecker.Instance.AddCheckModels(new RequirePermissionsSimpleBatchStateCheckerModel(state, permissions, requiresAll)); + state.SimpleStateCheckers.Add(RequirePermissionsSimpleBatchStateChecker.Instance); + } + } + else + { + state.SimpleStateCheckers.Add(new RequirePermissionsSimpleStateChecker(new RequirePermissionsSimpleBatchStateCheckerModel(state, permissions, requiresAll))); + } + + return state; + } + } +} diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs new file mode 100644 index 0000000000..5cce51ec51 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.Authorization.Permissions +{ + public class RequirePermissionsSimpleBatchStateChecker : SimpleBatchStateCheckerBase + where TState : IHasSimpleStateCheckers + { + public static readonly RequirePermissionsSimpleBatchStateChecker Instance = new RequirePermissionsSimpleBatchStateChecker(); + + private readonly List> _models; + + public RequirePermissionsSimpleBatchStateChecker() + { + _models = new List>(); + } + + public RequirePermissionsSimpleBatchStateChecker AddCheckModels(params RequirePermissionsSimpleBatchStateCheckerModel[] models) + { + Check.NotNullOrEmpty(models, nameof(models)); + + _models.AddRange(models); + return this; + } + + public override async Task> IsEnabledAsync(SimpleBatchStateCheckerContext context) + { + var permissionChecker = context.ServiceProvider.GetRequiredService(); + + var result = new SimpleStateCheckerResult(context.States); + + var permissions = _models.Where(x => context.States.Any(s => s.Equals(x.State))).SelectMany(x => x.Permissions).Distinct().ToArray(); + var grantResult = await permissionChecker.IsGrantedAsync(permissions); + + foreach (var state in context.States) + { + var model = _models.FirstOrDefault(x => x.State.Equals(state)); + if (model != null) + { + if (model.RequiresAll) + { + result[model.State] = model.Permissions.All(x => grantResult.Result.Any(y => y.Key == x && y.Value == PermissionGrantResult.Granted)); + } + else + { + result[model.State] = grantResult.Result.Any(x => model.Permissions.Contains(x.Key) && x.Value == PermissionGrantResult.Granted); + } + } + } + + return result; + } + } +} diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs new file mode 100644 index 0000000000..3660d10f46 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs @@ -0,0 +1,24 @@ +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.Authorization.Permissions +{ + public class RequirePermissionsSimpleBatchStateCheckerModel + where TState : IHasSimpleStateCheckers + { + public TState State { get; } + + public string[] Permissions { get; } + + public bool RequiresAll { get; } + + public RequirePermissionsSimpleBatchStateCheckerModel(TState state, string[] permissions, bool requiresAll = true) + { + Check.NotNull(state, nameof(state)); + Check.NotNullOrEmpty(permissions, nameof(permissions)); + + State = state; + Permissions = permissions; + RequiresAll = requiresAll; + } + } +} diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs new file mode 100644 index 0000000000..32cedeecc6 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs @@ -0,0 +1,34 @@ +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.Authorization.Permissions +{ + public class RequirePermissionsSimpleStateChecker : ISimpleStateChecker + where TState : IHasSimpleStateCheckers + { + private readonly RequirePermissionsSimpleBatchStateCheckerModel _model; + + public RequirePermissionsSimpleStateChecker(RequirePermissionsSimpleBatchStateCheckerModel model) + { + _model = model; + } + + public async Task IsEnabledAsync(SimpleStateCheckerContext context) + { + var permissionChecker = context.ServiceProvider.GetRequiredService(); + + if (_model.Permissions.Length == 1) + { + return await permissionChecker.IsGrantedAsync(_model.Permissions.First()); + } + + var grantResult = await permissionChecker.IsGrantedAsync(_model.Permissions); + + return _model.RequiresAll + ? grantResult.AllGranted + : grantResult.Result.Any(x => _model.Permissions.Contains(x.Key) && x.Value == PermissionGrantResult.Granted); + } + } +} diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs index f180a00bd7..d4f6e26d94 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.MultiTenancy; using Volo.Abp.Security.Claims; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.Authorization.Permissions { @@ -15,20 +16,20 @@ namespace Volo.Abp.Authorization.Permissions protected ICurrentPrincipalAccessor PrincipalAccessor { get; } protected ICurrentTenant CurrentTenant { get; } protected IPermissionValueProviderManager PermissionValueProviderManager { get; } - protected IPermissionStateManager PermissionStateManager { get; } + protected ISimpleStateCheckerManager PermissionSimpleStateCheckerManager { get; } public PermissionChecker( ICurrentPrincipalAccessor principalAccessor, IPermissionDefinitionManager permissionDefinitionManager, ICurrentTenant currentTenant, IPermissionValueProviderManager permissionValueProviderManager, - IPermissionStateManager permissionStateManager) + ISimpleStateCheckerManager permissionSimpleStateCheckerManager) { PrincipalAccessor = principalAccessor; PermissionDefinitionManager = permissionDefinitionManager; CurrentTenant = currentTenant; PermissionValueProviderManager = permissionValueProviderManager; - PermissionStateManager = permissionStateManager; + PermissionSimpleStateCheckerManager = permissionSimpleStateCheckerManager; } public virtual async Task IsGrantedAsync(string name) @@ -49,7 +50,7 @@ namespace Volo.Abp.Authorization.Permissions return false; } - if (!await PermissionStateManager.IsEnabledAsync(permission)) + if (!await PermissionSimpleStateCheckerManager.IsEnabledAsync(permission)) { return false; } @@ -112,7 +113,7 @@ namespace Volo.Abp.Authorization.Permissions result.Result.Add(name, PermissionGrantResult.Undefined); if (permission.IsEnabled && - await PermissionStateManager.IsEnabledAsync(permission) && + await PermissionSimpleStateCheckerManager.IsEnabledAsync(permission) && permission.MultiTenancySide.HasFlag(multiTenancySide)) { permissionDefinitions.Add(permission); diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionStateManager.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionStateManager.cs deleted file mode 100644 index 957ed3c7a6..0000000000 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionStateManager.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Authorization.Permissions -{ - public class PermissionStateManager : IPermissionStateManager, ITransientDependency - { - protected IServiceProvider ServiceProvider { get; } - protected AbpPermissionOptions Options { get; } - - public PermissionStateManager(IServiceProvider serviceProvider, IOptions options) - { - ServiceProvider = serviceProvider; - Options = options.Value; - } - - public async Task IsEnabledAsync(PermissionDefinition permission) - { - using (var scope = ServiceProvider.CreateScope()) - { - var context = new PermissionStateContext - { - Permission = permission, - ServiceProvider = scope.ServiceProvider.GetRequiredService() - }; - - foreach (var provider in permission.StateProviders) - { - if (!await provider.IsEnabledAsync(context)) - { - return false; - } - } - - foreach (IPermissionStateProvider provider in Options.GlobalStateProviders.Select(x => ServiceProvider.GetRequiredService(x))) - { - if (!await provider.IsEnabledAsync(context)) - { - return false; - } - } - - return true; - } - } - } -} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs index ee06003204..5c729b4197 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.Logging; using Volo.Abp.Modularity; using Volo.Abp.Reflection; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.Internal { @@ -40,6 +41,8 @@ namespace Volo.Abp.Internal services.AddAssemblyOf(); + services.AddTransient(typeof(ISimpleStateCheckerManager<>), typeof(SimpleStateCheckerManager<>)); + services.Configure(options => { options.Contributors.Add(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/AbpSimpleStateCheckerOptions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/AbpSimpleStateCheckerOptions.cs new file mode 100644 index 0000000000..bdc756fdb8 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/AbpSimpleStateCheckerOptions.cs @@ -0,0 +1,15 @@ +using Volo.Abp.Collections; + +namespace Volo.Abp.SimpleStateChecking +{ + public class AbpSimpleStateCheckerOptions + where TState : IHasSimpleStateCheckers + { + public ITypeList> GlobalSimpleStateCheckers { get; } + + public AbpSimpleStateCheckerOptions() + { + GlobalSimpleStateCheckers = new TypeList>(); + } + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/IHasSimpleStateCheckers.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/IHasSimpleStateCheckers.cs new file mode 100644 index 0000000000..cf5a7df6fb --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/IHasSimpleStateCheckers.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Volo.Abp.SimpleStateChecking +{ + public interface IHasSimpleStateCheckers + where TState : IHasSimpleStateCheckers + { + List> SimpleStateCheckers { get; } + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleBatchStateChecker.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleBatchStateChecker.cs new file mode 100644 index 0000000000..ff364ff223 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleBatchStateChecker.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.SimpleStateChecking +{ + public interface ISimpleBatchStateChecker : ISimpleStateChecker + where TState : IHasSimpleStateCheckers + { + Task> IsEnabledAsync(SimpleBatchStateCheckerContext context); + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateChecker.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateChecker.cs new file mode 100644 index 0000000000..6d50044520 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateChecker.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.SimpleStateChecking +{ + public interface ISimpleStateChecker + where TState : IHasSimpleStateCheckers + { + Task IsEnabledAsync(SimpleStateCheckerContext context); + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerManager.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerManager.cs new file mode 100644 index 0000000000..4ea98f7e68 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerManager.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.SimpleStateChecking +{ + public interface ISimpleStateCheckerManager + where TState : IHasSimpleStateCheckers + { + Task IsEnabledAsync(TState state); + + Task> IsEnabledAsync(TState[] states); + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleBatchStateCheckerBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleBatchStateCheckerBase.cs new file mode 100644 index 0000000000..43b2e2a6fe --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleBatchStateCheckerBase.cs @@ -0,0 +1,16 @@ +using System.Linq; +using System.Threading.Tasks; + +namespace Volo.Abp.SimpleStateChecking +{ + public abstract class SimpleBatchStateCheckerBase: ISimpleBatchStateChecker + where TState : IHasSimpleStateCheckers + { + public async Task IsEnabledAsync(SimpleStateCheckerContext context) + { + return (await IsEnabledAsync(new SimpleBatchStateCheckerContext(context.ServiceProvider, new[] {context.State}))).Values.All(x => x); + } + + public abstract Task> IsEnabledAsync(SimpleBatchStateCheckerContext context); + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleBatchStateCheckerContext.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleBatchStateCheckerContext.cs new file mode 100644 index 0000000000..ae5826a3e1 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleBatchStateCheckerContext.cs @@ -0,0 +1,18 @@ +using System; + +namespace Volo.Abp.SimpleStateChecking +{ + public class SimpleBatchStateCheckerContext + where TState : IHasSimpleStateCheckers + { + public IServiceProvider ServiceProvider { get; } + + public TState[] States { get; } + + public SimpleBatchStateCheckerContext(IServiceProvider serviceProvider, TState[] states) + { + ServiceProvider = serviceProvider; + States = states; + } + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerContext.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerContext.cs new file mode 100644 index 0000000000..04e9da4720 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerContext.cs @@ -0,0 +1,18 @@ +using System; + +namespace Volo.Abp.SimpleStateChecking +{ + public class SimpleStateCheckerContext + where TState : IHasSimpleStateCheckers + { + public IServiceProvider ServiceProvider { get; } + + public TState State { get; } + + public SimpleStateCheckerContext(IServiceProvider serviceProvider, TState state) + { + ServiceProvider = serviceProvider; + State = state; + } + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerManager.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerManager.cs new file mode 100644 index 0000000000..22831d8674 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerManager.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.SimpleStateChecking +{ + public class SimpleStateCheckerManager : ISimpleStateCheckerManager + where TState : IHasSimpleStateCheckers + { + protected IServiceProvider ServiceProvider { get; } + + protected AbpSimpleStateCheckerOptions Options { get; } + + public SimpleStateCheckerManager(IServiceProvider serviceProvider, IOptions> options) + { + ServiceProvider = serviceProvider; + Options = options.Value; + } + + public virtual async Task IsEnabledAsync(TState state) + { + return await InternalIsEnabledAsync(state, true); + } + + public virtual async Task> IsEnabledAsync(TState[] states) + { + var result = new SimpleStateCheckerResult(states); + + using (var scope = ServiceProvider.CreateScope()) + { + var batchStateCheckers = states.SelectMany(x => x.SimpleStateCheckers) + .Where(x => x is ISimpleBatchStateChecker) + .Cast>() + .GroupBy(x => x) + .Select(x => x.Key); + + foreach (var stateChecker in batchStateCheckers) + { + var context = new SimpleBatchStateCheckerContext( + scope.ServiceProvider.GetRequiredService(), + states.Where(x => x.SimpleStateCheckers.Contains(stateChecker)).ToArray()); + + foreach (var x in await stateChecker.IsEnabledAsync(context)) + { + result[x.Key] = x.Value; + } + + if (result.Values.All(x => !x)) + { + return result; + } + } + + foreach (ISimpleBatchStateChecker globalStateChecker in Options.GlobalSimpleStateCheckers + .Where(x => typeof(ISimpleBatchStateChecker).IsAssignableFrom(x)) + .Select(x => ServiceProvider.GetRequiredService(x))) + { + var context = new SimpleBatchStateCheckerContext( + scope.ServiceProvider.GetRequiredService(), + states.Where(x => result.Any(y => y.Key.Equals(x) && y.Value)).ToArray()); + + foreach (var x in await globalStateChecker.IsEnabledAsync(context)) + { + result[x.Key] = x.Value; + } + } + + foreach (var state in states) + { + if (result[state]) + { + result[state] = await InternalIsEnabledAsync(state, false); + } + } + + return result; + } + } + + protected virtual async Task InternalIsEnabledAsync(TState state, bool useBatchChecker) + { + using (var scope = ServiceProvider.CreateScope()) + { + var context = new SimpleStateCheckerContext(scope.ServiceProvider.GetRequiredService(), state); + + foreach (var provider in state.SimpleStateCheckers.WhereIf(!useBatchChecker, x => x is not ISimpleBatchStateChecker)) + { + if (!await provider.IsEnabledAsync(context)) + { + return false; + } + } + + foreach (ISimpleStateChecker provider in Options.GlobalSimpleStateCheckers + .WhereIf(!useBatchChecker, x => !typeof(ISimpleBatchStateChecker).IsAssignableFrom(x)) + .Select(x => ServiceProvider.GetRequiredService(x))) + { + if (!await provider.IsEnabledAsync(context)) + { + return false; + } + } + + return true; + } + } + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerResult.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerResult.cs new file mode 100644 index 0000000000..a3c1dc8020 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerResult.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; + +namespace Volo.Abp.SimpleStateChecking +{ + public class SimpleStateCheckerResult : Dictionary + where TState : IHasSimpleStateCheckers + { + public SimpleStateCheckerResult() + { + + } + + public SimpleStateCheckerResult(IEnumerable states, bool initValue = true) + { + foreach (var state in states) + { + Add(state, initValue); + } + } + } +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureSimpleStateCheckerExtensions.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureSimpleStateCheckerExtensions.cs new file mode 100644 index 0000000000..b05a5f9d7a --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureSimpleStateCheckerExtensions.cs @@ -0,0 +1,30 @@ +using JetBrains.Annotations; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.Features +{ + public static class FeatureSimpleStateCheckerExtensions + { + public static TState RequireFeatures( + [NotNull] this TState state, + params string[] features) + where TState : IHasSimpleStateCheckers + { + state.RequireFeatures(true, features); + return state; + } + + public static TState RequireFeatures( + [NotNull] this TState state, + bool requiresAll, + params string[] features) + where TState : IHasSimpleStateCheckers + { + Check.NotNull(state, nameof(state)); + Check.NotNullOrEmpty(features, nameof(features)); + + state.SimpleStateCheckers.Add(new RequireFeaturesSimpleStateChecker(requiresAll, features)); + return state; + } + } +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/PermissionDefinitionExtensions.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/PermissionDefinitionExtensions.cs deleted file mode 100644 index a213232f2f..0000000000 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/PermissionDefinitionExtensions.cs +++ /dev/null @@ -1,28 +0,0 @@ -using JetBrains.Annotations; -using Volo.Abp.Authorization.Permissions; - -namespace Volo.Abp.Features -{ - public static class FeatureDefinitionExtensions - { - public static PermissionDefinition RequireFeatures( - [NotNull] this PermissionDefinition permissionDefinition, - params string[] features) - { - return permissionDefinition.RequireFeatures(true, features); - } - - public static PermissionDefinition RequireFeatures( - [NotNull] this PermissionDefinition permissionDefinition, - bool requiresAll, - params string[] features) - { - Check.NotNull(permissionDefinition, nameof(permissionDefinition)); - Check.NotNullOrEmpty(features, nameof(features)); - - return permissionDefinition.AddStateProviders( - new RequireFeaturesPermissionStateProvider(requiresAll, features) - ); - } - } -} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesPermissionStateProvider.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesPermissionStateProvider.cs deleted file mode 100644 index 0fee54c598..0000000000 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesPermissionStateProvider.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Authorization.Permissions; - -namespace Volo.Abp.Features -{ - public class RequireFeaturesPermissionStateProvider : IPermissionStateProvider - { - private readonly string[] _featureNames; - private readonly bool _requiresAll; - - public RequireFeaturesPermissionStateProvider(params string[] featureNames) - : this(true, featureNames) - { - - } - - public RequireFeaturesPermissionStateProvider(bool requiresAll, params string[] featureNames) - { - Check.NotNullOrEmpty(featureNames, nameof(featureNames)); - - _requiresAll = requiresAll; - _featureNames = featureNames; - } - - public async Task IsEnabledAsync(PermissionStateContext context) - { - var feature = context.ServiceProvider.GetRequiredService(); - return await feature.IsEnabledAsync(_requiresAll, _featureNames); - } - } -} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesSimpleStateChecker.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesSimpleStateChecker.cs new file mode 100644 index 0000000000..1a4c028653 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesSimpleStateChecker.cs @@ -0,0 +1,32 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.Features +{ + public class RequireFeaturesSimpleStateChecker : ISimpleStateChecker + where TState : IHasSimpleStateCheckers + { + private readonly string[] _featureNames; + private readonly bool _requiresAll; + + public RequireFeaturesSimpleStateChecker(params string[] featureNames) + : this(true, featureNames) + { + } + + public RequireFeaturesSimpleStateChecker(bool requiresAll, params string[] featureNames) + { + Check.NotNullOrEmpty(featureNames, nameof(featureNames)); + + _requiresAll = requiresAll; + _featureNames = featureNames; + } + + public async Task IsEnabledAsync(SimpleStateCheckerContext context) + { + var featureChecker = context.ServiceProvider.GetRequiredService(); + return await featureChecker.IsEnabledAsync(_requiresAll, _featureNames); + } + } +} diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDefinitionExtensions.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDefinitionExtensions.cs deleted file mode 100644 index 299994e695..0000000000 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDefinitionExtensions.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using JetBrains.Annotations; -using Volo.Abp.Authorization.Permissions; - -namespace Volo.Abp.GlobalFeatures -{ - public static class GlobalFeatureDefinitionExtensions - { - public static PermissionDefinition RequireGlobalFeatures( - this PermissionDefinition permissionDefinition, - params string[] globalFeatures) - { - return permissionDefinition.RequireGlobalFeatures(true, globalFeatures); - } - - public static PermissionDefinition RequireGlobalFeatures( - [NotNull] this PermissionDefinition permissionDefinition, - bool requiresAll, - params string[] globalFeatures) - { - Check.NotNull(permissionDefinition, nameof(permissionDefinition)); - Check.NotNullOrEmpty(globalFeatures, nameof(globalFeatures)); - - return permissionDefinition.AddStateProviders( - new RequireGlobalFeaturesPermissionStateProvider(requiresAll, globalFeatures) - ); - } - - public static PermissionDefinition RequireGlobalFeatures( - this PermissionDefinition permissionDefinition, - params Type[] globalFeatures) - { - return permissionDefinition.RequireGlobalFeatures(true, globalFeatures); - } - - public static PermissionDefinition RequireGlobalFeatures( - [NotNull] this PermissionDefinition permissionDefinition, - bool requiresAll, - params Type[] globalFeatures) - { - Check.NotNull(permissionDefinition, nameof(permissionDefinition)); - Check.NotNullOrEmpty(globalFeatures, nameof(globalFeatures)); - - return permissionDefinition.AddStateProviders( - new RequireGlobalFeaturesPermissionStateProvider(requiresAll, globalFeatures) - ); - } - - } -} diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureSimpleStateCheckerExtensions.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureSimpleStateCheckerExtensions.cs new file mode 100644 index 0000000000..dab3aa5b0e --- /dev/null +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureSimpleStateCheckerExtensions.cs @@ -0,0 +1,51 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.GlobalFeatures +{ + public static class GlobalFeatureSimpleStateCheckerExtensions + { + public static TState RequireGlobalFeatures( + [NotNull] this TState state, + params string[] globalFeatures) + where TState : IHasSimpleStateCheckers + { + return state.RequireGlobalFeatures(true, globalFeatures); + } + + public static TState RequireGlobalFeatures( + [NotNull] this TState state, + bool requiresAll, + params string[] globalFeatures) + where TState : IHasSimpleStateCheckers + { + Check.NotNull(state, nameof(state)); + Check.NotNullOrEmpty(globalFeatures, nameof(globalFeatures)); + + state.SimpleStateCheckers.Add(new RequireGlobalFeaturesSimpleStateChecker(requiresAll, globalFeatures)); + return state; + } + + public static TState RequireGlobalFeatures( + [NotNull] this TState state, + params Type[] globalFeatures) + where TState : IHasSimpleStateCheckers + { + return state.RequireGlobalFeatures(true, globalFeatures); + } + + public static TState RequireGlobalFeatures( + [NotNull] this TState state, + bool requiresAll, + params Type[] globalFeatures) + where TState : IHasSimpleStateCheckers + { + Check.NotNull(state, nameof(state)); + Check.NotNullOrEmpty(globalFeatures, nameof(globalFeatures)); + + state.SimpleStateCheckers.Add(new RequireGlobalFeaturesSimpleStateChecker(requiresAll, globalFeatures)); + return state; + } + } +} diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesPermissionStateProvider.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesSimpleStateChecker.cs similarity index 61% rename from framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesPermissionStateProvider.cs rename to framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesSimpleStateChecker.cs index c96e652e8c..12754d87df 100644 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesPermissionStateProvider.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesSimpleStateChecker.cs @@ -1,21 +1,22 @@ using System; using System.Linq; using System.Threading.Tasks; -using Volo.Abp.Authorization.Permissions; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.GlobalFeatures { - public class RequireGlobalFeaturesPermissionStateProvider : IPermissionStateProvider + public class RequireGlobalFeaturesSimpleStateChecker : ISimpleStateChecker + where TState : IHasSimpleStateCheckers { private readonly string[] _globalFeatureNames; private readonly bool _requiresAll; - public RequireGlobalFeaturesPermissionStateProvider(params string[] globalFeatureNames) + public RequireGlobalFeaturesSimpleStateChecker(params string[] globalFeatureNames) : this(true, globalFeatureNames) { } - public RequireGlobalFeaturesPermissionStateProvider(bool requiresAll, params string[] globalFeatureNames) + public RequireGlobalFeaturesSimpleStateChecker(bool requiresAll, params string[] globalFeatureNames) { Check.NotNullOrEmpty(globalFeatureNames, nameof(globalFeatureNames)); @@ -23,7 +24,7 @@ namespace Volo.Abp.GlobalFeatures _globalFeatureNames = globalFeatureNames; } - public RequireGlobalFeaturesPermissionStateProvider(bool requiresAll, params Type[] globalFeatureNames) + public RequireGlobalFeaturesSimpleStateChecker(bool requiresAll, params Type[] globalFeatureNames) { Check.NotNullOrEmpty(globalFeatureNames, nameof(globalFeatureNames)); @@ -31,9 +32,9 @@ namespace Volo.Abp.GlobalFeatures _globalFeatureNames = globalFeatureNames.Select(GlobalFeatureNameAttribute.GetName).ToArray(); } - public Task IsEnabledAsync(PermissionStateContext context) + public Task IsEnabledAsync(SimpleStateCheckerContext context) { - bool isEnabled = _requiresAll + var isEnabled = _requiresAll ? _globalFeatureNames.All(x => GlobalFeatureManager.Instance.IsEnabled(x)) : _globalFeatureNames.Any(x => GlobalFeatureManager.Instance.IsEnabled(x)); diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs index 63f4d7239d..ff2490cdeb 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs @@ -1,10 +1,11 @@ using System; using System.Collections.Generic; using JetBrains.Annotations; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.UI.Navigation { - public class ApplicationMenuItem : IHasMenuItems + public class ApplicationMenuItem : IHasMenuItems, IHasSimpleStateCheckers { private string _displayName; @@ -72,8 +73,11 @@ namespace Volo.Abp.UI.Navigation public ApplicationMenuItemList Items { get; } [CanBeNull] + [Obsolete("Use RequirePermissions extension method.")] public string RequiredPermissionName { get; set; } + public List> SimpleStateCheckers { get; } + /// /// Can be used to store a custom object related to this menu item. Optional. /// @@ -114,7 +118,7 @@ namespace Volo.Abp.UI.Navigation ElementId = elementId ?? GetDefaultElementId(); CssClass = cssClass; RequiredPermissionName = requiredPermissionName; - + SimpleStateCheckers = new List>(); Items = new ApplicationMenuItemList(); } diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs index 960389230e..24870070a7 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs @@ -2,10 +2,10 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.UI.Navigation { @@ -13,13 +13,16 @@ namespace Volo.Abp.UI.Navigation { protected AbpNavigationOptions Options { get; } protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } public MenuManager( IOptions options, - IHybridServiceScopeFactory serviceScopeFactory) + IHybridServiceScopeFactory serviceScopeFactory, + ISimpleStateCheckerManager simpleStateCheckerManager) { - ServiceScopeFactory = serviceScopeFactory; Options = options.Value; + ServiceScopeFactory = serviceScopeFactory; + SimpleStateCheckerManager = simpleStateCheckerManager; } public async Task GetAsync(string name) @@ -45,18 +48,26 @@ namespace Volo.Abp.UI.Navigation protected virtual async Task CheckPermissionsAsync(IServiceProvider serviceProvider, IHasMenuItems menuWithItems) { - var requiredPermissionItems = new List(); - GetRequiredPermissionNameMenus(menuWithItems, requiredPermissionItems); + var allMenuItems = new List(); + GetAllMenuItems(menuWithItems, allMenuItems); - if (requiredPermissionItems.Any()) + foreach (var item in allMenuItems) { - var permissionChecker = serviceProvider.GetRequiredService(); - var grantResult = await permissionChecker.IsGrantedAsync(requiredPermissionItems.Select(x => x.RequiredPermissionName).Distinct().ToArray()); + if (!item.RequiredPermissionName.IsNullOrWhiteSpace()) + { + item.RequirePermissions(item.RequiredPermissionName); + } + } + var checkPermissionsMenuItems = allMenuItems.Where(x => x.SimpleStateCheckers.Any()).ToArray(); + + if (checkPermissionsMenuItems.Any()) + { var toBeDeleted = new HashSet(); - foreach (var menu in requiredPermissionItems) + var result = await SimpleStateCheckerManager.IsEnabledAsync(checkPermissionsMenuItems); + foreach (var menu in checkPermissionsMenuItems) { - if (grantResult.Result[menu.RequiredPermissionName!] != PermissionGrantResult.Granted) + if (!result[menu]) { toBeDeleted.Add(menu); } @@ -66,16 +77,12 @@ namespace Volo.Abp.UI.Navigation } } - protected virtual void GetRequiredPermissionNameMenus(IHasMenuItems menuWithItems, List output) + protected virtual void GetAllMenuItems(IHasMenuItems menuWithItems, List output) { foreach (var item in menuWithItems.Items) { - if (!item.RequiredPermissionName.IsNullOrWhiteSpace()) - { - output.Add(item); - } - - GetRequiredPermissionNameMenus(item, output); + output.Add(item); + GetAllMenuItems(item, output); } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo/Abp/AspNetCore/Mvc/UI/Theme/Shared/Toolbars/Toolbar_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo/Abp/AspNetCore/Mvc/UI/Theme/Shared/Toolbars/Toolbar_Tests.cs index 70ca907fac..928a2af8de 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo/Abp/AspNetCore/Mvc/UI/Theme/Shared/Toolbars/Toolbar_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo/Abp/AspNetCore/Mvc/UI/Theme/Shared/Toolbars/Toolbar_Tests.cs @@ -11,6 +11,7 @@ using NSubstitute; using Shouldly; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars; using Volo.Abp.AspNetCore.Mvc.UI.Theming; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Security.Claims; using Xunit; @@ -71,8 +72,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.Volo.Abp.AspNetCore.Mvc. return Task.CompletedTask; } - context.Toolbar.Items.Add(new ToolbarItem(typeof(MyComponent1), requiredPermissionName: "MyComponent1")); - context.Toolbar.Items.Add(new ToolbarItem(typeof(MyComponent2), requiredPermissionName: "MyComponent2")); + context.Toolbar.Items.Add(new ToolbarItem(typeof(MyComponent1)).RequirePermissions("MyComponent1")); + context.Toolbar.Items.Add(new ToolbarItem(typeof(MyComponent2)).RequirePermissions("MyComponent2")); return Task.CompletedTask; } @@ -87,7 +88,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.Volo.Abp.AspNetCore.Mvc. return Task.CompletedTask; } - context.Toolbar.Items.Add(new ToolbarItem(typeof(MyComponent3), requiredPermissionName: "MyComponent3")); + context.Toolbar.Items.Add(new ToolbarItem(typeof(MyComponent3)).RequirePermissions("MyComponent3")); context.Toolbar.Items.Add(new ToolbarItem(typeof(MyComponent4))); return Task.CompletedTask; diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs index f7ab858ac1..162fb755a4 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs @@ -5,19 +5,20 @@ using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Security.Claims; +using Volo.Abp.SimpleStateChecking; using Xunit; namespace Volo.Abp.Authorization { public abstract class PermissionStateProvider_Tests : AuthorizationTestBase { - protected IPermissionStateManager PermissionStateManager { get; } + protected ISimpleStateCheckerManager PermissionSimpleStateCheckerManager { get; } protected IPermissionDefinitionManager PermissionDefinitionManager { get; } protected ICurrentPrincipalAccessor CurrentPrincipalAccessor { get; } public PermissionStateProvider_Tests() { - PermissionStateManager = GetRequiredService(); + PermissionSimpleStateCheckerManager = GetRequiredService>(); PermissionDefinitionManager = GetRequiredService(); CurrentPrincipalAccessor = GetRequiredService(); } @@ -29,13 +30,13 @@ namespace Volo.Abp.Authorization public async Task PermissionState_Test() { var myPermission1 = PermissionDefinitionManager.Get("MyPermission1"); - myPermission1.StateProviders.ShouldContain(x => x.GetType() == typeof(TestRequireEditionPermissionStateProvider)); + myPermission1.SimpleStateCheckers.ShouldContain(x => x.GetType() == typeof(TestRequireEditionPermissionSimpleStateChecker)); - (await PermissionStateManager.IsEnabledAsync(myPermission1)).ShouldBeFalse(); + (await PermissionSimpleStateCheckerManager.IsEnabledAsync(myPermission1)).ShouldBeFalse(); using (CurrentPrincipalAccessor.Change(new Claim(AbpClaimTypes.EditionId, Guid.NewGuid().ToString()))) { - (await PermissionStateManager.IsEnabledAsync(myPermission1)).ShouldBeTrue(); + (await PermissionSimpleStateCheckerManager.IsEnabledAsync(myPermission1)).ShouldBeTrue(); } } } @@ -44,7 +45,10 @@ namespace Volo.Abp.Authorization { protected override void AfterAddApplication(IServiceCollection services) { - services.Configure(options => options.GlobalStateProviders.Add()); + services.Configure>(options => + { + options.GlobalSimpleStateCheckers.Add(); + }); } [Fact] @@ -52,11 +56,11 @@ namespace Volo.Abp.Authorization { var myPermission2 = PermissionDefinitionManager.Get("MyPermission2"); - (await PermissionStateManager.IsEnabledAsync(myPermission2)).ShouldBeFalse(); + (await PermissionSimpleStateCheckerManager.IsEnabledAsync(myPermission2)).ShouldBeFalse(); using (CurrentPrincipalAccessor.Change(new Claim(AbpClaimTypes.Role, "admin"))) { - (await PermissionStateManager.IsEnabledAsync(myPermission2)).ShouldBeTrue(); + (await PermissionSimpleStateCheckerManager.IsEnabledAsync(myPermission2)).ShouldBeTrue(); } } } diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestGlobalRequireRolePermissionStateProvider.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestGlobalRequireRolePermissionSimpleStateChecker.cs similarity index 65% rename from framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestGlobalRequireRolePermissionStateProvider.cs rename to framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestGlobalRequireRolePermissionSimpleStateChecker.cs index 6e3b58d2de..78726a343d 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestGlobalRequireRolePermissionStateProvider.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestGlobalRequireRolePermissionSimpleStateChecker.cs @@ -3,12 +3,13 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; using Volo.Abp.Security.Claims; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.Authorization { - public class TestGlobalRequireRolePermissionStateProvider : IPermissionStateProvider, ITransientDependency + public class TestGlobalRequireRolePermissionSimpleStateChecker : ISimpleStateChecker, ITransientDependency { - public Task IsEnabledAsync(PermissionStateContext context) + public Task IsEnabledAsync(SimpleStateCheckerContext context) { var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService(); return Task.FromResult(currentPrincipalAccessor.Principal != null && currentPrincipalAccessor.Principal.IsInRole("admin")); diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestRequireEditionPermissionStateProvider.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestRequireEditionPermissionSimpleStateChecker.cs similarity index 66% rename from framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestRequireEditionPermissionStateProvider.cs rename to framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestRequireEditionPermissionSimpleStateChecker.cs index a793c84431..8ce5ab9523 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestRequireEditionPermissionStateProvider.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestRequireEditionPermissionSimpleStateChecker.cs @@ -3,12 +3,13 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Security.Claims; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.Authorization { - public class TestRequireEditionPermissionStateProvider : IPermissionStateProvider + public class TestRequireEditionPermissionSimpleStateChecker : ISimpleStateChecker { - public Task IsEnabledAsync(PermissionStateContext context) + public Task IsEnabledAsync(SimpleStateCheckerContext context) { var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService(); return Task.FromResult(currentPrincipalAccessor.Principal?.FindEditionId() != null); diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs index d67cf8febc..868cc0225a 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.Authorization.TestServices group.AddPermission("MyAuthorizedService1"); - group.AddPermission("MyPermission1").AddStateProviders(new TestRequireEditionPermissionStateProvider()); + group.AddPermission("MyPermission1").SimpleStateCheckers.Add(new TestRequireEditionPermissionSimpleStateChecker()); group.AddPermission("MyPermission2"); group.GetPermissionOrNull("MyAuthorizedService1").ShouldNotBeNull(); diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpTestModule.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpTestModule.cs new file mode 100644 index 0000000000..b42ff1e6e8 --- /dev/null +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpTestModule.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Modularity; + +namespace Volo.Abp +{ + public class AbpTestModule : AbpModule + { + + } +} diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateCheckerTestBase.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateCheckerTestBase.cs new file mode 100644 index 0000000000..989cd9fdc2 --- /dev/null +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateCheckerTestBase.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Testing; + +namespace Volo.Abp.SimpleStateChecking +{ + public abstract class SimpleStateCheckerTestBase : AbpIntegratedTest + { + protected readonly ISimpleStateCheckerManager SimpleStateCheckerManager; + + public SimpleStateCheckerTestBase() + { + SimpleStateCheckerManager = GetRequiredService>(); + } + + public class MyStateEntity : IHasSimpleStateCheckers + { + public int CheckCount { get; set; } + + public int GlobalCheckCount { get; set; } + + public int MultipleCheckCount { get; set; } + + public int MultipleGlobalCheckCount { get; set; } + + public DateTime CreationTime { get; set; } + + public DateTime? LastModificationTime { get; set; } + + public List> SimpleStateCheckers { get; } + + public MyStateEntity() + { + SimpleStateCheckers = new List>(); + } + + public MyStateEntity AddSimpleStateChecker(ISimpleStateChecker checker) + { + SimpleStateCheckers.Add(checker); + return this; + } + } + + public class MySimpleStateChecker : ISimpleStateChecker + { + public Task IsEnabledAsync(SimpleStateCheckerContext context) + { + context.State.CheckCount += 1; + return Task.FromResult(context.State.CreationTime > DateTime.Parse("2020-01-01", CultureInfo.InvariantCulture)); + } + } + + public class MyGlobalSimpleStateChecker : ISimpleStateChecker, ITransientDependency + { + public Task IsEnabledAsync(SimpleStateCheckerContext context) + { + context.State.GlobalCheckCount += 1; + return Task.FromResult(context.State.LastModificationTime.HasValue); + } + } + + public class MySimpleBatchStateChecker : SimpleBatchStateCheckerBase + { + public override Task> IsEnabledAsync(SimpleBatchStateCheckerContext context) + { + foreach (var state in context.States) + { + state.MultipleCheckCount += 1; + } + + var result = new SimpleStateCheckerResult(context.States); + + foreach (var x in result) + { + result[x.Key] = x.Key.CreationTime > DateTime.Parse("2020-01-01", CultureInfo.InvariantCulture); + } + + return Task.FromResult(result); + } + } + + public class MyGlobalSimpleBatchStateChecker : SimpleBatchStateCheckerBase, ITransientDependency + { + public override Task> IsEnabledAsync(SimpleBatchStateCheckerContext context) + { + foreach (var state in context.States) + { + state.MultipleGlobalCheckCount += 1; + } + + var result = new SimpleStateCheckerResult(context.States); + + foreach (var x in result) + { + result[x.Key] = x.Key.LastModificationTime.HasValue; + } + + return Task.FromResult(result); + } + } + } +} diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_CheckCount_Test.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_CheckCount_Test.cs new file mode 100644 index 0000000000..ff7f320bb3 --- /dev/null +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_CheckCount_Test.cs @@ -0,0 +1,81 @@ +using System; +using System.Globalization; +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.SimpleStateChecking +{ + public class SimpleStateChecker_CheckCount_Test : SimpleStateCheckerTestBase + { + [Fact] + public async Task Simple_State_Check_Should_Be_Prevent_Multiple_Checks() + { + var myStateEntities = new SimpleStateCheckerTestBase.MyStateEntity[] + { + new SimpleStateCheckerTestBase.MyStateEntity() + { + CreationTime = DateTime.Parse("2022-01-01", CultureInfo.InvariantCulture) + }, + + new SimpleStateCheckerTestBase.MyStateEntity() + { + CreationTime = DateTime.Parse("2020-01-01", CultureInfo.InvariantCulture), + } + }; + + myStateEntities[0].AddSimpleStateChecker(new MySimpleBatchStateChecker()); + myStateEntities[1].AddSimpleStateChecker(new MySimpleStateChecker()); + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntities[0])).ShouldBeTrue(); + + myStateEntities[0].CheckCount.ShouldBe(0); + myStateEntities[0].GlobalCheckCount.ShouldBe(0); + myStateEntities[0].MultipleCheckCount.ShouldBe(1); + myStateEntities[0].MultipleGlobalCheckCount.ShouldBe(0); + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntities[1])).ShouldBeFalse(); + + myStateEntities[1].CheckCount.ShouldBe(1); + myStateEntities[1].GlobalCheckCount.ShouldBe(0); + myStateEntities[1].MultipleCheckCount.ShouldBe(0); + myStateEntities[1].MultipleGlobalCheckCount.ShouldBe(0); + } + + [Fact] + public async Task Multiple_And_Simple_State_Check_Should_Be_Prevent_Multiple_Checks() + { + var myStateEntities = new SimpleStateCheckerTestBase.MyStateEntity[] + { + new SimpleStateCheckerTestBase.MyStateEntity() + { + CreationTime = DateTime.Parse("2022-01-01", CultureInfo.InvariantCulture) + }, + + new SimpleStateCheckerTestBase.MyStateEntity() + { + CreationTime = DateTime.Parse("2020-01-01", CultureInfo.InvariantCulture), + } + }; + + myStateEntities[0].AddSimpleStateChecker(new MySimpleBatchStateChecker()); + myStateEntities[1].AddSimpleStateChecker(new MySimpleStateChecker()); + + var result = await SimpleStateCheckerManager.IsEnabledAsync(myStateEntities); + result.Count.ShouldBe(2); + + result[myStateEntities[0]].ShouldBeTrue(); + result[myStateEntities[1]].ShouldBeFalse(); + + myStateEntities[0].CheckCount.ShouldBe(0); + myStateEntities[0].GlobalCheckCount.ShouldBe(0); + myStateEntities[0].MultipleCheckCount.ShouldBe(1); + myStateEntities[0].MultipleGlobalCheckCount.ShouldBe(0); + + myStateEntities[1].CheckCount.ShouldBe(1); + myStateEntities[1].GlobalCheckCount.ShouldBe(0); + myStateEntities[1].MultipleCheckCount.ShouldBe(0); + myStateEntities[1].MultipleGlobalCheckCount.ShouldBe(0); + } + } +} diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_GlobalCheckCount_Test.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_GlobalCheckCount_Test.cs new file mode 100644 index 0000000000..89905a3123 --- /dev/null +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_GlobalCheckCount_Test.cs @@ -0,0 +1,95 @@ +using System; +using System.Globalization; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Xunit; + +namespace Volo.Abp.SimpleStateChecking +{ + public class SimpleStateChecker_GlobalCheckCount_Test : SimpleStateCheckerTestBase + { + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure>(options => + { + options.GlobalSimpleStateCheckers.Add(); + options.GlobalSimpleStateCheckers.Add(); + }); + + base.AfterAddApplication(services); + } + + [Fact] + public async Task Simple_State_Check_Should_Be_Prevent_Multiple_Checks() + { + var myStateEntities = new SimpleStateCheckerTestBase.MyStateEntity[] + { + new SimpleStateCheckerTestBase.MyStateEntity() + { + CreationTime = DateTime.Parse("2022-01-01", CultureInfo.InvariantCulture), + LastModificationTime = DateTime.Parse("2022-01-01", CultureInfo.InvariantCulture) + }, + + new SimpleStateCheckerTestBase.MyStateEntity() + { + CreationTime = DateTime.Parse("2020-01-01", CultureInfo.InvariantCulture) + } + }; + + myStateEntities[0].AddSimpleStateChecker(new MySimpleBatchStateChecker()); + myStateEntities[1].AddSimpleStateChecker(new MySimpleStateChecker()); + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntities[0])).ShouldBeTrue(); + + myStateEntities[0].CheckCount.ShouldBe(0); + myStateEntities[0].GlobalCheckCount.ShouldBe(1); + myStateEntities[0].MultipleCheckCount.ShouldBe(1); + myStateEntities[0].MultipleGlobalCheckCount.ShouldBe(1); + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntities[1])).ShouldBeFalse(); + + myStateEntities[1].CheckCount.ShouldBe(1); + myStateEntities[1].GlobalCheckCount.ShouldBe(0); + myStateEntities[1].MultipleCheckCount.ShouldBe(0); + myStateEntities[1].MultipleGlobalCheckCount.ShouldBe(0); + } + + [Fact] + public async Task Multiple_And_Simple_State_Check_Should_Be_Prevent_Multiple_Checks() + { + var myStateEntities = new SimpleStateCheckerTestBase.MyStateEntity[] + { + new SimpleStateCheckerTestBase.MyStateEntity() + { + CreationTime = DateTime.Parse("2022-01-01", CultureInfo.InvariantCulture), + LastModificationTime = DateTime.Parse("2022-01-01", CultureInfo.InvariantCulture) + }, + + new SimpleStateCheckerTestBase.MyStateEntity() + { + CreationTime = DateTime.Parse("2020-01-01", CultureInfo.InvariantCulture) + } + }; + + myStateEntities[0].AddSimpleStateChecker(new MySimpleBatchStateChecker()); + myStateEntities[1].AddSimpleStateChecker(new MySimpleStateChecker()); + + var result = await SimpleStateCheckerManager.IsEnabledAsync(myStateEntities); + result.Count.ShouldBe(2); + + result[myStateEntities[0]].ShouldBeTrue(); + result[myStateEntities[1]].ShouldBeFalse(); + + myStateEntities[0].CheckCount.ShouldBe(0); + myStateEntities[0].GlobalCheckCount.ShouldBe(1); + myStateEntities[0].MultipleCheckCount.ShouldBe(1); + myStateEntities[0].MultipleGlobalCheckCount.ShouldBe(1); + + myStateEntities[1].CheckCount.ShouldBe(0); + myStateEntities[1].GlobalCheckCount.ShouldBe(0); + myStateEntities[1].MultipleCheckCount.ShouldBe(0); + myStateEntities[1].MultipleGlobalCheckCount.ShouldBe(1); + } + } +} diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_Tests.cs new file mode 100644 index 0000000000..536f8c3c68 --- /dev/null +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_Tests.cs @@ -0,0 +1,105 @@ +using System; +using System.Globalization; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Xunit; + +namespace Volo.Abp.SimpleStateChecking +{ + public class SimpleStateChecker_Tests : SimpleStateCheckerTestBase + { + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure>(options => + { + options.GlobalSimpleStateCheckers.Add(); + options.GlobalSimpleStateCheckers.Add(); + }); + + base.AfterAddApplication(services); + } + + [Fact] + public async Task State_Check_Should_Be_Works() + { + var myStateEntity = new MyStateEntity() + { + CreationTime = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture), + LastModificationTime = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture) + }; + myStateEntity.AddSimpleStateChecker(new MySimpleStateChecker()); + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntity)).ShouldBeTrue(); + + myStateEntity.CreationTime = DateTime.Parse("2001-01-01", CultureInfo.InvariantCulture); + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntity)).ShouldBeFalse(); + } + + [Fact] + public async Task Global_State_Check_Should_Be_Works() + { + var myStateEntity = new MyStateEntity() + { + CreationTime = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture) + }; + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntity)).ShouldBeFalse(); + + myStateEntity.LastModificationTime = DateTime.Parse("2001-01-01", CultureInfo.InvariantCulture); + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntity)).ShouldBeTrue(); + } + + [Fact] + public async Task Multiple_State_Check_Should_Be_Works() + { + var checker = new MySimpleBatchStateChecker(); + + var myStateEntities = new MyStateEntity[] + { + new MyStateEntity() + { + CreationTime = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture), + LastModificationTime = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture) + }, + + new MyStateEntity() + { + CreationTime = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture), + LastModificationTime = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture) + } + }; + + foreach (var myStateEntity in myStateEntities) + { + myStateEntity.AddSimpleStateChecker(checker); + } + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntities)).ShouldAllBe(x => x.Value); + + foreach (var myStateEntity in myStateEntities) + { + myStateEntity.CreationTime = DateTime.Parse("2001-01-01", CultureInfo.InvariantCulture); + } + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntities)).ShouldAllBe(x => !x.Value); + } + + [Fact] + public async Task Multiple_Global_State_Check_Should_Be_Works() + { + var myStateEntity = new MyStateEntity() + { + CreationTime = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture) + }; + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntity)).ShouldBeFalse(); + + myStateEntity.LastModificationTime = DateTime.Parse("2001-01-01", CultureInfo.InvariantCulture); + + (await SimpleStateCheckerManager.IsEnabledAsync(myStateEntity)).ShouldBeTrue(); + } + } +} diff --git a/framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs b/framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs index c72082945b..d641969f9a 100644 --- a/framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs +++ b/framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using NSubstitute; using Shouldly; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Security.Claims; using Volo.Abp.Testing; using Xunit; @@ -73,8 +74,8 @@ namespace Volo.Abp.UI.Navigation var administration = context.Menu.GetAdministration(); - administration.AddItem(new ApplicationMenuItem("Administration.UserManagement", "User Management", url: "/admin/users", requiredPermissionName: "Administration.UserManagement")); - administration.AddItem(new ApplicationMenuItem("Administration.RoleManagement", "Role Management", url: "/admin/roles", requiredPermissionName: "Administration.RoleManagement")); + administration.AddItem(new ApplicationMenuItem("Administration.UserManagement", "User Management", url: "/admin/users").RequirePermissions("Administration.UserManagement")); + administration.AddItem(new ApplicationMenuItem("Administration.RoleManagement", "Role Management", url: "/admin/roles").RequirePermissions("Administration.RoleManagement")); return Task.CompletedTask; } @@ -94,16 +95,16 @@ namespace Volo.Abp.UI.Navigation return Task.CompletedTask; } - context.Menu.Items.Insert(0, new ApplicationMenuItem("Dashboard", "Dashboard", url: "/dashboard", requiredPermissionName: "Dashboard")); + context.Menu.Items.Insert(0, new ApplicationMenuItem("Dashboard", "Dashboard", url: "/dashboard").RequirePermissions("Dashboard")); var administration = context.Menu.GetAdministration(); - administration.AddItem(new ApplicationMenuItem("Administration.DashboardSettings", "Dashboard Settings", url: "/admin/settings/dashboard", requiredPermissionName: "Administration.DashboardSettings")); + administration.AddItem(new ApplicationMenuItem("Administration.DashboardSettings", "Dashboard Settings", url: "/admin/settings/dashboard").RequirePermissions("Administration.DashboardSettings")); administration.AddItem( new ApplicationMenuItem("Administration.SubMenu1", "Sub menu 1", url: "/submenu1") - .AddItem(new ApplicationMenuItem("Administration.SubMenu1.1", "Sub menu 1.1", url: "/submenu1/submenu1_1", requiredPermissionName: "Administration.SubMenu1.1")) - .AddItem(new ApplicationMenuItem("Administration.SubMenu1.2", "Sub menu 1.2", url: "/submenu1/submenu1_2", requiredPermissionName: "Administration.SubMenu1.2")) + .AddItem(new ApplicationMenuItem("Administration.SubMenu1.1", "Sub menu 1.1", url: "/submenu1/submenu1_1").RequirePermissions("Administration.SubMenu1.1")) + .AddItem(new ApplicationMenuItem("Administration.SubMenu1.2", "Sub menu 1.2", url: "/submenu1/submenu1_2").RequirePermissions("Administration.SubMenu1.2")) ); return Task.CompletedTask; diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/BloggingAdminMenuContributor.cs b/modules/blogging/src/Volo.Blogging.Admin.Web/BloggingAdminMenuContributor.cs index 43e4bfca5b..93fe6c60d7 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/BloggingAdminMenuContributor.cs +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/BloggingAdminMenuContributor.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Volo.Abp.UI.Navigation; +using Volo.Abp.Authorization.Permissions; using Volo.Blogging.Localization; namespace Volo.Blogging.Admin @@ -18,9 +19,9 @@ namespace Volo.Blogging.Admin { var l = context.GetLocalizer(); - var managementRootMenuItem = new ApplicationMenuItem("BlogManagement", l["Menu:BlogManagement"], requiredPermissionName: BloggingPermissions.Blogs.Management); + var managementRootMenuItem = new ApplicationMenuItem("BlogManagement", l["Menu:BlogManagement"]).RequirePermissions(BloggingPermissions.Blogs.Management); - managementRootMenuItem.AddItem(new ApplicationMenuItem("BlogManagement.Blogs", l["Menu:Blogs"], "~/Blogging/Admin/Blogs", requiredPermissionName: BloggingPermissions.Blogs.Management)); + managementRootMenuItem.AddItem(new ApplicationMenuItem("BlogManagement.Blogs", l["Menu:Blogs"], "~/Blogging/Admin/Blogs").RequirePermissions(BloggingPermissions.Blogs.Management)); context.Menu.GetAdministration().AddItem(managementRootMenuItem); diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Navigation/DocsMenuContributor.cs b/modules/docs/src/Volo.Docs.Admin.Web/Navigation/DocsMenuContributor.cs index 644dd037c4..41eba37ced 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Navigation/DocsMenuContributor.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Navigation/DocsMenuContributor.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using Volo.Abp.UI.Navigation; +using Volo.Abp.Authorization.Permissions; using Volo.Docs.Localization; namespace Volo.Docs.Admin.Navigation @@ -27,8 +28,8 @@ namespace Volo.Docs.Admin.Navigation administrationMenu.AddItem(rootMenuItem); - rootMenuItem.AddItem(new ApplicationMenuItem(DocsMenuNames.Projects, l["Menu:ProjectManagement"], "~/Docs/Admin/Projects", requiredPermissionName: DocsAdminPermissions.Projects.Default)); - rootMenuItem.AddItem(new ApplicationMenuItem(DocsMenuNames.Documents, l["Menu:DocumentManagement"], "~/Docs/Admin/Documents", requiredPermissionName: DocsAdminPermissions.Documents.Default)); + rootMenuItem.AddItem(new ApplicationMenuItem(DocsMenuNames.Projects, l["Menu:ProjectManagement"], "~/Docs/Admin/Projects").RequirePermissions(DocsAdminPermissions.Projects.Default)); + rootMenuItem.AddItem(new ApplicationMenuItem(DocsMenuNames.Documents, l["Menu:DocumentManagement"], "~/Docs/Admin/Documents").RequirePermissions(DocsAdminPermissions.Documents.Default)); return Task.CompletedTask; } diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs index 9b75491d0b..e651e54f04 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Volo.Abp.Identity.Localization; using Volo.Abp.UI.Navigation; +using Volo.Abp.Authorization.Permissions; namespace Volo.Abp.Identity.Blazor { @@ -24,15 +25,13 @@ namespace Volo.Abp.Identity.Blazor identityMenuItem.AddItem(new ApplicationMenuItem( IdentityMenuNames.Roles, l["Roles"], - url: "~/identity/roles", - requiredPermissionName: IdentityPermissions.Roles.Default)); + url: "~/identity/roles").RequirePermissions(IdentityPermissions.Roles.Default)); identityMenuItem.AddItem(new ApplicationMenuItem( IdentityMenuNames.Users, l["Users"], - url: "~/identity/users", - requiredPermissionName: IdentityPermissions.Users.Default)); + url: "~/identity/users").RequirePermissions(IdentityPermissions.Users.Default)); return Task.CompletedTask; } diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Navigation/AbpIdentityWebMainMenuContributor.cs b/modules/identity/src/Volo.Abp.Identity.Web/Navigation/AbpIdentityWebMainMenuContributor.cs index 2f48318511..a6355a794a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Navigation/AbpIdentityWebMainMenuContributor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Web/Navigation/AbpIdentityWebMainMenuContributor.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using Volo.Abp.Identity.Localization; using Volo.Abp.UI.Navigation; +using Volo.Abp.Authorization.Permissions; namespace Volo.Abp.Identity.Web.Navigation { @@ -19,8 +20,8 @@ namespace Volo.Abp.Identity.Web.Navigation var l = context.GetLocalizer(); var identityMenuItem = new ApplicationMenuItem(IdentityMenuNames.GroupName, l["Menu:IdentityManagement"], icon: "fa fa-id-card-o"); - identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Roles, l["Roles"], url: "~/Identity/Roles", requiredPermissionName: IdentityPermissions.Roles.Default)); - identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Users, l["Users"], url: "~/Identity/Users", requiredPermissionName: IdentityPermissions.Users.Default)); + identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Roles, l["Roles"], url: "~/Identity/Roles").RequirePermissions(IdentityPermissions.Roles.Default)); + identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Users, l["Users"], url: "~/Identity/Users").RequirePermissions( IdentityPermissions.Users.Default)); context.Menu.GetAdministration().AddItem(identityMenuItem); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs index 4bc73a6f86..abcbcd6a48 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.Options; using Volo.Abp.Application.Services; using Volo.Abp.Authorization.Permissions; using Volo.Abp.MultiTenancy; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.PermissionManagement { @@ -16,18 +17,18 @@ namespace Volo.Abp.PermissionManagement protected PermissionManagementOptions Options { get; } protected IPermissionManager PermissionManager { get; } protected IPermissionDefinitionManager PermissionDefinitionManager { get; } - protected IPermissionStateManager PermissionStateManager { get; } + protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } public PermissionAppService( IPermissionManager permissionManager, IPermissionDefinitionManager permissionDefinitionManager, IOptions options, - IPermissionStateManager permissionStateManager) + ISimpleStateCheckerManager simpleStateCheckerManager) { Options = options.Value; PermissionManager = permissionManager; PermissionDefinitionManager = permissionDefinitionManager; - PermissionStateManager = permissionStateManager; + SimpleStateCheckerManager = simpleStateCheckerManager; } public virtual async Task GetAsync(string providerName, string providerKey) @@ -58,7 +59,7 @@ namespace Volo.Abp.PermissionManagement continue; } - if (!await PermissionStateManager.IsEnabledAsync(permission)) + if (!await SimpleStateCheckerManager.IsEnabledAsync(permission)) { continue; } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs index c178a6ae0e..d0ee7c4853 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs @@ -9,6 +9,7 @@ using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.PermissionManagement { @@ -18,7 +19,7 @@ namespace Volo.Abp.PermissionManagement protected IPermissionDefinitionManager PermissionDefinitionManager { get; } - protected IPermissionStateManager PermissionStateManager { get; } + protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } protected IGuidGenerator GuidGenerator { get; } @@ -34,7 +35,7 @@ namespace Volo.Abp.PermissionManagement public PermissionManager( IPermissionDefinitionManager permissionDefinitionManager, - IPermissionStateManager permissionStateManager, + ISimpleStateCheckerManager simpleStateCheckerManager, IPermissionGrantRepository permissionGrantRepository, IServiceProvider serviceProvider, IGuidGenerator guidGenerator, @@ -45,7 +46,7 @@ namespace Volo.Abp.PermissionManagement GuidGenerator = guidGenerator; CurrentTenant = currentTenant; Cache = cache; - PermissionStateManager = permissionStateManager; + SimpleStateCheckerManager = simpleStateCheckerManager; PermissionGrantRepository = permissionGrantRepository; PermissionDefinitionManager = permissionDefinitionManager; Options = options.Value; @@ -80,7 +81,7 @@ namespace Volo.Abp.PermissionManagement { var permission = PermissionDefinitionManager.Get(permissionName); - if (!permission.IsEnabled || !await PermissionStateManager.IsEnabledAsync(permission)) + if (!permission.IsEnabled || !await SimpleStateCheckerManager.IsEnabledAsync(permission)) { //TODO: BusinessException throw new ApplicationException($"The permission named '{permission.Name}' is disabled!"); @@ -150,7 +151,7 @@ namespace Volo.Abp.PermissionManagement return result; } - if (!await PermissionStateManager.IsEnabledAsync(permission)) + if (!await SimpleStateCheckerManager.IsEnabledAsync(permission)) { return result; } diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs index d2256a5868..86b2057239 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.PermissionManagement testGroup.AddPermission("MyPermission4", multiTenancySide: MultiTenancySides.Host).WithProviders(UserPermissionValueProvider.ProviderName); - testGroup.AddPermission("MyPermission5").AddStateProviders(new TestRequireRolePermissionStateProvider("super-admin")); + testGroup.AddPermission("MyPermission5").SimpleStateCheckers.Add(new TestRequireRolePermissionStateProvider("super-admin")); } } } diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestRequireRolePermissionStateProvider.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestRequireRolePermissionStateProvider.cs index 56e34f2894..3531479b43 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestRequireRolePermissionStateProvider.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestRequireRolePermissionStateProvider.cs @@ -4,10 +4,11 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Security.Claims; +using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.PermissionManagement { - public class TestRequireRolePermissionStateProvider : IPermissionStateProvider + public class TestRequireRolePermissionStateProvider : ISimpleStateChecker { private readonly List _allowRoles = new List(); @@ -16,7 +17,7 @@ namespace Volo.Abp.PermissionManagement _allowRoles.AddRange(roles); } - public Task IsEnabledAsync(PermissionStateContext context) + public Task IsEnabledAsync(SimpleStateCheckerContext context) { var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService(); return Task.FromResult(currentPrincipalAccessor.Principal != null && _allowRoles.Any(role => currentPrincipalAccessor.Principal.IsInRole(role))); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs index 3f4fa8683c..193cfb034b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Volo.Abp.TenantManagement.Localization; using Volo.Abp.UI.Navigation; +using Volo.Abp.Authorization.Permissions; namespace Volo.Abp.TenantManagement.Blazor.Navigation { @@ -27,9 +28,8 @@ namespace Volo.Abp.TenantManagement.Blazor.Navigation tenantManagementMenuItem.AddItem(new ApplicationMenuItem( TenantManagementMenuNames.Tenants, l["Tenants"], - url: "~/tenant-management/tenants", - requiredPermissionName: TenantManagementPermissions.Tenants.Default - )); + url: "~/tenant-management/tenants" + ).RequirePermissions(TenantManagementPermissions.Tenants.Default)); return Task.CompletedTask; } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Navigation/AbpTenantManagementWebMainMenuContributor.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Navigation/AbpTenantManagementWebMainMenuContributor.cs index c3ebaa39b5..1cc917c311 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Navigation/AbpTenantManagementWebMainMenuContributor.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Navigation/AbpTenantManagementWebMainMenuContributor.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using Volo.Abp.TenantManagement.Localization; using Volo.Abp.UI.Navigation; +using Volo.Abp.Authorization.Permissions; namespace Volo.Abp.TenantManagement.Web.Navigation { @@ -23,7 +24,7 @@ namespace Volo.Abp.TenantManagement.Web.Navigation var tenantManagementMenuItem = new ApplicationMenuItem(TenantManagementMenuNames.GroupName, l["Menu:TenantManagement"], icon: "fa fa-users"); administrationMenu.AddItem(tenantManagementMenuItem); - tenantManagementMenuItem.AddItem(new ApplicationMenuItem(TenantManagementMenuNames.Tenants, l["Tenants"], url: "~/TenantManagement/Tenants", requiredPermissionName: TenantManagementPermissions.Tenants.Default)); + tenantManagementMenuItem.AddItem(new ApplicationMenuItem(TenantManagementMenuNames.Tenants, l["Tenants"], url: "~/TenantManagement/Tenants").RequirePermissions(TenantManagementPermissions.Tenants.Default)); return Task.CompletedTask; } From 8f992ce4f23e0d5ee410bc63bc8ab73b333170ca Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 22 Apr 2021 11:00:04 +0800 Subject: [PATCH 002/129] Add RequireAuthenticatedSimpleStateChecker. --- .../PermissionSimpleStateCheckerExtensions.cs | 7 +++++++ .../RequireAuthenticatedSimpleStateChecker.cs | 16 ++++++++++++++++ .../RequirePermissionsSimpleBatchStateChecker.cs | 0 ...irePermissionsSimpleBatchStateCheckerModel.cs | 0 .../RequirePermissionsSimpleStateChecker.cs | 0 5 files changed, 23 insertions(+) rename framework/src/{Volo.Abp.Authorization.Abstractions => Volo.Abp.Authorization}/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs (87%) create mode 100644 framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequireAuthenticatedSimpleStateChecker.cs rename framework/src/{Volo.Abp.Authorization.Abstractions => Volo.Abp.Authorization}/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs (100%) rename framework/src/{Volo.Abp.Authorization.Abstractions => Volo.Abp.Authorization}/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs (100%) rename framework/src/{Volo.Abp.Authorization.Abstractions => Volo.Abp.Authorization}/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs (100%) diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs similarity index 87% rename from framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs rename to framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs index 56b50ab50a..c7849416b3 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs @@ -5,6 +5,13 @@ namespace Volo.Abp.Authorization.Permissions { public static class PermissionSimpleStateCheckerExtensions { + public static TState RequireAuthenticated([NotNull] this TState state) + where TState : IHasSimpleStateCheckers + { + state.SimpleStateCheckers.Add(new RequireAuthenticatedSimpleStateChecker()); + return state; + } + public static TState RequirePermissions( [NotNull] this TState state, params string[] permissions) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequireAuthenticatedSimpleStateChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequireAuthenticatedSimpleStateChecker.cs new file mode 100644 index 0000000000..64350bd825 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequireAuthenticatedSimpleStateChecker.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.SimpleStateChecking; +using Volo.Abp.Users; + +namespace Volo.Abp.Authorization.Permissions +{ + public class RequireAuthenticatedSimpleStateChecker : ISimpleStateChecker + where TState : IHasSimpleStateCheckers + { + public Task IsEnabledAsync(SimpleStateCheckerContext context) + { + return Task.FromResult(context.ServiceProvider.GetRequiredService().IsAuthenticated); + } + } +} diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs similarity index 100% rename from framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs rename to framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs similarity index 100% rename from framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs rename to framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateCheckerModel.cs diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs similarity index 100% rename from framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs rename to framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs From e7557883324fe3053cb8caf629bbd85d6ce5ef5f Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 22 Apr 2021 11:53:16 +0800 Subject: [PATCH 003/129] Use RequireAuthenticated&RequireFeatures&RequirePermissions for menus. --- .../CmsKitWebHostMenuContributor.cs | 41 ++++--- .../Menus/CmsKitAdminMenuContributor.cs | 102 +++++++----------- .../AbpIdentityWebMainMenuContributor.cs | 1 - .../Menus/MyProjectNameMenuContributor.cs | 12 +-- .../Menus/MyProjectNameMenuContributor.cs | 19 ++-- .../Menus/MyProjectNameMenuContributor.cs | 12 +-- .../MyProjectNameWebHostMenuContributor.cs | 40 ++++--- 7 files changed, 94 insertions(+), 133 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/CmsKitWebHostMenuContributor.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Host/CmsKitWebHostMenuContributor.cs index 1f1421546e..66a3364eae 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/CmsKitWebHostMenuContributor.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/CmsKitWebHostMenuContributor.cs @@ -4,6 +4,7 @@ using Localization.Resources.AbpUi; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; +using Volo.Abp.Authorization.Permissions; using Volo.CmsKit.Localization; using Volo.Abp.UI.Navigation; using Volo.Abp.Users; @@ -31,30 +32,26 @@ namespace Volo.CmsKit private void AddLogoutItemToMenu(MenuConfigurationContext context) { - var currentUser = context.ServiceProvider.GetRequiredService(); var l = context.GetLocalizer(); - if (currentUser.IsAuthenticated) - { - context.Menu.Items.Add(new ApplicationMenuItem( - "Account.Manage", - l["ManageYourProfile"], - $"{_configuration["AuthServer:Authority"].EnsureEndsWith('/')}Account/Manage", - icon: "fa fa-cog", - order: int.MaxValue - 1001, - null, - "_blank") - ); - - - context.Menu.Items.Add(new ApplicationMenuItem( - "Account.Logout", - l["Logout"], - "~/Account/Logout", - "fas fa-power-off", - order: int.MaxValue - 1000 - )); - } + context.Menu.Items.Add(new ApplicationMenuItem( + "Account.Manage", + l["ManageYourProfile"], + $"{_configuration["AuthServer:Authority"].EnsureEndsWith('/')}Account/Manage", + icon: "fa fa-cog", + order: int.MaxValue - 1001, + null, + "_blank" + ).RequireAuthenticated()); + + + context.Menu.Items.Add(new ApplicationMenuItem( + "Account.Logout", + l["Logout"], + "~/Account/Logout", + "fas fa-power-off", + order: int.MaxValue - 1000 + ).RequireAuthenticated()); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs index d5d69405b6..7a11c7d73a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.GlobalFeatures; using Volo.Abp.UI.Navigation; using Volo.CmsKit.GlobalFeatures; @@ -29,67 +30,46 @@ namespace Volo.CmsKit.Admin.Web.Menus var l = context.GetLocalizer(); var cmsMenus = new List(); - - if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (await context.IsGrantedAsync(CmsKitAdminPermissions.Pages.Default)) - { - cmsMenus.Add(new ApplicationMenuItem( - CmsKitAdminMenus.Pages.PagesMenu, - l["Pages"].Value, - "/Cms/Pages", - "fa fa-file-alt")); - } - } - - if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (await context.IsGrantedAsync(CmsKitAdminPermissions.Blogs.Default)) - { - cmsMenus.Add(new ApplicationMenuItem( - CmsKitAdminMenus.Blogs.BlogsMenu, - l["Blogs"], - "/Cms/Blogs", - "fa fa-blog" - )); - } - if (await context.IsGrantedAsync(CmsKitAdminPermissions.BlogPosts.Default)) - { - cmsMenus.Add(new ApplicationMenuItem( - CmsKitAdminMenus.BlogPosts.BlogPostsMenu, - l["BlogPosts"], - "/Cms/BlogPosts", - "fa fa-file-signature" - )); - } - } - - if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (await context.IsGrantedAsync(CmsKitAdminPermissions.Tags.Default)) - { - cmsMenus.Add(new ApplicationMenuItem( - CmsKitAdminMenus.Tags.TagsMenu, - l["Tags"].Value, - "/Cms/Tags", - "fa fa-tags")); - } - } - - if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (await context.IsGrantedAsync(CmsKitAdminPermissions.Comments.Default)) - { - cmsMenus.Add(new ApplicationMenuItem( - CmsKitAdminMenus.Comments.CommentsMenu, - l["Comments"].Value, - "/Cms/Comments", - "fa fa-comments" - ) - ); - } - } + cmsMenus.Add(new ApplicationMenuItem( + CmsKitAdminMenus.Pages.PagesMenu, + l["Pages"].Value, + "/Cms/Pages", + "fa fa-file-alt") + .RequireGlobalFeatures(typeof(PagesFeature)) + .RequirePermissions(CmsKitAdminPermissions.Pages.Default)); + + cmsMenus.Add(new ApplicationMenuItem( + CmsKitAdminMenus.Blogs.BlogsMenu, + l["Blogs"], + "/Cms/Blogs", + "fa fa-blog") + .RequireGlobalFeatures(typeof(BlogsFeature)) + .RequirePermissions(CmsKitAdminPermissions.Blogs.Default)); + + cmsMenus.Add(new ApplicationMenuItem( + CmsKitAdminMenus.BlogPosts.BlogPostsMenu, + l["BlogPosts"], + "/Cms/BlogPosts", + "fa fa-file-signature") + .RequireGlobalFeatures(typeof(BlogsFeature)) + .RequirePermissions(CmsKitAdminPermissions.BlogPosts.Default)); + + cmsMenus.Add(new ApplicationMenuItem( + CmsKitAdminMenus.Tags.TagsMenu, + l["Tags"].Value, + "/Cms/Tags", + "fa fa-tags") + .RequireGlobalFeatures(typeof(TagsFeature)) + .RequirePermissions(CmsKitAdminPermissions.Tags.Default)); + + cmsMenus.Add(new ApplicationMenuItem( + CmsKitAdminMenus.Comments.CommentsMenu, + l["Comments"].Value, + "/Cms/Comments", + "fa fa-comments") + .RequireGlobalFeatures(typeof(CommentsFeature)) + .RequirePermissions(CmsKitAdminPermissions.Comments.Default)); if (cmsMenus.Any()) { @@ -112,4 +92,4 @@ namespace Volo.CmsKit.Admin.Web.Menus } } } -} \ No newline at end of file +} diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs index e651e54f04..fafa8eac9b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs @@ -27,7 +27,6 @@ namespace Volo.Abp.Identity.Blazor l["Roles"], url: "~/identity/roles").RequirePermissions(IdentityPermissions.Roles.Default)); - identityMenuItem.AddItem(new ApplicationMenuItem( IdentityMenuNames.Users, l["Users"], diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Menus/MyProjectNameMenuContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Menus/MyProjectNameMenuContributor.cs index 52a15ed4b2..26ad3a6a4d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Menus/MyProjectNameMenuContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Menus/MyProjectNameMenuContributor.cs @@ -6,6 +6,7 @@ using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.MultiTenancy; using Volo.Abp.Account.Localization; using Volo.Abp.Identity.Blazor; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.SettingManagement.Blazor.Menus; using Volo.Abp.TenantManagement.Blazor.Navigation; using Volo.Abp.UI.Navigation; @@ -69,16 +70,11 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Tiered.Menus { var l = context.GetLocalizer(); var accountStringLocalizer = context.GetLocalizer(); - var currentUser = context.ServiceProvider.GetRequiredService(); - var identityServerUrl = _configuration["AuthServer:Authority"] ?? ""; - if (currentUser.IsAuthenticated) - { - context.Menu.AddItem(new ApplicationMenuItem("Account.Manage", accountStringLocalizer["ManageYourProfile"], - $"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}", icon: "fa fa-cog", order: 1000, null, "_blank")); - context.Menu.AddItem(new ApplicationMenuItem("Account.Logout", l["Logout"], url: "~/Account/Logout", icon: "fa fa-power-off", order: int.MaxValue - 1000)); - } + context.Menu.AddItem(new ApplicationMenuItem("Account.Manage", accountStringLocalizer["ManageYourProfile"], + $"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}", icon: "fa fa-cog", order: 1000, null, "_blank").RequireAuthenticated()); + context.Menu.AddItem(new ApplicationMenuItem("Account.Logout", l["Logout"], url: "~/Account/Logout", icon: "fa fa-power-off", order: int.MaxValue - 1000).RequireAuthenticated()); return Task.CompletedTask; } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs index c42223526a..f8a0f7e509 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using MyCompanyName.MyProjectName.Localization; using Volo.Abp.Account.Localization; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.UI.Navigation; using Volo.Abp.Users; @@ -50,20 +51,16 @@ namespace MyCompanyName.MyProjectName.Blazor.Menus private Task ConfigureUserMenuAsync(MenuConfigurationContext context) { var accountStringLocalizer = context.GetLocalizer(); - var currentUser = context.ServiceProvider.GetRequiredService(); var identityServerUrl = _configuration["AuthServer:Authority"] ?? ""; - if (currentUser.IsAuthenticated) - { - context.Menu.AddItem(new ApplicationMenuItem( - "Account.Manage", - accountStringLocalizer["ManageYourProfile"], - $"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}", - icon: "fa fa-cog", - order: 1000, - null)); - } + context.Menu.AddItem(new ApplicationMenuItem( + "Account.Manage", + accountStringLocalizer["ManageYourProfile"], + $"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}", + icon: "fa fa-cog", + order: 1000, + null).RequireAuthenticated()); return Task.CompletedTask; } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs index 5bf2fc404f..90fb5595ed 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.MultiTenancy; using Volo.Abp.Account.Localization; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Identity.Web.Navigation; using Volo.Abp.SettingManagement.Web.Navigation; using Volo.Abp.TenantManagement.Web.Navigation; @@ -69,16 +70,11 @@ namespace MyCompanyName.MyProjectName.Web.Menus { var l = context.GetLocalizer(); var accountStringLocalizer = context.GetLocalizer(); - var currentUser = context.ServiceProvider.GetRequiredService(); - var identityServerUrl = _configuration["AuthServer:Authority"] ?? ""; - if (currentUser.IsAuthenticated) - { - context.Menu.AddItem(new ApplicationMenuItem("Account.Manage", accountStringLocalizer["ManageYourProfile"], - $"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}", icon: "fa fa-cog", order: 1000, null, "_blank")); - context.Menu.AddItem(new ApplicationMenuItem("Account.Logout", l["Logout"], url: "~/Account/Logout", icon: "fa fa-power-off", order: int.MaxValue - 1000)); - } + context.Menu.AddItem(new ApplicationMenuItem("Account.Manage", accountStringLocalizer["ManageYourProfile"], + $"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}", icon: "fa fa-cog", order: 1000, null, "_blank").RequireAuthenticated()); + context.Menu.AddItem(new ApplicationMenuItem("Account.Logout", l["Logout"], url: "~/Account/Logout", icon: "fa fa-power-off", order: int.MaxValue - 1000).RequireAuthenticated()); return Task.CompletedTask; } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostMenuContributor.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostMenuContributor.cs index c1151363ab..ef27052921 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostMenuContributor.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostMenuContributor.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using MyCompanyName.MyProjectName.Localization; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.UI.Navigation; using Volo.Abp.Users; @@ -31,30 +32,25 @@ namespace MyCompanyName.MyProjectName private void AddLogoutItemToMenu(MenuConfigurationContext context) { - var currentUser = context.ServiceProvider.GetRequiredService(); var l = context.GetLocalizer(); - if (currentUser.IsAuthenticated) - { - context.Menu.Items.Add(new ApplicationMenuItem( - "Account.Manage", - l["ManageYourProfile"], - $"{_configuration["AuthServer:Authority"].EnsureEndsWith('/')}Account/Manage", - icon: "fa fa-cog", - order: int.MaxValue - 1001, - null, - "_blank") - ); - - - context.Menu.Items.Add(new ApplicationMenuItem( - "Account.Logout", - l["Logout"], - "~/Account/Logout", - "fas fa-power-off", - order: int.MaxValue - 1000 - )); - } + context.Menu.Items.Add(new ApplicationMenuItem( + "Account.Manage", + l["ManageYourProfile"], + $"{_configuration["AuthServer:Authority"].EnsureEndsWith('/')}Account/Manage", + icon: "fa fa-cog", + order: int.MaxValue - 1001, + null, + "_blank" + ).RequireAuthenticated()); + + context.Menu.Items.Add(new ApplicationMenuItem( + "Account.Logout", + l["Logout"], + "~/Account/Logout", + "fas fa-power-off", + order: int.MaxValue - 1000 + ).RequireAuthenticated()); } } } From f7864437b29c95ea583de5d0c4da9724ec42d793 Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Thu, 22 Apr 2021 17:33:14 +0300 Subject: [PATCH 004/129] cms kit tag management document --- docs/en/Modules/cms-kit-tag-management.md | 133 ++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/en/Modules/cms-kit-tag-management.md diff --git a/docs/en/Modules/cms-kit-tag-management.md b/docs/en/Modules/cms-kit-tag-management.md new file mode 100644 index 0000000000..936f921489 --- /dev/null +++ b/docs/en/Modules/cms-kit-tag-management.md @@ -0,0 +1,133 @@ +# Tag Management + +CMS kit provides a **tag** system to tag any kind of resources, like blog posts. This section describes the details of the tag system. + +## Feature + +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with public website option. If you're installing the CMS kit manually or want to enable tag management feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.Tags.Disable(); +}); +``` + +# Options + +## CmsKitTagOptions + +You can use the tag system to tag any kind of resources, like blog posts, products etc. Tag system provides a mechanism to group tags by entity types. For example, if you want to use tag system for blog posts and products, you need to define two entity types named BlogPosts and Product, and add tags under these entity types. + +`CmsKitTagOptions` can be configured in the domain layer, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example: + +```csharp +Configure(options => +{ + //Set options here... +}); +``` + +`CmsKitTagOptions` properties: + +- `EntityTypes`: List of defined entity types(`TagEntityTypeDefiniton`) in the tag system. + +`TagEntityTypeDefiniton` properties: + +- `EntityType`: Name of the entity type. +- `DisplayName`: Display name of the entity type. You can use a user friendly display name to show entity type definition on the admin website. +- `CreatePolicies`: List of policy names allowing users to create tags under the entity type. +- `UpdatePolicies`: List of policy names allowing users to update tags under the entity type. +- `DeletePolicies`: List of policy names allowing users to delete tags under the entity type. + +# Internals + +## Domain Layer + +#### Aggregates + +This module follows the [Entity Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Entities) guide. + +##### Tag + +A tag represents a tag under the entity type. + +- `Tag` (aggregate root): Represents a tag in the system. + +##### EntityTag + +An entity tag represents a connection between the tag and the tagged entity. + +- `EntityTag`(entity): Represents a connection between the tag and the tagged entity. + +#### Repositories + +This module follows the [Repository Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories) guide. + +Following custom repositories are defined for this feature: + +- `ITagRepository` +- `IEntityTagRepository` + +#### Domain services + +This module follows the [Domain Services Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services) guide. + +##### Tag Manager + +`TagManager` is used to perform some operations for the `Tag` aggregate root. + +##### Entity Tag Manager + +`EntityTagManager` is used to perform some operations for the `EntityTag` entity. + +### Application layer + +#### Application services + +- `TagAdminAppService` (implements `ITagAdminAppService`): Implements the use cases of tag management. +- `EntityTagAdminAppService` (implements `IEntityTagAdminAppService`): Implements the use cases of entity tag relationship. +- `TagAppService` (implements `ITagAppService`): Implements the use cases of entity tag relationship for public websites. + +### Database providers + +#### Common + +##### Table / collection prefix & schema + +All tables/collections use the `Cms` prefix by default. Set static properties on the `CmsKitDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). + +##### Connection string + +This module uses `CmsKit` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string. + +See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details. + +#### Entity Framework Core + +##### Tables + +- CmsTags +- CmsEntityTags + - CmsTags + +#### MongoDB + +##### Collections + +- **CmsTags** +- **CmsEntityTags** + +### MVC UI + +Tag system provides a tag widget to display associated tags of the resource in public websites. You can simply place the widget to the like below. + +```csharp +@await Component.InvokeAsync(typeof(TagViewComponent), new +{ + entityType = "entityType", + entityId = "entityId" +}) +``` + +For more information about widgets see [widgets](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) documentation. \ No newline at end of file From d25afeaabd87560680871c4b0983554a447520b5 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 23 Apr 2021 16:01:58 +0800 Subject: [PATCH 005/129] Handle the access_denied in AddAbpOpenIdConnect. --- .../AbpOpenIdConnectExtensions.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs index e98280d19d..160e66f49f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.OAuth.Claims; using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Protocols.OpenIdConnect; using Volo.Abp.AspNetCore.MultiTenancy; namespace Microsoft.Extensions.DependencyInjection @@ -35,6 +36,17 @@ namespace Microsoft.Extensions.DependencyInjection SetAbpTenantId(receivedContext); return authorizationCodeReceived.Invoke(receivedContext); }; + + options.Events.OnRemoteFailure = remoteFailureContext => + { + if (remoteFailureContext.Failure is OpenIdConnectProtocolException && + remoteFailureContext.Failure.Message.Contains("access_denied")) + { + remoteFailureContext.HandleResponse(); + remoteFailureContext.Response.Redirect($"{remoteFailureContext.Request.PathBase}/"); + } + return Task.CompletedTask; + }; }); } From 68f224c95b30a5f2c0070eb050ecbb1aa3a65295 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 27 Apr 2021 17:45:40 +0800 Subject: [PATCH 006/129] Add IsActive property to TenantConfiguration. --- .../AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs | 4 +++- .../Pages/Abp/MultiTenancy/AbpTenantAppService.cs | 10 ++++++---- .../Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs | 6 +++--- .../Volo/Abp/MultiTenancy/TenantConfiguration.cs | 5 ++++- .../Abp/MultiTenancy/TenantConfigurationProvider.cs | 9 +++++++++ .../AbpTenantManagementDomainMappingProfile.cs | 3 ++- 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs index d85622f0cf..6f834b18ea 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs @@ -10,5 +10,7 @@ namespace Volo.Abp.AspNetCore.Mvc.MultiTenancy public Guid? TenantId { get; set; } public string Name { get; set; } + + public bool IsActive { get; set; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantAppService.cs index d0bea87196..60bdb523ba 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantAppService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantAppService.cs @@ -28,10 +28,11 @@ namespace Pages.Abp.MultiTenancy { Success = true, TenantId = tenant.Id, - Name = tenant.Name + Name = tenant.Name, + IsActive = tenant.IsActive }; } - + public async Task FindTenantByIdAsync(Guid id) { var tenant = await TenantStore.FindAsync(id); @@ -45,8 +46,9 @@ namespace Pages.Abp.MultiTenancy { Success = true, TenantId = tenant.Id, - Name = tenant.Name + Name = tenant.Name, + IsActive = tenant.IsActive }; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs index bfdbb98db8..d4f0ff2187 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs @@ -20,7 +20,7 @@ namespace Pages.Abp.MultiTenancy protected AbpAspNetCoreMultiTenancyOptions Options { get; } public TenantSwitchModalModel( - ITenantStore tenantStore, + ITenantStore tenantStore, IOptions options) { TenantStore = tenantStore; @@ -48,7 +48,7 @@ namespace Pages.Abp.MultiTenancy else { var tenant = await TenantStore.FindAsync(Input.Name); - if (tenant == null) + if (tenant == null || !tenant.IsActive) { throw new UserFriendlyException(L["GivenTenantIsNotAvailable", Input.Name]); } @@ -71,4 +71,4 @@ namespace Pages.Abp.MultiTenancy public string Name { get; set; } } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs index e586e687c3..35b3a0e52e 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs @@ -13,12 +13,15 @@ namespace Volo.Abp.MultiTenancy public ConnectionStrings ConnectionStrings { get; set; } + public bool IsActive { get; set; } + public TenantConfiguration() { - + IsActive = true; } public TenantConfiguration(Guid id, [NotNull] string name) + : this() { Check.NotNull(name, nameof(name)); diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs index 81a9c72042..1c3223828d 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs @@ -42,6 +42,15 @@ namespace Volo.Abp.MultiTenancy details: "There is no tenant with the tenant id or name: " + resolveResult.TenantIdOrName ); } + + if (!tenant.IsActive) + { + throw new BusinessException( + code: "Volo.AbpIo.MultiTenancy:010002", + message: "Tenant not active!", + details: "The tenant is no active with the tenant id or name: " + resolveResult.TenantIdOrName + ); + } } return tenant; diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs index 31eb7c6d19..b8b667cbad 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs @@ -22,7 +22,8 @@ namespace Volo.Abp.TenantManagement return connStrings; }); - }); + }) + .ForMember(x => x.IsActive, x => x.UseDestinationValue()); CreateMap(); } From 5ffbb9dc09df58fe9fd16e1cd5b7fdedd260aef7 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 27 Apr 2021 18:20:33 +0800 Subject: [PATCH 007/129] Ignore IsActive. --- .../TenantManagement/AbpTenantManagementDomainMappingProfile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs index b8b667cbad..539cafb4bb 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.TenantManagement return connStrings; }); }) - .ForMember(x => x.IsActive, x => x.UseDestinationValue()); + .ForMember(x => x.IsActive, x => x.Ignore()); CreateMap(); } From 0ecaf10a76dcf289996d540fa755c1a0497c39a5 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 27 Apr 2021 17:20:58 +0300 Subject: [PATCH 008/129] Cli: Add-module should remove redundant projects from test folder resolves https://github.com/abpframework/abp/issues/8819 --- .../Cli/ProjectModification/SolutionModuleAdder.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs index 2d59392dcd..9a30fd7fd3 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs @@ -301,13 +301,21 @@ namespace Volo.Abp.Cli.ProjectModification private async Task RemoveProjectFromSolutionAsync(string moduleSolutionFile, string projectName) { - await SolutionFileModifier.RemoveProjectFromSolutionFileAsync(moduleSolutionFile, projectName); + await SolutionFileModifier.RemoveProjectFromSolutionFileAsync(moduleSolutionFile, projectName); - var projectFolderPath = Path.Combine(Path.GetDirectoryName(moduleSolutionFile), "src", projectName); + var projectFolderPath = Path.Combine(Path.GetDirectoryName(moduleSolutionFile), "src", projectName); + if (Directory.Exists(projectFolderPath)) + { + Directory.Delete(projectFolderPath, true); + } + else + { + projectFolderPath = Path.Combine(Path.GetDirectoryName(moduleSolutionFile), "test", projectName); if (Directory.Exists(projectFolderPath)) { Directory.Delete(projectFolderPath, true); } + } } private void ChangeDomainTestReferenceToMongoDB(ModuleWithMastersInfo module, string moduleSolutionFile) From b48e44509f169267e704340e321a79f6623f615c Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Thu, 29 Apr 2021 11:45:06 +0300 Subject: [PATCH 009/129] cms-kit module document updated. --- docs/en/Modules/Cms-Kit.md | 158 +++++++++++++++++- .../images/cmskit-module-blog-post-edit.png | Bin 0 -> 137530 bytes .../images/cmskit-module-blog-posts-page.png | Bin 0 -> 28898 bytes docs/en/images/cmskit-module-blogs-edit.png | Bin 0 -> 10238 bytes .../cmskit-module-blogs-feature-action.png | Bin 0 -> 19278 bytes docs/en/images/cmskit-module-blogs-page.png | Bin 0 -> 18239 bytes docs/en/images/cmskit-module-comment-page.png | Bin 0 -> 29321 bytes .../images/cmskit-module-comments-detail.png | Bin 0 -> 33819 bytes .../images/cmskit-module-features-dialog.png | Bin 0 -> 11271 bytes docs/en/images/cmskit-module-pages-edit.png | Bin 0 -> 141183 bytes docs/en/images/cmskit-module-pages-page.png | Bin 0 -> 28831 bytes docs/en/images/cmskit-module-ratings.png | Bin 0 -> 2811 bytes docs/en/images/cmskit-module-reactions.png | Bin 0 -> 5616 bytes docs/en/images/cmskit-module-tag-edit.png | Bin 0 -> 7506 bytes docs/en/images/cmskit-module-tags-page.png | Bin 0 -> 25320 bytes 15 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 docs/en/images/cmskit-module-blog-post-edit.png create mode 100644 docs/en/images/cmskit-module-blog-posts-page.png create mode 100644 docs/en/images/cmskit-module-blogs-edit.png create mode 100644 docs/en/images/cmskit-module-blogs-feature-action.png create mode 100644 docs/en/images/cmskit-module-blogs-page.png create mode 100644 docs/en/images/cmskit-module-comment-page.png create mode 100644 docs/en/images/cmskit-module-comments-detail.png create mode 100644 docs/en/images/cmskit-module-features-dialog.png create mode 100644 docs/en/images/cmskit-module-pages-edit.png create mode 100644 docs/en/images/cmskit-module-pages-page.png create mode 100644 docs/en/images/cmskit-module-ratings.png create mode 100644 docs/en/images/cmskit-module-reactions.png create mode 100644 docs/en/images/cmskit-module-tag-edit.png create mode 100644 docs/en/images/cmskit-module-tags-page.png diff --git a/docs/en/Modules/Cms-Kit.md b/docs/en/Modules/Cms-Kit.md index e13f1e585b..4191686e23 100644 --- a/docs/en/Modules/Cms-Kit.md +++ b/docs/en/Modules/Cms-Kit.md @@ -1,3 +1,159 @@ # CMS Kit Module -TODO \ No newline at end of file +This module provides CMS(Content Management System) capabilities for your application. + +* Provides a **page** management system to manage dynamic pages. +* Provides a **blog** system to create blogs and publish posts. +* Provides a **tag** system to tag any kind of resources, like blog posts. +* Provides a **comment** system to add comments feature to any kind of resource, like blog posts. +* Provides a **reaction** system to add reactions feature to any kind of resource, like blog posts or comments. +* Provides a **rating** system to add ratings feature to any kind of resource. + +## How to install + +The ABP CLI allows adding a module to a solution using `add-module` command. CMS kit module can be added using the command below; + +```bash +abp add-module Volo.CmsKit +``` +Open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure` method to enable all features in the CMS kit module. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.EnableAll(); +}); + +``` + +> If you are using EntityFrameworkCore, do not forget to add a new migration and update your database. + +## Packages + +This module follows the [module development best practices guide](https://docs.abp.io/en/abp/latest/Best-Practices/Index) and consists of several NuGet and NPM packages. See the guide if you want to understand the packages and relations between them. + +CMS kit packages are designed for various usage scenarios. When you visit the [CMS kit package list page](https://www.nuget.org/packages?q=Volo.CmsKit), you will see that packages have admin, public and unified versions. +For example, + - `Volo.CmsKit.Admin.Application`: Contains functionality required by admin websites. + - `Volo.CmsKit.Public.Application`: Contains functionality required by public websites. + - `Volo.CmsKit.Application` : Unified package dependent on both public and admin packages. + +If you want to want to separate admin and public website codes, you can use the admin and public packages. However, if you want to keep admin and public website codes in a shared project, you can use the unified packages to include both admin and public packages. + +It is recommeded to use the unified packages instead of adding both admin and public packages. + +## Feature System + +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. You can use the global feature system to enable all features or only enabled specific features easily. + +To enable all features in the CMS kit, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.EnableAll(); +}); +``` + +You can only enable specific features such as pages, like below. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.Pages.Enable(); +}); +``` + +## User interface + +### Menu items + +CMS kit module adds the following items to the "Main" menu, under the "CMS" menu item: + +* **Pages**: Page management page. +* **Blogs**: Blog management page. +* **Blog Posts**: Blog post management page. +* **Tags**: Tag management page. +* **Comments**: Comment management page. + +`CmsKitAdminMenus` class has the constants for the menu item names. + +### Pages + +### Page Management + +Pages page is used to manage dynamic pages in the system. + +![pages-page](../images/cmskit-module-pages-page.png) + +You can create or edit an existing page on this page. + +![pages-edit](../images/cmskit-module-pages-edit.png) + +* When you create a page, you can access the created page via `pages/{slug}` URL. + +### Blog Management + +Blogs page is used to create and manage blogs in your system. + +![blogs-page](../images/cmskit-module-blogs-page.png) + +A screenshot from the new blog creation modal: + +![blogs-edit](../images/cmskit-module-blogs-edit.png) + +#### Blog Features + +You can enable or disable a specific feature for blogs by clicking the features action. + +![blogs-feature-action](../images/cmskit-module-blogs-feature-action.png) + +You can select/deselect the desired features for blog posts. + +![features-dialog](../images/cmskit-module-features-dialog.png) + +### Blog Post Management + +When you create blogs, you can manage blog posts on this page. + +![blog-posts-page](../images/cmskit-module-blog-posts-page.png) + +You can create and edit an existing blog post on this page. If you enable specific features such as tags, you can set tags for the blog post on this page. + +![blog-post-edit](../images/cmskit-module-blog-post-edit.png) + +### Tag Management + +CMS Kit provides an extensible tagging mechanism to add tagging capabilities to various places. + +![tags-page](../images/cmskit-module-tags-page.png) + +You can create or edit an existing tag on this page. + +![tag-edit](../images/cmskit-module-tag-edit.png) + +### Comment Management + +CMS Kit provides an extensible commenting mechanism to add comments to various places. You can add comment control to anywhere you want and manage the comments. + +You can view and manage comments on this page. + +![comment-page](../images/cmskit-module-comment-page.png) + +You can manage and view replies on this page. + +![comments-detail](../images/cmskit-module-comments-detail.png) + +### Reactions + +CMS Kit provides an extensible reaction component system to allow users to send reactions to your content. Here how the reactions component looks on a sample page. + +![reactions](../images/cmskit-module-reactions.png) + +You can also customize the reaction icons shown in the reaction component. + +### Ratings + +You can use the rating component to add rating a mechanism to your content. Here how the rating component looks on a sample page. + +![ratings](../images/cmskit-module-ratings.png) diff --git a/docs/en/images/cmskit-module-blog-post-edit.png b/docs/en/images/cmskit-module-blog-post-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..528bc6b499718d9875d4e51df543a5529a479447 GIT binary patch literal 137530 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

V>;>a{t|THF_&AWBr) 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

jx#l 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 P!9xd~4ixV{ck{mh5(#<0 literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-blog-posts-page.png b/docs/en/images/cmskit-module-blog-posts-page.png new file mode 100644 index 0000000000000000000000000000000000000000..64d5d0e9345049c0293b5c6059a558ffad738b98 GIT binary patch literal 28898 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-blogs-edit.png b/docs/en/images/cmskit-module-blogs-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..b2da4e5b5a61129179dbf99c4a2d51684d659109 GIT binary patch literal 10238 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%0D$YoMHv^D_k0`<869I_=}qG2#q9DUZ83SN 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 Dn(6Xo literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-comments-detail.png b/docs/en/images/cmskit-module-comments-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..686a70e1f8d11b1c83ea99dfae916e009a934162 GIT binary patch literal 33819 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-features-dialog.png b/docs/en/images/cmskit-module-features-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..23aa2aa17aa6edef460a1f0d448872732da649d6 GIT binary patch literal 11271 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-pages-edit.png b/docs/en/images/cmskit-module-pages-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..cca074fdac0c76a5c7f48be6c069050d2cc06b2f GIT binary patch literal 141183 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 X11Bd&(5V-^pU~4W{G;UJ&HMiWql|b~ literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-pages-page.png b/docs/en/images/cmskit-module-pages-page.png new file mode 100644 index 0000000000000000000000000000000000000000..b64915493c9351b598b12e73c9f75f93c5d0cf8b GIT binary patch literal 28831 zcmeFZXHXPf*ETw+h={}Y{i?pI^W$_C#q{p(-K+Onz4ltyzE+2+D$C;ECA$j%0PyAI zq|^a`TMhug4fZ>?F)cgQnOK;ASnlewF9DT9Pqr~Tx2z?UBmjV#D7*_ZY|K8ci=3W2 z06@_B>kq5jx!3{#aN(AhlF)o(yg!eVPULxoJ{+dS%Y7F@GfjfW7><+s_UXhs%3N?A z&5iICJ>?qnWvL&X?=o7!E8BYaTfO^yw8h1JMdomeYBNJ3@7`(cr#~CEhG$sBD%H-+ z??EkmM5v;C_AIP8<>}*Q&N?SXsZ!eF*jnJ*W=6kUJ(9u z)9`<6YC8G#)PU?vAD0h3bDvmewC(7#Wq52DN5L9WmHW2zYXBb1=wP;D+4O3w7iLP1 zqmC7GhE4vJfBIF8;^(n{HE?sBY<{C<-#z5Z?+)MkzE9=xWJsFJyxs?VvA%QN55Vuk zf1~MbI%GIDrU*N~8)|i9hxpIK%z++duz?!gRfqU#o=#={#jT;1^ru^K#k>zz`8QC6 z)fNjC*zlnxIM(n<61Il&Fr7cXzd!7`@N28do40s>KTGy2njbXS6%~SbuXxKp$|VW) zr<*~-s||%)uHN(heNLaK5lIXlM-|FSvr6S&KV;?Olj$Fv8gTNzg-Kb=xF5aAf!p;V zG?Ji)-D&~KR`K3vID=|n`u^cs_e=G0NNf>~MdV|8pHz0xU_oq}a>fh(r|!;-(V`nQ zysdE2O1V!mht*vu-`-u9G;Lm)>fG9k8kmr zh~^2oH7Q`Gpq-9FfIexA?NHtT_nttu?%L(qeTL}6js-r1U}&ni{AT+oHKWSsup#p2 zBD4%m$`^jy3(k%-)xTZ{fT@s%x|K|Ay`9oVq*+JClNg;T>9x<)>-M=e;<*xi?s1(~ z;XS)7-$rwkzW8K*V8ThA;A;xiL-^`9eE#r^Y>Cx~GSIlTuws?R(rKFODc_>b#(SZb z1+&a4gYsPnPs>mp0+-)^QP>uq)Nu5S^J{=ur6R0}_x`m#S7(rVdDm}z6iSC1%kifA zEJXUvFGs2{Lwk`k(q=_BSJqM)^%Z372O;L~9#Y6O67*Cm%Uwm>Brn+2t$CurMgHWU%FpR81zCK-4S&oSpqXZ% zQJ_+ly=Pfi5(1W@t*`XEGrnIF%@x?y_mSwQ%^*pIQeK03y-Kho?Iqrf(NqC+%*Xe_8F*FG#4$$XVFSJ_{%D>Qn=CGW)Q>bN+X&L6 z53lrBH&#YQeByxE>l7+fyv$>$3N~$5dE1E<=3hDoED4FgD*UQ{<~Q`5as|7Ie~G30 z^v&%gR15DFJYm83qFITCL8UyPu85RxgWf9V!?nwq11YgceV8YSHAW^ndYeUfd6j28 zux=sOGRppQ#)+Jk-L!)WceYP~VZL{tRd~rR~q3pR*^|-R6j{twlBJ7)Bg(TPPW)n5SjXb8hqQpTRom zX%LY&|LN~<`QQF$m-(l!x5Jt{>}oN0_~LK;zP{&sEi0F{=fm5) zxYQ9M$`-%hUO;pz(Zrh@X{8_dNNf?68q$UNsLA@ z1aplEf;{%uCqz>Ws&i|&9wqdZKCd33{%Z-kczs}Il=Vkig{C%$wo5NePfbhv&hPfO z#k!5J(G`kAu`Pt;6wDx+>$7RyFg?(-)_Y!$$-gV>AN2Qss;MSi;ng!M$o(*>bm}Jr z3XH_D_`6f`W@b4lX+q=y3$$YBTD88HW;3-7(~8&A=gA-sY@fj(06$gss>Yot#>ndt z=_t=r>-u5;jKthr8r#`&5JnTYw{E=FOXRZ1Q@)Xg4|a&fCl83BkMK@RWb@+F`0Xsk z{m0jbIJq`dBD@}uy1s@=rtRF~^&F+$+05d571t$nfAV?|1$Ek_*Ums@M?F+KwAD;_ zA^Db{3OBB&b@BPx(=yV-FhN|0MhCVR=GO!437b-~`p$qk`}d6i;=X^TD}bov^@IUf z;`;A2`BeZ_6t29qRINTUNBcC*245oE?@NGwWOn4~6?XjXt2)MAykl562zr9s-?^Q# zC+;m3K1M9gdo`?a1J4&Z2wvd;LFa$Z=cl6|gCs~HeNrT5F%!EqwSEyI(}4vVTu-6 zPvF$6rCS+T>@{{;J3L`o>1kCt0uxdu+k-l$G5LX}jxCPv8G6i;_97J0j-Lsu_BkXvO}! zhhh$bSvLJv`g(dALWU3?c6`SL6Cx#t8?6ST^Q2`|aE9tIKc-Kjb4JP(qXwyI@^)aN zp%`PfT$5|#FQy_({l1b^F#_H$ci)`rhp9)AEv;$cr^#7luwHpY_{7VsDfkSGS?sjn z6!i*nDTHVb#|v={c%$-0z=G(UlCnImy{SyUMaP=W?dRKg8nC_t-l>+ILV0*W3c+s) znTy7WLEaTh9rJ_pX9zg?u9|=31+GK61P9m~0ZlFYnd9gwTyE31YMA zna@Zs{(Q}F`1JpXdNC0 zvPLn5u0;7!7!zjwDYY*sN<0 zUh4EC^uCY1Q9V4QA+G0RT`+voQo`rz0k9fN*ixuXv6eaO| zOLv9YJu^bYB86hEn);)Rsl(#8ih@GA&M(t0@EzhO4D}oC^7EK#_G`1Pp$bgm%hXoS zm*Z5{H}eaXW{PdvfA{zl`6}?i*%6T$$jetwbnbD?1LT4jVlgW)tS1d|yeo<;ou)j4 zu(O{?`$->oBdsS1uBo2Iqi?=3uOjIt73wv#+8$-Y(OQv8KMb^kyvdp>)xu*ksN;Op zwsn-HG(yWf6VQ!J2;MvK6=Gn&Jf3j#4!eGhL45WyQtZC8v?AS!@<~GbU$5qz{p6sv zMI3L0Xb3s@F6XCr6l~%!X7Vcbya{m=gshn*BkTtrd@7%#l>=|y!Py0O;v9Mz12-zzc-T|em(gWlhhX~ z4GZ;`5>KAu|F3Z1KjvBgewJd!EncDh>7LKmj(og5BQ5!UR&m^y!l#d;C+q_`qkiiX zurtXnl=l08Rg;l-j8a-)!h}6vGSl@@&%6<38p)RPvZ=>q&H3D~yC`DhzLS1iu73ZL zdZs!cgZR;-R1m0cIY|kAG)!JF5D>v;pfI5M`(o8a!=r_O+V!bypEau4d#~&#ZFJpb zP!JqmX=&-vdOdgC+rba++`_~));%&A*w?8O;6%^!26^BF@>*=b-w(FxfHpD~u=>l&at6O-29G zt`PUE8n46jQ}ES!+549{Th~?%V3e(k8%*O9(hIj@cIr@{Y2p19Ab>?@w22!km8*Bj*cHi|BJ!KGfN zc@TZxlI!3R5WhK@FVCYXg9#cz%b)p*|DLwx2Jx-hsFf@`$r4^vtKnir+~%_)zLqU4 z-KLA^rzTyw8YWUT9+=ur|8D#{-u^!oul+6jKL(B0 z#?3+;X3@_0Td*%)z5jo_4fy|3y!{{b_n(aDKLqOJ(u)<`e?s3Y)n-_x6)RtOczC{T z-Nu7^x9R@6^U+doC^`ZYBVSwVPAewR=KeDy{i7lMCqe%C3EsXsJ=@H(T+aPb>o~{D zMHe%KzW9WeVM86dnkeR(a(guqA9!~YAqg6hYf(*-ZKC{ z0YH3z+BmWa6U|45WO&cYr*hlArj*`qoO80eXG(?j#T5Xs>qoe?(f!EJ&P0 z-_115t44XHFThXZc9XzB3L=TlgEA~NFN0_&V6yO11Rj!-IJ5^8WY{a39+DD`8Ns1~ z?%kZa@^47FbNb#IeLRL9?0aI4wH8E-#v8jD66tU0E?jfJO4UrON@(cu^?`ni973%a z-Y7QcAasCyvo6iiRzYBTsQ0!K%pd8jrAgAmObUJz`aGyZ-B;kl=L?i0vT?78W z%ctuv9*OHa^{CGr9l)~AvLSF5Yo(F|bFI=v5T8`X#`^Hu?z%}&f-F>xYxAOHXwFZ+ z!=`$w#%-krKjV-9XK(caTa^z^Up>=4ykGl8^y5y@@vbG;dZW3wOJV4%%s3WiqP91& zdwsLW^24EB4!;WrTf0ImEh}^!<@tE*mZ&2kRfNbw$`goLu_EtS$N5Ut=%Q%J^zv3& zMt8qhyZo$x0$rv>Hq=(-1doI*5feXnQU;!!=nPfdb}zA5K62~srW-o7MJj*V7xGnX zYhYnBysYF!+%J&mjV|I9TE#^R?Js{K34ke9xo%%g>C5&cqh;``LXY@VN2Aj3l&cwC3Fplub}{Un*@)da&P)6*$?mnQe;MF-6{ zi+w-ef~z@Zcu&+{2zO4sgD#4G4&m*!^>^c9Zn7(I=gD>))(zU6>kj?CS!A2JQX!bB zbuvo4o5OKmGYMEQ+a6nhdfj?-wKMQ3-kw98n&3NZg zPY@2J>Bi)9R5JfsSd1-RYA-6vZ4S;b_0z2gb9Ki7{`pQ{jQ)(Q;XFmq9LQpsl)2ydhEmSgOvXFdtR(3f6}~*5LC)UU)(+0+bCKuvTf>LBvXtoneyaxw~z8h zdxowp#v;87gOAX!CuZNLW|DomCwB-@%uG4ZchKYeK3$MTSHP7=tz8=rdsbrQ3V*RX z{Hec+<;**C+prIX8m?D@tjC!w3aPBGG{lNEA&>krJ?>Q?(7XBOm9LP#P!!xL*rDSY z41s0$G9xo>Q}xO?_C%BVbAvRGSs2iA+>^Jh6 z%x2J{KGR#q>u*?(-L3Uo4x18Xy6gXE_5eLVTJ`Qp}Q!m~o_H zQ=g?Ss>4w(Hwm4;_({MF9z^O9W&w?d?5XXmW1Z682k5Fn11-O~)^XNeK-k%EM4tP( zeA}cD^DvAEq3*3Jg6&SKCDHrg2<|tIRCNV|!mp|TJo$ygt#*=Ew|SYG2eIq*S5H&2 zgeFcQJBwTk8SLapK_zPb=PVEVflJM-NnF(@@B>q5_M}+=ugAZ+9h8XU8 zja^K4>_cJOrEs0&Ryp>2)OGV-b4mpE-o>|qO9-=4H%Or1ET4FD-*kOZrbn}k_zCV0 zAkz#VIm8g6*yFEZ{f zdWv45ZV}YY$R@7*YPLx%Q|GZixZgPZ@{t`}x6##0YAC}ti|Wk~UO>tVjh2oJ+i&#| z{a~+!o85-R;gL7>$2LX;@7l*VfwH}+JUioI9htkrh%5FCtJw;DelR*JHr3VIy>iYa zi&7cPsGpq035>Wzp`{is=N?&8_($DKEm&zAd}}`VSOhH4R5*08*(E3;Ub<*VpCFi| zf8fIU{v>l%1=JqFHR$NHPT)kOh-}tNIO0v%c5n3nLcRKMhTNdY2SUbE0RQ%9Rk}NE znZUg%^A$>@vQqM+U8x!ObQM$}cJT*65xy$y5;3hzHxcN3S7eKW2{GpxW{t z9~wno!_Ss9-jwdd7mfNM!mf9YjrB!%+8bpT)7v`KYo(^vnXX0TyJG0bW2ZDSzsRqVK*P zck`w#b3_DT)l0UtGkoDG(dj_U4E6KYyi!xbRo-s;r$9IHhgzH7SX5kJ zBYHS4Li_Ki+n)fs3lw(ILpr0Sly zf>)FA7VCy{x{t$okH+3LPDaaD#^mzIv{87rVp({moq&SgO|FshEZbVoZu<)f2F6*Q zvw>)0sLaj8mHJMN>v6}VH-(nt41is&`^+q9!x<{IXW$!8+b`}paQ|@PVx06EZD-!3 zZ&_fDfi5jLGEg9wip`YjXT5~+D_NUTOMumrfo?1TYq#({^8~?or=K3hbImK|=g!dr z@jf|$u`1t*7<8W#9`Me&l%+lsBi$D0ce6wJY8AY>7QZG&%rWtO_$47TTRY~*nTwG#r_Uu!qH z>|br1K;E1W)V`l3>xJlx;tpEvtwsQGT7CsCz`g}H)hHV_KA4hR2XMc4`UNdX8*E)( z#pYyw*STl2a3C9eCR->1z39@w+_%C(w8_K?oe|-H@j!AM&Ns-LURl+X8MV2;yj*VG zUqOnvH)~vu7~s!Pyk;oQ-05Es(rJbiDwYU}m#e1kM5kPlVri`#%X=e{9_{Gw(iFcI9kZ|AA{zdEy4x=$sY5;Y}q#x2C;9=6LNY^r?h3+4329m<*Hv+ zDbazpLlmack}?qP10lma)4S+3=S(!#_7wx|7=cUG^KQb+dF=+K{HCk~kHMTLWa45C z`HcPImLFtA7q)0~}N!2CcqjzP|vp9%VJP7;eW&!*^e^ zZ{5JEVeKcajS0NZ2FRANp%Pf2C-)_ZNt0D_?K1c7`vn)Mviw?ee^G;gBbE@I1r7Gl z$L`u!JW9Wg!5?D~o2P91bEcx+jlUY~DE$9W62<}Ne-f2q+5Zt2;Qxg&P`(m7`jONd zgU49k3GIAvH^idz+*4gw*JfiwX2hFi@G(XT3^hWG7}{Dy+8^=n>o~z=f1oW<4F(cJ+(W_89gA zFK^u+e{cR7s$#@$M33y?n$oknBHHXX@2m>DEy^pR%+7zhJ}o%f-a(%IWFqi0Yjy5$ z1@pY<5pAcSooTC&(baMKw67;nSdewQ+3+Xb5gH$LIhfAbEsPo3vwY**yylhn`q~We z(#?h*O4vFV-VA8;g?gNsZ9NB_HA6YKxA|5X&H<{}WKN$!-W;Ty%`qvlFW2194t_k# zx88h2qpcy}{@u2=HKjl>1DH{taS}7Y7bL$OyAAivtF!E30`f=w5L9G;JTGabl%jQ& zZ29h;29R=D*x}9EIvn+ErHBH%;=Dg3*gLk#%I`sjDF?c1jHAz4Hp=Y=Wx;TY3$zHn zsdKe2Jh^G;8h&YPRARh%rHI52T)-9NUMeQQ50H73!My2ZZ(5iiy}O?n*AQL0 zDGrh}`TCWz)H|Jcd&?F3I)f8=733-f@`kq^EAI&D6h*cC1aVgBxO-B7ifvbU*<2Qr zP`<_Q^I>9+`-$NQqB^SPBTu>0$hv8jdfQiIKkcE(RO9LqL+`L)3Mw3JA3BovpfH|25~*&fxvd+cSldg?9~W~7D~eRr4*h4qtqnMsv(w<_Ij z3vp$WyZ5-MsLi7ECx_8#grB$ z>p%lx6q&&Hfih&DyWqcwEj`SvVY4Ue~~glOj*miRcj6P5U=1csDdcd8k-;q&&gI7ivBP* zj!4k3+$#{sjeQd-LY|pvc_H3bTUWne^FL#F`hhW6f zTDvr(URiw)AJEV1KlS#G6x+P&emOcw`8M3OCo^m8PKJ8VKJ61Fx|Z%nwJ_!Q1{g6K7}26xwpdY3oZuMZ!8@uo?JBJ_ zIlS+oEWIH!7z?e?I+Uo2fnPkN$ijyvYf5)$ROs+>e0w*rzK@zXWA zlSiwC_IEX7$luTfvL}5=pb|N5jqk47acBzP@&=ape+I+%;NY-CBVg|WhhO|bpk#2K z4O%Ke=-1nM6^#s1LM>p~Ceh^UwX@Uo@8^6Mj;u)%sZiO7^0#nTC=?@$r9oBky*+HL z1M1dv0M+pYsYLU2QcQ$tmT$G0bsM|M9I~tn#?&)6pO=Ri!L*EYB>K(sRg!+d_e)#w z9MZ3thb}dpgh4DyhNZo8Yf5RfbY(VTBP_=ym3#I9%7|P5PQ}b7qx%(BmYoeeb=% zHfm)$@GV`)E)6{2pS^ziYA#3VOetR}qfMfRN|C7a=Dv?V3fmHjk3HH=DQ51HZ5YQ` z5whwJbs098@>#uoE8Vjo73Ob*tp8uEqFz6;0Zuf6k2oQg_$zS^o=FJuuUFvr^~y%!tyNPW4_ea>wy zM%~=2PCIK`HCGf36b4zWRKYLDlH|IFbm$OcKTpeks>Svfe*E!}(kwSTOFl@>wCZwwtCr@BcRTQW7X7f7-RN#XfzK0s zKXx~}VoiYqdD%r&ati$DGcZ4@6+cQ)51L}c?7YbPR5D9VVA{#{4eWuITAk$n-ka6< znISa({#JA0IRj?Nt>GE$W?BV{bY``R7etj_ofUqSe%ia>jW{LwaoDY}XIV5iEWcUq z|BE5F1+NOAN}Na5KX`W^UrD(M?FFhEAnmHSqtM&-G2JvO&`~Ap+*qzi%fKBC$ zCVo*UUYW(QeiWSuEJ|^(Q=vVAGMr}=*qyH(w~lzCb-(Ja+lhrSr6uW(^8&iS-#wqAKOG}Y3itA*Oq+Z8&gff&LHh6eTtIcw+b+Lc4?7C>MdR5P* z=ZsUQ4;U@mbYfiL6>2#{Q%2%YdzneV9_2ON^S*2El~dX6+TA1M-Ts$Bmyt@Y$ody3 z_WIqu-s4K`SwEJ^l)@LVWfr3IqMz?3O|D4Mti^3^Jb%%Q%#ko)9E&Sdiq}8=-l3oM z`Q>MjyG+|+1S>Mmqk%?!l%OGWFIm-nFO(1FYRA!h%;V-N%V`l^c>A-vu>PA5kgQ6k z=ysKK(LKYnspJ}5@AJ{cmfK;HvwL!|C&cy-T*rIiw%{qER4PnNrc@K~(j#Te z+S}cZllFPYJ;&SG{rPNCyAQXeox6p`xH~iODOtT6&NS-SDO!xxXyV);NGbnKk9&Uo z1T`D(vR;8E=VF*hA)?Gh%(bJAVLiEs{gXeHY}R>4`jzrZNBm&G%6?k$w>jTAh}Bal z5LmzDTXg$lQqwSjgW} ze~@c<$ILFJxtj>K$2>iFDK-FxVxUuLBa&TbPfR9x75K&7HpCX*)Y zk21!fc2x8Ev!R2YO01j8YWkfU>yq!>+|}Kg{0G^_I)~h2v$CK9P@w*n9&eIpn{OHE zO~5!y;n`5vry`xI#8+hcM{54?%JzvZ6YyrlpW<;ScB z=^o#E_4Kd5`fJmv$w6WUWtL@DGAkJb)-BCe8;&(e?PAipdDL>PGKU+gl?_LE{!1QW zJb#gUqY~7}`rZiLR_=B*=5cdbac})d2eZE4vQ_I;LFP}z&58xkOkC(Qa1PGcwc_vF z?m7K|=m4{fAf?Tq>6o+-{&E3_*Y1LaI_0?-D?tY9W|0-Mz4cS)xOvSxe(NXmpNN(n1P*t}eww*Bny38+ z4OEeS6w~RD8bva0TJd7GmI}}7_O~tTyI(d+oh;qdLpkmI$8XGc{g-2wzo46Z>VM+$ z)Yy*Eb6xX4mI#$nxnG!r)HF3|mC|^UOrJ9biHo!LyM1u@x&8cF@c$-p<{yBK{{&g& z!n9Mbd4YgHMu@ixS0ed8afbdTqMjIGI76vYzwjVT+V{Ur{rUW>=;g&~q#W(ay=52O zUqonKu<~6zyg|q;pOe1aLMl~^V}aETJE`CgG(}#G78Y6ADc3xn(tn_H9eCoCGnDIz z>uQjDknc85I$l$9b`q;@k{4Mih55WCE1J`968J4OW~rONp;%7?HNEkBe_TY6;#v#; zN;7Dbv=r-LlAOIXUNBb5lJ0qF(Jt(5CJREq$_9TkxOpPJ+%7g>Y!`e<;4sE+#=jG* zV-cJ}2+(?TCM84V*L>`68k3@$Nwm}mmhGtSR(K?w?!szkUdZr#*CVO7-pP7Kk|XRx zC;jPBrI^;8WDIUnOY5*9HP}(){_Vm+%s^{f5VPpdYHpfxv|kvT=pFig-z-u7%$E|1 zPFZsd+kZc!!cU+{(TxT0#1uIk1kIx$?0AWR)F!*t4uzkmy_(XKt#cwW@BGD0ZNG6V zj;K5JWZqt-4^Ml;Q5X%X8GSwQ+}4^T-xzI^bz0LynJECnC*8R;+C@%UMLSUP{diJk z9Ba;yp4IqQUKRTAU{L{`m>AFMXUuC1Vr+z3Qq8m3JME=a6WRoARv&?*54ps=6VFyc z7W+FljmXOIi$e+p92vSNW1uJV?=$f%H77fWH(TlX zi%JsS0*yzsDXGvV3ozIgHo#3-EwaM@#r5qfAR4@5Y09RmqT~ zEZvh&zbFbxWcZ28VEb+1N4s}GrG(_dHV# z1D1#2UE_2kxCr>KHMev@gmRH-(XqfVz7aE_qT${z3}v&U@zu#W!kSEIOTOrB9(LN! z&l`&gi|N#oKOCi3{o+mCMDe?H;m32p^*_;r?i+pnPC_s=9Kv6J3DI`M&WPF-9YaCQGId+&7O zMTl(o@j;4EyoR;!i*JTk8Pkn#Lj%$-u41P`S!clQ@_}teEy8^2z6w7TS%-n^LR0l` zpLcv678Cgh4qilCSd(7fcaxCYX3AbhJvGDeLw=AqVtjL>BaPCFk6u&AZ0nh$B z{(|nTAq#_;tGI89%!5~=Ah~sPR1iB3p={r@&GY_uoO6_K`^KFgq4HF4v})f^GqYn4(Z3VxZGE~LMa ze5R*x=<7StSDV`Zvna7g);ubTXJ7yHbY@7aa0Z!~UVTyjB2;QB#BRiYd5u(LW$q+W z#!V~hJAh7|SD{N(jea#Lko`BcV`j|5kh}xH3_pro&yteic^38Ru4c%GL6QuPG#HsV$!nHCcGZl1?HJ55 zFiUH_!1HAv?Ik|9!(@urJbxLUr}^%MjIFPXA-OcFMV9$hl`v$fQ}L4rxKuXHtvw%~ zy&EmgksFr0S?e5>vTTV_RD%%B)0_L77H$DWZ_D*bVj5AjS9Qfb`387v(4oUk2wGRJ zW#*NpH9zrBAC%btr+>HD%0R^tVmRYrF!WGb8*x6YqNLcI0} zHq^Y*iN0?N_DE7KBv-@c*L)Ux`!b4ks)g0ZOr5@m?-C(mG?`oA6%85n8;0KkEO_E_ z0_%$WMTPb8O83Q!#BMW4Azbk8)Rdxo6(!`Nm}ZQ9RHX6p1NB{$&!9 zsZ@A{algPaDeznl0=CogRW_B$73d|Vj0o5Wey=Rs@a6G-()(2?;=`)=iR%-<5{{Ob z;JMVl!aoomGvLhFxy9AAEN_#=c^)-WE!y|yW3W(b=)>JshKcN>Wfdn48kpEYi9CZ| zua5fh&a2Wg&hz1ORriN|B_(4v)yEZGVbLt}y9Jh6$?5JhXK)Ocgt^TfiSi+=(?deK;Z8AP`XBB|*j#gs$ z%&3Bgt6#Pa;tsh}rKr=<;1zE`-cP<@i{;Q`#-~u%O44m-ngMbU2U%h1i=QsPBU&-b z2(2`Cnafm`U^Fr-dKsgVu3Xk2E;u#*v_HWCucbuOyR~42mwa3TJlE85YTvhHa1+%( z1eDDD%#(5{mHF66z0wwUM=bK@M7Jy8tqE-gXfumrcYRnzx#@35!C{ zhY^2j6JrR7Mh{V1{=jXOx*b_s$RhNJ~ifV!(-t#ZTVpgSR>gBiWtN(RFdu^t_+rWDsa2kmkV zhfx3A(gt@!-%+D=p^TIvng)~nQmFeJ9p3>b!wEFon`j0dySdJyfm%DBp*MaY9XdV#WUMISc$)i zW+lTWLc6}PweGx3HQ?N>unF3j>%D(g7}FD0s24AUE|Fag>e(ggRCY`cw^?!%ujy$H z3me9)JS(M9hKGm{29PF-uf8$Or(mSAxeB~AcjLEY%x}vXynN4dGTC8G;9c35z76^m znfVNXna?Uc6N{~H(r-wazw}QRBo^*nG3@X>mnb@XSIyFYbfrN^#3*M?% zQKp|yI!DA7Q?|d_sqo=MEi4aJyyW8buTv2}LF5o-dE36+{C*D6MPn6`rd2Kin_d{n zz_y6ZQ`LN&sm|x^y=grZ_cZ${TQn;Lt`^?=!!oC@>YAR6=SkEvB`(irsRr-Cs3#Jf zH=(R}Lowid`x~Z+s3w_teJ85${XhiFxC+W}JZEY%h6k(g?SFwPM!qRPeaFru1L%KI zgqoL(?hR+{uv;hOC{aSJ?g`8|35;(yOTdrwn))D;q3&7~+pbTR_yJEj)(~5&IKEkr zqQlyQYd`svXW2|=XQwxV<=la%c_IPDn;KrbMA6oJoB5-45$olfD zp&2woD)A>jqmb1FwO0KH3s0CxYRlOo<;qwI^2sPO+PR5=&JRy2@~9&wzxyOq7ha9B zi1#z})({OvY59n*oi?pQQo@>Q#+45-5qpI0#1^mYg~CwsRndFp&<2-^jEAj``5J6- zJ14Uyx=)094-jGxgo4h7r{8z@Al|IU?PQpK&C!u>m~TaiY=!NK)!KlocruP7)t~u( zcb>WIz8ytph(B)S;EUvN2A)YXT-6z3s!@5IkSPCR(|C96DHaT|$UnQr0Iw&#&F;i4 zWAir8!qnw_Xm=l~q*60if7Iw~Qs1*KE>*2L7zp&77ZVL^H2NmGHjjq9Q~-So1-0x2 zEG~SVlafTLHQ^QvjhTP;UYso3BV(kmk_>g|?C{6}m%7!=yU9oW&)u76-bqLcd`{_16IaMcRJNAMq zkframk23sdOr+ai1y7`ZBlh-7z=eF(mTgZg1WMHtZe%)Yha#^s)O@yF0?n#w$k^Kr zXs+kNtn=(Dn3#zd{I;2F?T7yk>-Yqg04E0I+Qya@b6QfGei$RJh|MBCJl!YzktPY6 z9Ew5&ja`n5J3#hzWNaB%_aF09H2F;Qd<`4kr%7zflHSVgZ)vbQ_Ww?PAA@^Qw1-qJ zT=7m#z!JuSw%sZG0{LQL9k{OD#12!xQVT$|7`)>{#Atxs(C(Ayz&4UZ^K+avI02UJ z@)hCTPXk6|iF1nt3R3}z4w+OjDPk!;lup*)^vUT{KG5;)k$#-;7}0-$!C^Xy_SdE} zD*GcGC_XCL+lhJEPdC>;ir}qNU)U^Fx5#TUJG0;E2W!8#oI%sTXWyL~B>|o;+RAqP zE`1ii)WKv$B~;RDkzr<}=MHkvCX7A&+Tik-#pmC@0C3X(RAqE3SbbezUOo8x%3>e} z2vFX4kPoK7eDs2UezN7dU3?zyY06crqN*%1n>#7X_S3QazkmnVMMFaWP?dHqPV_(V zQj|ll5BmLGVf#P)hz7u~3uE{Z$*!{hglZD|H;w)&K0B3M?f|CNKp2^sV+#jU6@J$& zJx#O}kmSWw8qd_*#$mw7U)w<_y;5p&4WwAvR5I?m5a)l@;s4L;g8ozCM;fmqr};ym zg;!8pUA}lTK?R(b0bo;DKw-ls2u$DjTg=WxXGazehv9R=@)6VG7i~pdEWO7*`<3>L<(222>5uk+9MD zSqc{Ju&KPb`p6p4rL94Fx|sqWW)V!rou>S?)bDrv6K3Ik#2@!T)|g#kLyYDUk^Kzr zhv-Zj?km&YczK>nLKVG{ce|H51|L4z4eXARMjTA*#jUHuYUFOdQ|`3vPv#pu-1!$? z&C;H1fr4>t1c^#i1#o#T&vM?ei2nT@GCvQHM+yWrWN4jorjpJPg%76J9#iOy!^QzW zF_3MU^1d0LcODgkt$kt_wv9+(Ae~gZIXAcqFWUS*SvI#iV%AN2n*-Y@-=Jv9LZ;<; zS3n?F(ZCDL0Emm0Bn1s7vjlU(CU00LyGyIirfrKGSEu%+xZV?FjHSc-7~FNO9oO68$e{svJ7}TA6)otCRrs=WTPu;#GZu6UT9= z$2EAuy-Eb>EHzfXdv=wZHBCMerG>f+XZrgAB}Q*ciqA#tB3n7$q?ytpc~+t1XhY5! z+rH%h6R3N8Y}y*=$n$amHsfFEeWr;Dn)CZ^w2|10R)!!|h4vOt?ag5^%283#=5#jn ziJKKzarR`yij2+LLw$vhvMc_9Lqo`0-f1zuA}}){Iv^FCrI6Im)^soNlFk*i1S ztt_0S+~;^g&oGdhiNSL?FL|~D{IW234hBg!X}{wjh`{8c5!h~vDOf)H8#lIR83WW` z^E?1`XKoAuTLOPjfuyY!M4Km!y~Iy=e|-|jvQY$(pw-wScct@F58?c9F$o-a{@@Jh zN+me4(%qtC+n&yhytI5hC&r+eHN3Vzcl-NfiPo`7vZyi?NnGBb>b8om{H%47g_a@r z*<0BhFdTn4PokVP&xQ~|A0<+(6>2DoQCI#H2BATmAnOrBz27VuMZ_q~`%AOPI$a&* zJkGflq zc@VYO_wL=x88IedyBd=mhjbmd}F%+kW~2E2)3 z)5tsR)#_RenEYSuoo84RYoCX)!9fnFpm+cQD~JdddKVRuj)Wp5Akqm0q!$B<6h)B^ z(vjZ5P(n*UK&q4w2oNBM^b#U1k%WXD^qjNr?w)tcd+l}Yet7e7GLy_aGnvfud+z`J zK=SUgawm*xw)W5hi1d!(_3IsYrZVJLsd;5zO8rPjvWIv)CM-=@NjsUd*d`kW+r92| zyG3ziZh2%j4@x?~U40Lt>@cuAsj63408l0H<-molHrjn^EB9XBK0sB)IsD+XEDe4! ztP`qx9C9%3^WpP;pSx=qwXbk%Mwoi|?FTMW-_*I@j^Es7G5|uZ6Ex_x>Oh21I+*T_ zgF~*3Q9~lx9gz;MCkYt^ZVO_7+=;&^AYqn+;Lnr;4v(_ku77zI5yrkL-EK~*QcO}J zMfZv%(e3YtuQuTs+KGK@mY*nVY7&c2zhnBv)}j^jm|yvy&zMkl-8eOD?KfNvH-ZF$ zY7@DHb;`Z`%a6AzbrV>;EGxDTu+C1YC?zx3JW2#Ym9C-;lqLsLr)^rEB)&f2I~xaOsyBFE*G^4qdE^>K1vbDHAwK7go+ zlz`F9((8(=%s7C92OcaHD|Q}3AL7*=D;2g|qf#jk?}v`I`jWoi69dz%ugO_zQ{-${ zm6~H(JWu!zDxNlR+9M3)?FtO$Y2(k%9?N4Meoksc(SmN0Lk})lMP}TP)-6+u!?vs| zde<(Lt~5S5bg-{pua}G}qjH;h(EUsosIES+!dM@eL&J3D=uTme4pfn;}P{$ zW2`?=p1q)08bG7-28mI#D!aa8Uj&qvC0qk6!VIGCVXvxoyX3 z*7?R6lIOI>1C4%$B6o8k_{G7#w^G_kgy35^^b@UZ9bllyQ5EQ^n;M17TV|}*zSqnF zY+W+zu}I?T`nB+x$i&eeZA3L8nN$id3iG z6EYw9_HgNn+sG&nWVvRZjE3OgEnD)b=->r5{-oa;x8yIL^-kJxCy-&&bLeK(7dc{p ziYhkAyFal|=bK)LWU$0I6X7Ks?tP}P^P13_er|~1_c!3qEz*$~R*^F!ZE2nCYvwZ# zfya$2VlxE~aI5qEVpbvk-UAIs9X3^o&NvYE*^^|Uv;@@r>p~TS6RbxS7xBer1QAw< z-mv16OWrkW8(6-figtov;k_VdjOCLSNwe>7F(u`Dys;oA0T~>$F0;E~YLI-BAuf3|uW2wRjg<_6c9kHqEISdg z7dEsmM003WUiPMgBHIr|j|hgQ;iONYo9CWAj()Ptqd-Lk^_Vwob za=MBGsU7scO)|zKkUDZxbtZCc80HersMLnL2G6}>3TasrFtXC)b5WcL?GrMs^0&cg z96P>2wAcT;`a;4-1!45*mzbwtCv@iK_xz>Jt-lHz-SQh&9J00AqkHGkCW?g=ok4+zcvG)LD+)RpU`#&1 z^dc=2k+NqEIXan>V<>7x;?&JZLh6v3_a$EbM9~?BAkLnN8N*bZB&0) zNgEJueVra>m0o`pdopX~)Fp#!zb+0_)?K=DZH~1kGoA@_DV$KwZ}rrMXxQ(aUL%(r z!KoQ6cHEKEhOL%#t&Vq%(*z#myRQ;89e53a%=BQ1aKvt4d%R!TGb?a)03ONv)!Zq16J>V z>;Napee`E`u=Hnk&`RpL@H&T;rgnfKiv0hO29aYlHQXH|KWe;`$GAGfCr zeq(k{2BFhJi`1zqe)7E{`Lvv#VREI?!M_ifnBf|gU6@zlLEyRcKt)Z7%OtFu0X*$X3YIStW_v-+!iS z>S4O_b2)=&&&cy$gURmM95$OFO2Lu(2+zNHZ$CP_f9EfP3wJ9_o|f&eKX#>=e_u}U z*U}t}<v{BzNM3;g3} z`kxK`&ujG``wjgU_lR45DF~g*R4E>b1c~850qTXRz|>e zm9yR_r#_SBB@S}W|I`09;LH1ir~FB?Jxd*^u*J-az^$@*tr1}El){1{U;r}dL%kG` zEr}WK?ZTf_I*Euzw?_bCXM0dubEv?B{bK?)OqKxDk7xT=9f{=;t29Hhh0^aA{A_T| z&_K(zC>L?-A=-$}@8yv)${7-!b^+sof9P%gG6){`v$O2MvKu44kWLiO*GMqCq!IG? zFAoQ;7t#Qqq%9otR_ z0ozk?Z)st$KR*Mc1i-ZWYnmRGJT+je3ltyvXa2jTijZYUZ?ZK-X2ptM;m6vuJU_KO z&0d9D7^Ar&o{pZaYO~tVz2C9KWo^Km=rn836)mnwIq$@I%d=|Hsf!80+4)VjGlx$8 znBC{SGcYu48?I`drimif3~hcn3nZ<&T|r^FT2%j8md)Cl#TCAxHSz|@vFxJ$2w=bI zdG3tsdXU(7p67Gb(^fjLBfFU^M-V;VpID_%(*d92niyil#~xEbGv4S#UdSIilY7+OvcoiL`slUg zQyj9i4-yK=*+o#ejVCzOpQ*f`ci?#0!h!6Oag_7pr^XTL~f?(_< zq3I9sFMD9Np?slR)R|3_YpB+7V_Piz>G|wqie_|p&evkSYNQg-O4ivn#hh^GVUzqQ zeiH@ITH}*O%^i=>2^qI4K;Cz8=VtvwkMw+@VXauj*E%|Ar3j2mgfGf_A{R5^x#T+e z0>d7}n3f^m>x`W%JyG>#M~)o}8rN!MoHQ0_6`*DtkD*^Mbt@O=b!{3C1*}7*T=s6S zkylHVXSDsHSdWDUdb7C~pt|h$g~AFPKz7d~IKKptr$6+?J0Q-=Ie$K9E4nPqx&$w> zd<4)kIwH~g<`j+%ow4r7xfe$kIxS)p?;xT_G~~ok3IpHff=+9D-+sMt&B-Ybn-1%j zRzM*MwB^*EzQl;irf36OJ+0!E5#af$)2P^}G#+q7-gn=8n9{hr@*>Ji68c8ot^X`~ zFq?Cf=;!)st8x0Rz5Bjolgw}Kc{}9`UzmE>{EE$bJ|wH(h$M^mCyNQmuS+lNbXE1o z^9Yp1iA`*ewKj8#&GzN!=AW-mPsEbq(6+p|Hi*BiaagAcNwT28Aud#+oT>k%GnL9n z6mpr^vs;k)n4mCw58OcoWle>w9qWf(j?kgJ_?3XyfL1qAIZPf7;sQ$gk$El}c4<2$ zP(br2xUp8rJNNd6-6gXmJoz(ZbML6jtkT9nQlK!|N)${<-P)VHW%rw_;m%IoxBft+ zuvI%A!uRnQz(4d1U3HXpqOSAbtnIb@fU})*RC$ME7lLFbCCiV{Cu7g1%pozUwxM}g zbvIT{R^95t7zEa|h+DLtjYw^rkN7laA@>T4e@I`_G7i(HnB&sOM$GZ@f`?+JRPzW? z5H5tT2Odxj^&ldTJ(;(|F&adh9YQzg)J{z`VOFKI#Y$=p%^eZGdMu5D_G_PfWqIvX zikyN$MBXe>wob^@4bd+T&`=+YtH%jS-313*$t~JfFL$IE2!}OW?ky^Y3+1 zvY9e2gatRneTpwQ7kft1fumfRP(u{8_T>3haW}t8D_i`jKXLQLT##~DiV(@2jd-EM z|F+b^lS-S7zME~}iqCGXCmoXEPYL2?uqQ9BZbj|l;#wbXm#x{X1zN|S6+hVxHuvhwj=`Rx=e0+3fl zsy1CU@%)&)YJ7A;-%VF-F(BhJS6>EUbrRk zjun%FQ2raPgd4Ytd{X$&S<$IUAS?SljdbsMrSA<_=?|=TDBM^d$XQY9A~eZgn;P7o zi2IL-(<9sx(~Nu=Hq0a&v9#c7LEF=kYP( zca+<=Wt};9Q1MKdj$*t;AV$hYu=TwJ#0K`|xXewNhacFYvvEvm#|2DP(?^ZG%qd3^ zzv^U78`bAMcrQ_Gt@T~QcW4v*_IhvX<5k!f#GS~*UXnMxIn2gwISS8wz#ImWdL98D z<&toyZS=LuXuBO4bARk=9jVRRIum@|jpc|-M7_lN74H=Djn9@k_gGGmzHmBC9CXW{ zVeBIJKRteJw`}(zey>*CGMN)`TYHRY!{27tJ6xR=D?DOhS8A=-143C5} zc5Fwf8Ey$4du}zma;i!bvr%~hw^PE8x{A`YPm@z13BGCpa-MH?)tXo^ZE7s>4dgnc znP4e5XKlZR@i$M@iZZ-IIHL`_`h z3`f{8jdyvp(k;NGgQFX6`R`;?x$~CZlD)s8j=3CY8jm1$I(Mu+;u|h;s=1?{u1n5r zrJn~Y(yLlrbGysq)om=M@QE3}fnzFk?7w^OgvbdtdZ|#g1gKySwRYSa%8uz9q!>zb zke*46K@j;SB@2W2fq&laZ}>~y&Kq&8#LaGnDcQTSymU}i=soMSUH>IVnXEfCo=wHt zDZ~lKren^7n-m!0#6;~Cd+uD`lMTI{jV}E@{NY0Nujxc;-TKOm}o6_A3KLu|ImN)77(lEUs zsA&q?idc33$ZRY%cHd_20Et?=V(nnb*Krry-ICNZ8(g;T2!70aWm4yIOcD!bq`uRz z-c?}ay_U)m=|rsL%Tp627iPaUPy~iH?yI&2DRUitN&yExU8)4oX#i^P`oX}H$Pa4< z>54oau~`34Q&X8deVRPlLjse6f}(r!oD&yEc9{U6l`Rk;@X>I6bL8UrX;U8%-m+mznpvSSEH@05$vy|{oq`)nZWD$8EQxErHT)vZzA({knSID54aBy%^|pqt`S z!5%5EPD}uob$yoQ=Y-tyixbb)sJDIlFthil3QHVxO?<%K6x=EaN5;MtereHAyymbiQ)5|bZ6%KmyiZOV^FQ{>%uy@)MS6N_4{Y&=bzj;u?&D;Rbi z@4U3-ytVVu&21_{+Z_=+Zy?ZItcj6mDjsic&;8iDv80{BrDMCelC8daP_HELSgFmo z7Op{rRdbzQ83tRDx-`+Hnt!fR^GGeu6^F!hBT;0-HXQlYxW2|A-atkv{~l!p?oKHc zW4^nqG;*dStDa;l+Exdj*;7jUV2=%h7c<|KXmoPcF*VupY@gR1yRxSk5LIpq6`PSL zU>|>vbKI=fyI&w;aQfy`x-~jEMvTKz5vU9r5-2Tw@BL_l6zER4Go@zdqFUvpOn*6b zcrLcTrBIHCG)fHaNlWIzz3BpH;Hwv(L#S;j)9-8*pi?q_rr*G!Y;kvbom8!j8?Pk* zofe}s(el&YBHdh-tQ@0Lm}e{HarpO<)^8dJtJ5<`iuAb@yf!U>a1w{dLfxgv{;r4Q z5X7@EKE!t4CD8qclwPv!?N20y3P|_7WLH{oy#&-M0+sXp^_Q?!cP z0R^`11x1cXo%t6kl2uEfg*BKSoA>S#U!}f;K^B7%Xb?6sH%c@}$*>Pp?dq*|Od(M> zZ|N}@!@v1*iIErIXvN0V_3AXzrWV1lP{k4DGM=Y7NsmcOg;ukTh^DyXpFd5f~ApP27UG}9r5Q|*_wMo^40Odx}3Is z8_<uy82^}bPMr;1Twt@b$ z9xPu7Q|CP$)!MPa0Ya36_g%T`UcRL4qQ*pAMVp7@DjVV2)dYlmbrAf0uTJ{TV%fuv zPYxqiM=1^4(u(-4E=`P_r~!gA37a=?_A^qeitV-bu3dzO?5gwEdCBqv^O81ObT8qUVC4Uzdxl^vTK(l`zz@?(q|HMFJI)rmdCcV+!m8kT@9+i zuXp&{m=k?AI;%RYjeI!q1;%+NQchCU_ z71pk6g#2k;H_&vMhE1MQaa$@r{YlRx&5JO{-&M%bF6|xeM!YOBT^8$(ZKy`XPA>;b zBq^3-uYV(%W}my|7f_ z*=V!Fl0_a%?i&qq^tm@gpT!*+R)`rl?y5;+m5Bu83f1=mOoOWgxO+Tm0H8!5=%{|( zEYR=dasY_#2hrSyQh|ZcI-Ij#!#1wbA7CsQc7gX1zc@K2P903CUutE%g-5@AhJ@9h z8TC4A`NQ%(bQ}mkjL~m>_WyLJYk=biHe=8g`}>|O8FYo^Au+~T{w6{b5Vibr`0B!2 z0}_S?O)MB#!}}Kf1}lc1_Be3ME^}(v=087z(N5-9&XMo zSG(y>qkcqAKk6oRfwA=8b2qNP%H32_lpSO&T9e!5<`gT0{=^SG%sck2^Ni26IK`{} zZL*cwn^|S6)x+8Q%g?E6I#2wmbS?y_ME*ZqUjMV{Q2u+9ru=WL1$y$x%9x!ktoJ8T z$)MlXrFXSQzNqo&p%lg=N8p|-hMPa98DKbtzN#V?U!=}8YEQQUW}I0auvZ3wQ<)NNL9KTCJ{IDn~disWP$S>h8C)Ss*yGRMa! zUD`k80DPfdk$H<-0{38l@}Zwo9EjPw#+Ft+*ScE89CFdRg@@Ne_UF3Y7~OVO`yk55 zVM(Y~ic>DDlm68lbdx~ygW%sA`_;s)c4jB>%o`sg*ott^BitZkIlx%+{!2IAG*)0( zmkSWv&xMNNGygzY&q_$WTMreFXNBmuH{ZK-Se$#}-H(`*0g#$!ap~Lw#aG-j_-)kZ zLBr27+q0ELq2lK8M}LQQbvLsnPyTGeW~smbGx;yvasP)Ks?6>kN=>@)$UZBLy5CT0 MD%y9;Za)h87d1!~fB*mh literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-ratings.png b/docs/en/images/cmskit-module-ratings.png new file mode 100644 index 0000000000000000000000000000000000000000..f97c934f1574dee23eb70c7aba5121c60020bb47 GIT binary patch literal 2811 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-reactions.png b/docs/en/images/cmskit-module-reactions.png new file mode 100644 index 0000000000000000000000000000000000000000..b915b85f9184f5d6f507c2960d791d191576e373 GIT binary patch literal 5616 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-tag-edit.png b/docs/en/images/cmskit-module-tag-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..eb1ebb3a52e980b0753f8b7aa3d16eb472b98a0f GIT binary patch literal 7506 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 abVgEhET7Ckb-n~#1!$<~C|4`lM*S~A0Gnt4 literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-tags-page.png b/docs/en/images/cmskit-module-tags-page.png new file mode 100644 index 0000000000000000000000000000000000000000..f41b6ecbd083b428f27973e26ec83cf4b53a7ffd GIT binary patch literal 25320 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 literal 0 HcmV?d00001 From 738f751cbb773e275089e85b4a6227bb0d6dd81c Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 29 Apr 2021 20:39:03 +0800 Subject: [PATCH 010/129] Update PermissionDefinition.cs --- .../Volo/Abp/Authorization/Permissions/PermissionDefinition.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs index ac525367ad..b83ed4e015 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs @@ -123,7 +123,7 @@ namespace Volo.Abp.Authorization.Permissions } ///

- /// Sets a property in the dictionary. + /// Sets . /// This is a shortcut for nested calls on this object. /// public virtual PermissionDefinition WithProviders(params string[] providers) From 6aa44c60c8b26d938e572af82f17f619c7e18cc3 Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Thu, 29 Apr 2021 16:19:46 +0300 Subject: [PATCH 011/129] reaction document added and tag document moved. --- docs/en/Modules/cms-kit/Reaction-System.md | 134 ++++++++++++++++++ .../Tag-Management.md} | 2 +- 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 docs/en/Modules/cms-kit/Reaction-System.md rename docs/en/Modules/{cms-kit-tag-management.md => cms-kit/Tag-Management.md} (98%) diff --git a/docs/en/Modules/cms-kit/Reaction-System.md b/docs/en/Modules/cms-kit/Reaction-System.md new file mode 100644 index 0000000000..88b61b9d8b --- /dev/null +++ b/docs/en/Modules/cms-kit/Reaction-System.md @@ -0,0 +1,134 @@ +# Reaction System + +CMS kit provides a **reaction** system to add reactions feature to any kind of resource, like blog posts or comments. This section describes the details of the reaction system. + +## Feature + +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with the public website option. If you're installing the CMS kit manually or want to enable reaction management feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.Reactions.Enable(); +}); +``` + +# Options + +## CmsKitReactionOptions + +You can use the reaction system to to add reactions feature to any kind of resource, like blog posts or comments etc.The reaction system provides a mechanism to group reactions by entity types. For example, if you want to use reaction system for products, you need to define a entity type named `Product`, and then add reactions under the defined entity type. + +`CmsKitReactionOptions` can be configured in the domain layer, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example: + +```csharp +Configure(options => +{ + options.EntityTypes.Add( + new ReactionEntityTypeDefinition( + "Product", + reactions: new[] + { + new ReactionDefinition(StandardReactions.Smile), + new ReactionDefinition(StandardReactions.ThumbsUp), + new ReactionDefinition(StandardReactions.ThumbsDown), + new ReactionDefinition(StandardReactions.Confused), + new ReactionDefinition(StandardReactions.Eyes), + new ReactionDefinition(StandardReactions.Heart), + new ReactionDefinition(StandardReactions.HeartBroken), + new ReactionDefinition(StandardReactions.Wink), + new ReactionDefinition(StandardReactions.Pray), + new ReactionDefinition(StandardReactions.Rocket), + new ReactionDefinition(StandardReactions.Victory), + new ReactionDefinition(StandardReactions.Rock), + })); +} +``` + +> If you're using the comment or blog features, the ABP framework defines predefined reactions for these features automatically. You can easily override or remove the predefined reactions in `Configure` method like shown above. + +`CmsKitReactionOptions` properties: + +- `EntityTypes`: List of defined entity types(`CmsKitReactionOptions`) in the reaction system. + +`ReactionEntityTypeDefinition` properties:asdas + +- `EntityType`: Name of the entity type. +- `Reactions`: List of defined reactions(`ReactionDefinition`) in the entity type. + +# Internals + +## Domain Layer + +#### Aggregates + +This module follows the [Entity Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Entities) guide. + +##### UserReaction + +A user reaction represents a given reaction from a user. + +- `UserReaction` (aggregate root): Represents a given reaction in the system. + +#### Repositories + +This module follows the [Repository Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories) guide. + +Following custom repositories are defined for this feature: + +- `IUserReactionRepository` + +#### Domain services + +This module follows the [Domain Services Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services) guide. + +##### Reaction Manager + +`ReactionManager` is used to perform some operations for the `UserReaction` aggregate root. + +### Application layer + +#### Application services + +- `ReactionPublicAppService` (implements `IReactionPublicAppService`): Implements the use cases of reaction system. + +### Database providers + +#### Common + +##### Table / collection prefix & schema + +All tables/collections use the `Cms` prefix by default. Set static properties on the `CmsKitDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). + +##### Connection string + +This module uses `CmsKit` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string. + +See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details. + +#### Entity Framework Core + +##### Tables + +- CmsUserReactions + +#### MongoDB + +##### Collections + +- **CmsUserReactions** + +### MVC UI + +The reaction system provides a reaction widget to allow users send reactions to resources in public websites. You can simply place the widget to the like below. + +```csharp +@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new +{ + entityType = "entityType", + entityId = "entityId" +}) +``` +You need to specify entity type and entity ID parameters. Entity type represents the group name you specified while defining the reactions in the domain module. Entity ID represents the unique identifier for the resource that users give reactions to such as blog post ID or product ID. + +For more information about widgets see [widgets](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) documentation. \ No newline at end of file diff --git a/docs/en/Modules/cms-kit-tag-management.md b/docs/en/Modules/cms-kit/Tag-Management.md similarity index 98% rename from docs/en/Modules/cms-kit-tag-management.md rename to docs/en/Modules/cms-kit/Tag-Management.md index 936f921489..86d1641009 100644 --- a/docs/en/Modules/cms-kit-tag-management.md +++ b/docs/en/Modules/cms-kit/Tag-Management.md @@ -9,7 +9,7 @@ CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Featu ```csharp GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => { - cmsKit.Tags.Disable(); + cmsKit.Tags.Enable(); }); ``` From be17683ca1d0f51c834734f53e8bbc5233c2b4e9 Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Thu, 29 Apr 2021 17:13:23 +0300 Subject: [PATCH 012/129] rating system document added. --- docs/en/Modules/cms-kit/Rating-System.md | 116 +++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 docs/en/Modules/cms-kit/Rating-System.md diff --git a/docs/en/Modules/cms-kit/Rating-System.md b/docs/en/Modules/cms-kit/Rating-System.md new file mode 100644 index 0000000000..8fd9088450 --- /dev/null +++ b/docs/en/Modules/cms-kit/Rating-System.md @@ -0,0 +1,116 @@ +# Rating System + +CMS kit provides a **rating** system to to add ratings feature to any kind of resource like blog posts, comments etc. This section describes the details of the rating system. + +## Feature + +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with the public website option. If you're installing the CMS kit manually or want to enable rating feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.Ratings.Enable(); +}); +``` + +# Options + +## CmsKitRatingOptions + +You can use the rating system to to add ratings to any kind of resource, like blog posts or comments etc.The rating system provides a mechanism to group ratings by entity types. For example, if you want to use rating system for products, you need to define a entity type named `Product`, and then add ratings under the defined entity type. + +`CmsKitRatingOptions` can be configured in the domain layer, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example: + +```csharp +Configure(options => +{ + options.EntityTypes.Add(new RatingEntityTypeDefinition("Product")); +}); +``` + +> If you're using the blog feature, the ABP framework defines an entity type for the blog feature automatically. You can easily override or remove the predefined entity types in `Configure` method like shown above. + +`CmsKitRatingOptions` properties: + +- `EntityTypes`: List of defined entity types(`RatingEntityTypeDefinition`) in the rating system. + +`RatingEntityTypeDefinition` properties:asdas + +- `EntityType`: Name of the entity type. + +# Internals + +## Domain Layer + +#### Aggregates + +This module follows the [Entity Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Entities) guide. + +##### Rating + +A rating represents a given rating from a user. + +- `Rating` (aggregate root): Represents a given rating in the system. + +#### Repositories + +This module follows the [Repository Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories) guide. + +Following custom repositories are defined for this feature: + +- `IRatingRepository` + +#### Domain services + +This module follows the [Domain Services Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services) guide. + +##### Reaction Manager + +`RatingManager` is used to perform some operations for the `Rating` aggregate root. + +### Application layer + +#### Application services + +- `RatingPublicAppService` (implements `IRatingPublicAppService`): Implements the use cases of rating system. + +### Database providers + +#### Common + +##### Table / collection prefix & schema + +All tables/collections use the `Cms` prefix by default. Set static properties on the `CmsKitDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). + +##### Connection string + +This module uses `CmsKit` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string. + +See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details. + +#### Entity Framework Core + +##### Tables + +- CmsRatings + +#### MongoDB + +##### Collections + +- **CmsRatings** + +### MVC UI + +The ratings system provides a rating widget to allow users send ratings to resources in public websites. You can simply place the widget to the like below. + +```csharp +@await Component.InvokeAsync(typeof(RatingViewComponent), new +{ + entityType = "entityType", + entityId = "entityId" +}) +``` +You need to specify entity type and entity ID parameters. Entity type represents the group name you specified while defining the reactions in the domain module. Entity ID represents the unique identifier for the resource that users give ratings to such as blog post ID or product ID. + +For more information about widgets see [widgets](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) documentation. \ No newline at end of file From be02e03f2b225269e260e50cdfcace2198fca05e Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Thu, 29 Apr 2021 17:13:37 +0300 Subject: [PATCH 013/129] code and document fix. --- docs/en/Modules/cms-kit/Reaction-System.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Modules/cms-kit/Reaction-System.md b/docs/en/Modules/cms-kit/Reaction-System.md index 88b61b9d8b..a975eea66c 100644 --- a/docs/en/Modules/cms-kit/Reaction-System.md +++ b/docs/en/Modules/cms-kit/Reaction-System.md @@ -4,7 +4,7 @@ CMS kit provides a **reaction** system to add reactions feature to any kind of r ## Feature -CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with the public website option. If you're installing the CMS kit manually or want to enable reaction management feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with the public website option. If you're installing the CMS kit manually or want to enable reaction feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. ```csharp GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => @@ -42,7 +42,7 @@ Configure(options => new ReactionDefinition(StandardReactions.Victory), new ReactionDefinition(StandardReactions.Rock), })); -} +}); ``` > If you're using the comment or blog features, the ABP framework defines predefined reactions for these features automatically. You can easily override or remove the predefined reactions in `Configure` method like shown above. From 95eafb0c1f06ad27273a34326e076586e28626ee Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 30 Apr 2021 09:00:39 +0800 Subject: [PATCH 014/129] Update PermissionDefinition.cs --- .../Volo/Abp/Authorization/Permissions/PermissionDefinition.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs index b83ed4e015..e4c5763156 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs @@ -123,7 +123,7 @@ namespace Volo.Abp.Authorization.Permissions } /// - /// Sets . + /// Set the property. /// This is a shortcut for nested calls on this object. /// public virtual PermissionDefinition WithProviders(params string[] providers) From 25cbbb91f75d965176316a775740bc9925552675 Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Fri, 30 Apr 2021 12:12:50 +0300 Subject: [PATCH 015/129] comment document added and review other documents --- docs/en/Modules/Cms-Kit.md | 18 ++-- docs/en/Modules/cms-kit/Comment-System.md | 117 +++++++++++++++++++++ docs/en/Modules/cms-kit/Rating-System.md | 10 +- docs/en/Modules/cms-kit/Reaction-System.md | 14 +-- docs/en/Modules/cms-kit/Tag-Management.md | 10 +- 5 files changed, 141 insertions(+), 28 deletions(-) create mode 100644 docs/en/Modules/cms-kit/Comment-System.md diff --git a/docs/en/Modules/Cms-Kit.md b/docs/en/Modules/Cms-Kit.md index 4191686e23..9dc5029b79 100644 --- a/docs/en/Modules/Cms-Kit.md +++ b/docs/en/Modules/Cms-Kit.md @@ -2,12 +2,12 @@ This module provides CMS(Content Management System) capabilities for your application. -* Provides a **page** management system to manage dynamic pages. -* Provides a **blog** system to create blogs and publish posts. -* Provides a **tag** system to tag any kind of resources, like blog posts. -* Provides a **comment** system to add comments feature to any kind of resource, like blog posts. -* Provides a **reaction** system to add reactions feature to any kind of resource, like blog posts or comments. -* Provides a **rating** system to add ratings feature to any kind of resource. +* Provides a [**page**](cms-kit/) management system to manage dynamic pages. +* Provides a [**blog**](cms-kit/) system to create blogs and publish posts. +* Provides a [**tag**](cms-kit/Tag-Management.md) system to tag any kind of resources, like blog posts. +* Provides a [**comment**](cms-kit/Comment-System.md) system to add comments feature to any kind of resource, like blog posts, products, etc. +* Provides a [**reaction**](cms-kit/Reaction-System.md) system to add reactions feature to any kind of resource, like blog posts or comments. +* Provides a [**rating**](cms-kit/Rating-System.md) system to add rating feature to any kind of resource. ## How to install @@ -38,9 +38,9 @@ For example, - `Volo.CmsKit.Public.Application`: Contains functionality required by public websites. - `Volo.CmsKit.Application` : Unified package dependent on both public and admin packages. -If you want to want to separate admin and public website codes, you can use the admin and public packages. However, if you want to keep admin and public website codes in a shared project, you can use the unified packages to include both admin and public packages. +If you want to separate admin and public website codes, you can use the admin and public packages. However, if you want to keep admin and public website codes in a shared project, you can use the unified packages to include admin and public packages. -It is recommeded to use the unified packages instead of adding both admin and public packages. +It is recommended to use the unified packages instead of adding both admin and public packages. ## Feature System @@ -154,6 +154,6 @@ You can also customize the reaction icons shown in the reaction component. ### Ratings -You can use the rating component to add rating a mechanism to your content. Here how the rating component looks on a sample page. +You can use the rating component to add rating a mechanism to your content. Here how the rating component looks on a sample page. ![ratings](../images/cmskit-module-ratings.png) diff --git a/docs/en/Modules/cms-kit/Comment-System.md b/docs/en/Modules/cms-kit/Comment-System.md new file mode 100644 index 0000000000..4753ebb51f --- /dev/null +++ b/docs/en/Modules/cms-kit/Comment-System.md @@ -0,0 +1,117 @@ +# Comment System + +CMS kit provides a **rating** system to add comments feature to any kind of resource, like blog posts, products, etc. This section describes the details of the comments system. + +## Feature + +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with public website option. If you're installing the CMS kit manually or want to enable the comment feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.Comments.Enable(); +}); +``` + +# Options + +## CmsKitCommentOptions + +You can use the comment system to add comments to any kind of resources, like blog posts, products etc. Comment system provides a mechanism to group comment definitions by entity types. For example, if you want to use comment system for blog posts and products, you need to define two entity types named `BlogPosts` and `Product`, and add comments under these entity types. + +`CmsKitCommentOptions` can be configured in the domain layer, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example: + +```csharp +Configure(options => +{ + options.EntityTypes.Add(new CommentEntityTypeDefinition("Product")); +}); +``` + +> If you're using the blog feature, the ABP framework defines an entity type for the blog feature automatically. You can easily override or remove the predefined entity types in `Configure` method like shown above. + +`CmsKitCommentOptions` properties: + +- `EntityTypes`: List of defined entity types(`CmsKitCommentOptions`) in the comment system. + +`CommentEntityTypeDefinition` properties: + +- `EntityType`: Name of the entity type. + +# Internals + +## Domain Layer + +#### Aggregates + +This module follows the [Entity Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Entities) guide. + +##### Comment + +A comment represents a written comment from a user. + +- `Comment` (aggregate root): Represents a written comment in the system. + +#### Repositories + +This module follows the [Repository Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories) guide. + +Following custom repositories are defined for this feature: + +- `ICommentRepository` + +#### Domain services + +This module follows the [Domain Services Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services) guide. + +##### Comment Manager + +`CommentManager` is used to perform some operations for the `Comment` aggregate root. + +### Application layer + +#### Application services + +- `CommentAdminAppService` (implements `ICommentAdminAppService`): Implements the use cases of comment management system, like listing or removing comments etc. +- `CommentPublicAppService` (implements `ICommentPublicAppService`): Implements the use cases of comment management on the public websites, like listing comments, adding comments etc. + +### Database providers + +#### Common + +##### Table / collection prefix & schema + +All tables/collections use the `Cms` prefix by default. Set static properties on the `CmsKitDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). + +##### Connection string + +This module uses `CmsKit` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string. + +See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details. + +#### Entity Framework Core + +##### Tables + +- CmsComments + +#### MongoDB + +##### Collections + +- **CmsComments** + +### MVC UI + +The comment system provides a commenting widget to allow users to send comments to resources on public websites. You can simply place the widget to the like below. + +```csharp +@await Component.InvokeAsync(typeof(CommentingViewComponent), new +{ + entityType = "entityType", + entityId = "entityId" +}) +``` +You need to specify entity type and entity ID parameters. Entity type represents the group name you specified while defining the comments in the domain module. Entity ID represents the unique identifier for the resource that users send comments to, such as blog post ID or product ID. + +For more information about widgets see [widgets](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) documentation. \ No newline at end of file diff --git a/docs/en/Modules/cms-kit/Rating-System.md b/docs/en/Modules/cms-kit/Rating-System.md index 8fd9088450..f5ec502010 100644 --- a/docs/en/Modules/cms-kit/Rating-System.md +++ b/docs/en/Modules/cms-kit/Rating-System.md @@ -1,10 +1,10 @@ # Rating System -CMS kit provides a **rating** system to to add ratings feature to any kind of resource like blog posts, comments etc. This section describes the details of the rating system. +CMS kit provides a **rating** system to to add ratings feature to any kind of resource like blog posts, comments, etc. This section describes the details of the rating system. ## Feature -CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with the public website option. If you're installing the CMS kit manually or want to enable rating feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with the public website option. If you're installing the CMS kit manually or want to enable the rating feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. ```csharp GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => @@ -17,7 +17,7 @@ GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => ## CmsKitRatingOptions -You can use the rating system to to add ratings to any kind of resource, like blog posts or comments etc.The rating system provides a mechanism to group ratings by entity types. For example, if you want to use rating system for products, you need to define a entity type named `Product`, and then add ratings under the defined entity type. +You can use the rating system to to add ratings to any kind of resource, like blog posts, comments, etc. The rating system provides a mechanism to group ratings by entity types. For example, if you want to use the rating system for products, you need to define an entity type named `Product` and then add ratings under the defined entity type. `CmsKitRatingOptions` can be configured in the domain layer, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example: @@ -34,7 +34,7 @@ Configure(options => - `EntityTypes`: List of defined entity types(`RatingEntityTypeDefinition`) in the rating system. -`RatingEntityTypeDefinition` properties:asdas +`RatingEntityTypeDefinition` properties: - `EntityType`: Name of the entity type. @@ -111,6 +111,6 @@ The ratings system provides a rating widget to allow users send ratings to resou entityId = "entityId" }) ``` -You need to specify entity type and entity ID parameters. Entity type represents the group name you specified while defining the reactions in the domain module. Entity ID represents the unique identifier for the resource that users give ratings to such as blog post ID or product ID. +You need to specify entity type and entity ID parameters. Entity type represents the group name you specified while defining the reactions in the domain module. Entity ID represents the unique identifier for the resource that users give ratings to, such as blog post ID or product ID. For more information about widgets see [widgets](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) documentation. \ No newline at end of file diff --git a/docs/en/Modules/cms-kit/Reaction-System.md b/docs/en/Modules/cms-kit/Reaction-System.md index a975eea66c..e1219e24c3 100644 --- a/docs/en/Modules/cms-kit/Reaction-System.md +++ b/docs/en/Modules/cms-kit/Reaction-System.md @@ -17,7 +17,7 @@ GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => ## CmsKitReactionOptions -You can use the reaction system to to add reactions feature to any kind of resource, like blog posts or comments etc.The reaction system provides a mechanism to group reactions by entity types. For example, if you want to use reaction system for products, you need to define a entity type named `Product`, and then add reactions under the defined entity type. +You can use the reaction system to to add reactions feature to any kind of resource, like blog posts or comments, etc. The reaction system provides a mechanism to group reactions by entity types. For example, if you want to use the reaction system for products, you need to define an entity type named `Product`, and then add reactions under the defined entity type. `CmsKitReactionOptions` can be configured in the domain layer, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example: @@ -34,13 +34,7 @@ Configure(options => new ReactionDefinition(StandardReactions.ThumbsDown), new ReactionDefinition(StandardReactions.Confused), new ReactionDefinition(StandardReactions.Eyes), - new ReactionDefinition(StandardReactions.Heart), - new ReactionDefinition(StandardReactions.HeartBroken), - new ReactionDefinition(StandardReactions.Wink), - new ReactionDefinition(StandardReactions.Pray), - new ReactionDefinition(StandardReactions.Rocket), - new ReactionDefinition(StandardReactions.Victory), - new ReactionDefinition(StandardReactions.Rock), + new ReactionDefinition(StandardReactions.Heart) })); }); ``` @@ -120,7 +114,7 @@ See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-String ### MVC UI -The reaction system provides a reaction widget to allow users send reactions to resources in public websites. You can simply place the widget to the like below. +The reaction system provides a reaction widget to allow users to send reactions to resources on public websites. You can place the widget on a page like below. ```csharp @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new @@ -129,6 +123,6 @@ The reaction system provides a reaction widget to allow users send reactions to entityId = "entityId" }) ``` -You need to specify entity type and entity ID parameters. Entity type represents the group name you specified while defining the reactions in the domain module. Entity ID represents the unique identifier for the resource that users give reactions to such as blog post ID or product ID. +You need to specify entity type and entity ID parameters. Entity type represents the group name you specified while defining the reactions in the domain module. Entity ID represents the unique identifier for the resource that users give reactions to, such as blog post ID or product ID. For more information about widgets see [widgets](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) documentation. \ No newline at end of file diff --git a/docs/en/Modules/cms-kit/Tag-Management.md b/docs/en/Modules/cms-kit/Tag-Management.md index 86d1641009..aa4b675dac 100644 --- a/docs/en/Modules/cms-kit/Tag-Management.md +++ b/docs/en/Modules/cms-kit/Tag-Management.md @@ -4,7 +4,7 @@ CMS kit provides a **tag** system to tag any kind of resources, like blog posts. ## Feature -CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with public website option. If you're installing the CMS kit manually or want to enable tag management feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS kit related features are enabled by default, if you create the solution with public website option. If you're installing the CMS kit manually or want to enable the tag management feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure ` method. ```csharp GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => @@ -17,17 +17,19 @@ GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => ## CmsKitTagOptions -You can use the tag system to tag any kind of resources, like blog posts, products etc. Tag system provides a mechanism to group tags by entity types. For example, if you want to use tag system for blog posts and products, you need to define two entity types named BlogPosts and Product, and add tags under these entity types. +You can use the tag system to tag any kind of resources, like blog posts, products, etc. The tag system provides a mechanism to group tags by entity types. For example, if you want to use the tag system for blog posts and products, you need to define two entity types named `BlogPosts` and `Product` and add tags under these entity types. `CmsKitTagOptions` can be configured in the domain layer, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example: ```csharp Configure(options => { - //Set options here... + options.EntityTypes.Add(new TagEntityTypeDefiniton("Product")); }); ``` +> If you're using the blog feature, the ABP framework defines an entity type for the blog feature automatically. You can easily override or remove the predefined entity types in `Configure` method like shown above. + `CmsKitTagOptions` properties: - `EntityTypes`: List of defined entity types(`TagEntityTypeDefiniton`) in the tag system. @@ -120,7 +122,7 @@ See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-String ### MVC UI -Tag system provides a tag widget to display associated tags of the resource in public websites. You can simply place the widget to the like below. +The tag system provides a tag widget to display associated tags of the resource on public websites. You can simply place the widget on a page like below. ```csharp @await Component.InvokeAsync(typeof(TagViewComponent), new From 5978ae02185fa47fc01c6a7e39217be25e8daf56 Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Fri, 30 Apr 2021 12:36:02 +0300 Subject: [PATCH 016/129] document review --- docs/en/Modules/cms-kit/Comment-System.md | 2 +- docs/en/Modules/cms-kit/Rating-System.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Modules/cms-kit/Comment-System.md b/docs/en/Modules/cms-kit/Comment-System.md index 4753ebb51f..40b9d91a96 100644 --- a/docs/en/Modules/cms-kit/Comment-System.md +++ b/docs/en/Modules/cms-kit/Comment-System.md @@ -103,7 +103,7 @@ See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-String ### MVC UI -The comment system provides a commenting widget to allow users to send comments to resources on public websites. You can simply place the widget to the like below. +The comment system provides a commenting widget to allow users to send comments to resources on public websites. You can simply place the widget on a page like below. ```csharp @await Component.InvokeAsync(typeof(CommentingViewComponent), new diff --git a/docs/en/Modules/cms-kit/Rating-System.md b/docs/en/Modules/cms-kit/Rating-System.md index f5ec502010..76aaaaa249 100644 --- a/docs/en/Modules/cms-kit/Rating-System.md +++ b/docs/en/Modules/cms-kit/Rating-System.md @@ -102,7 +102,7 @@ See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-String ### MVC UI -The ratings system provides a rating widget to allow users send ratings to resources in public websites. You can simply place the widget to the like below. +The ratings system provides a rating widget to allow users send ratings to resources in public websites. You can simply place the widget on a page like below. ```csharp @await Component.InvokeAsync(typeof(RatingViewComponent), new From f36932da502f4ee441869a80b5a5362fcc16f514 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 30 Apr 2021 16:51:57 +0300 Subject: [PATCH 017/129] Docs - Add Blogs-System.md --- docs/en/Modules/cms-kit/Blog-System.md | 125 ++++++++++++++++++ .../resources/CmsKit-BlogsFeatureMenuView.png | Bin 0 -> 18277 bytes .../CmsKit-BlogsFeaturesManagement.png | Bin 0 -> 10134 bytes .../resources/CmsKit-BlogsMenuView.png | Bin 0 -> 31081 bytes 4 files changed, 125 insertions(+) create mode 100644 docs/en/Modules/cms-kit/Blog-System.md create mode 100644 docs/en/Modules/cms-kit/resources/CmsKit-BlogsFeatureMenuView.png create mode 100644 docs/en/Modules/cms-kit/resources/CmsKit-BlogsFeaturesManagement.png create mode 100644 docs/en/Modules/cms-kit/resources/CmsKit-BlogsMenuView.png diff --git a/docs/en/Modules/cms-kit/Blog-System.md b/docs/en/Modules/cms-kit/Blog-System.md new file mode 100644 index 0000000000..02c10144dd --- /dev/null +++ b/docs/en/Modules/cms-kit/Blog-System.md @@ -0,0 +1,125 @@ +# Blog System + +CMS kit provides a **Blog** system to to add Blogs & Posts to public website. This section describes the details of the Blog system. + +## Feature + +CMS kit uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all implemented features. Commercial startup templates come with all the CMS Kit related features are enabled by default, if you create the solution with the public website option. If you're installing the CMS Kit manually or want to enable the rating feature individually, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure `method. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.Blogs.Enable(); +}); +``` + +# Internals + +## Domain Layer + +#### Aggregates + +This module follows the [Entity Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Entities) guide. + +- `Blog` _(aggregate root)_: Presents blogs of application. +- `BlogPost`_(aggregate root)_: Presents Blog Posts by Blogs +- `BlogFeauture`:_(aggregate root)_: Presents blog features enabled/disabled state. Such as reactions, ratings, comments etc. + +#### Repositories + +This module follows the [Repository Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories) guide. + +Following custom repositories are defined for this feature: + +- `IBlogRepository` +- `IBlogPostRepository` +- `IBlogFeatureRepository` + +#### Domain services + +This module follows the [Domain Services Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services) guide. + +- `BlogManager`: Includes some operations for `Blog` aggreate root to keep data consistency. + - `CreateAsync`: Creates a new Blog entity and makes sure slug is used one time. + - `UpdateAsync`: Updates existing Blog entity and makes sure slug is used one time. +- `BlogPostManager`: Includes some operations for `BlogPost` aggreagate root such as creating & updating. + - `CreateAsync`: Creates a new BlogPost and makes sure slug is used only one time. + - `SetSlugUrlAsync`: Sets `UrlSlug` property of BlogPost entity and makes sure slug isn't duplicated in same blog. +- `BlogFeatureManager`: Includes some operations for managing blog features. + - `SetAsync`: Sets a feature enabled/disabled for a Blog. + - `SetDefaultsAsync`: Resets all feature configuration for a Blog. + +### Application layer + +#### Application Services + +##### Admin + +- `BlogAdminAppService` _(implements `IBlogAdminAppService`)_: Implements use cases of Blog Management. +- `BlogFeatureAdminAppService` _(implements `IBlogFeatureAdminAppService`)_: Implements use cases of Blog Feature Management. +- `BlogPostAdminAppService` _(implements `IBlogPostAdminAppService`)_: Implements use cases of Blog Post Management. + +##### Common + +- `BlogFeatureAppService` _(implements I`BlogFeatureAppService`)_: Implements feature checking operations. + +##### Public + +- `BlogPostPublicAppService` _(implements `IBlogPostPublicAppService`)_: Implements public blog post displaying operations. + +### Database providers + +#### Common + +##### Table / collection prefix & schema + +All tables/collections use the `Cms` prefix by default. Set static properties on the `CmsKitDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). + +##### Connection string + +This module uses `CmsKit` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string. + +See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details. + +#### Entity Framework Core + +##### Tables + +- CmsBlogs +- CmsBlogPosts +- CmsBlogFeatures + +#### MongoDB + +##### Collections + +- CmsBlogs +- CmsBlogPosts +- CmsBlogFeatures + +### Admin UI + +The blog system provides an admin UI to manage blogs, blogs posts & blog features by default. CMS menu will be available after a successful CMS Kit installation: + +![CmsKit Blogs](resources/CmsKit-BlogsMenuView.png) + + + +#### Managing Blogs + +You need to start with adding a blog to your website. Go **Cms -> Blogs** menu and see the blog list. You can Create/Update & Delete blogs from here. + +#### Managing Blog Features + +Features can be configured per each Blog seperately. Go **Cms -> Blogs** menu and click the **Featues** menu item in**Actions** menu. + +CMS Kit Blog Features in Action Menu + +Blog features can be configured with following modal. + +Cms Kit Features Management Modal + +#### Managing Blog Posts + +Blog Posts can be managed from **Cms -> Blog Posts** menu. All blog posts will be listed in Public website at `blogs/{blog}`. + diff --git a/docs/en/Modules/cms-kit/resources/CmsKit-BlogsFeatureMenuView.png b/docs/en/Modules/cms-kit/resources/CmsKit-BlogsFeatureMenuView.png new file mode 100644 index 0000000000000000000000000000000000000000..e11006572411bbf6a854d1fe54a34208a6c8fee7 GIT binary patch literal 18277 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 literal 0 HcmV?d00001 diff --git a/docs/en/Modules/cms-kit/resources/CmsKit-BlogsFeaturesManagement.png b/docs/en/Modules/cms-kit/resources/CmsKit-BlogsFeaturesManagement.png new file mode 100644 index 0000000000000000000000000000000000000000..67fc60335d2aa0ba3be5b2c847b3304b563a9663 GIT binary patch literal 10134 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 DETOJWMw4O-n@YYzj*^AjR+5Y0^+N- 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 Suc*K^?Qdu|oqzw&5B^_lI8kN* literal 0 HcmV?d00001 From 6f459da427434f186673e115dd6a4db1b118f29e Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 03:02:36 +0300 Subject: [PATCH 018/129] init account module --- modules/account/Volo.Abp.Account.abpmdl.json | 75 +++++++------------ ....Account.Application.Contracts.abppkg.json | 3 + .../Volo.Abp.Account.Application.abppkg.json | 3 + .../Volo.Abp.Account.Blazor.abppkg.json | 3 + ...olo.Abp.Account.HttpApi.Client.abppkg.json | 3 + .../Volo.Abp.Account.HttpApi.abppkg.json | 3 + ...Abp.Account.Web.IdentityServer.abppkg.json | 1 + .../Volo.Abp.Account.Web.abppkg.json | 3 + ....Abp.Account.Application.Tests.abppkg.json | 3 + 9 files changed, 48 insertions(+), 49 deletions(-) create mode 100644 modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.json create mode 100644 modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.json create mode 100644 modules/account/src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.abppkg.json create mode 100644 modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.json create mode 100644 modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.json create mode 100644 modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.abppkg.json create mode 100644 modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.json create mode 100644 modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.abppkg.json diff --git a/modules/account/Volo.Abp.Account.abpmdl.json b/modules/account/Volo.Abp.Account.abpmdl.json index c6135f99c5..28927ae184 100644 --- a/modules/account/Volo.Abp.Account.abpmdl.json +++ b/modules/account/Volo.Abp.Account.abpmdl.json @@ -1,65 +1,42 @@ { "folders": { - "src": {}, - "test": {} - }, - "imports": { - "Volo.Abp.Identity": { - "path": "../identity/Volo.Abp.Identity.abpmdl.json" - }, - "Volo.Abp.PermissionManagement": { - "path": "../permission-management/Volo.Abp.PermissionManagement.abpmdl.json" + "items": { + "src": {}, + "test": {} } }, "packages": { - "Volo.Abp.Account.Application.Contracts": { - "path": "src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj", - "folder": "src", - "includes": { - "lib.application.contracts": {} - } + "Volo.Abp.Account.Web": { + "path": "src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Account.Web.IdentityServer": { + "path": "src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.abppkg.json", + "folder": "src" }, "Volo.Abp.Account.Application": { - "path": "src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj", - "folder": "src", - "includes": { - "lib.application": {} - } + "path": "src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Account.Application.Contracts": { + "path": "src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.json", + "folder": "src" }, "Volo.Abp.Account.HttpApi": { - "path": "src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.csproj", - "folder": "src", - "includes": { - "lib.http-api": {} - } + "path": "src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.json", + "folder": "src" }, "Volo.Abp.Account.HttpApi.Client": { - "path": "src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.csproj", - "folder": "src", - "includes": { - "lib.http-api-client": {} - } - }, - "Volo.Abp.Account.Web": { - "path": "src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj", - "folder": "src", - "includes": { - "lib.ui.mvc": {} - } - }, - "Volo.Abp.Account.Web.IdentityServer": { - "path": "src/Volo.Abp.Account.IdentityServer/Volo.Abp.Account.IdentityServer.csproj", - "folder": "src", - "includes": { - "lib.ui.mvc": {} - } + "path": "src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.json", + "folder": "src" }, "Volo.Abp.Account.Application.Tests": { - "path": "test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.Account.Blazor": { + "path": "src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.abppkg.json", + "folder": "src" } } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.json new file mode 100644 index 0000000000..49032794e2 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.application-contracts" +} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.json b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.json new file mode 100644 index 0000000000..412567ac33 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.application" +} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.abppkg.json b/modules/account/src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.abppkg.json new file mode 100644 index 0000000000..19c29b7b8b --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor" +} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.json b/modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.json new file mode 100644 index 0000000000..7deef5e383 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api-client" +} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.json b/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.json new file mode 100644 index 0000000000..515bfe64c4 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api" +} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.abppkg.json b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.json b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.json new file mode 100644 index 0000000000..930c4018b3 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mvc" +} \ No newline at end of file diff --git a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.abppkg.json b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file From 4d61880a5c50f198ed218de7d886835e310f1dee Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 03:03:42 +0300 Subject: [PATCH 019/129] init audit logging module --- .../Volo.Abp.AuditLogging.abpmdl.json | 66 +++++++------------ ...Abp.AuditLogging.Domain.Shared.abppkg.json | 3 + .../Volo.Abp.AuditLogging.Domain.abppkg.json | 3 + ...ditLogging.EntityFrameworkCore.abppkg.json | 3 + .../Volo.Abp.AuditLogging.MongoDB.abppkg.json | 3 + ...ging.EntityFrameworkCore.Tests.abppkg.json | 3 + ...Abp.AuditLogging.MongoDB.Tests.abppkg.json | 3 + ...Volo.Abp.AuditLogging.TestBase.abppkg.json | 1 + .../Volo.Abp.AuditLogging.Tests.abppkg.json | 3 + 9 files changed, 44 insertions(+), 44 deletions(-) create mode 100644 modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.json create mode 100644 modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.abppkg.json create mode 100644 modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.abppkg.json create mode 100644 modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo.Abp.AuditLogging.MongoDB.abppkg.json create mode 100644 modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.abppkg.json create mode 100644 modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.abppkg.json create mode 100644 modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.abppkg.json create mode 100644 modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.abppkg.json diff --git a/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json b/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json index a21497b1cb..5b2cc3f54b 100644 --- a/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json +++ b/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json @@ -1,64 +1,42 @@ { "folders": { - "src": {}, - "test": {} + "items": { + "src": {}, + "test": {} + } }, "packages": { "Volo.Abp.AuditLogging.Domain.Shared": { - "path": "src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj", - "folder": "src", - "includes": { - "lib.domain.shared": {} - } + "path": "src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.json", + "folder": "src" }, "Volo.Abp.AuditLogging.Domain": { - "path": "src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.csproj", - "folder": "src", - "includes": { - "lib.domain": {} - } + "path": "src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.abppkg.json", + "folder": "src" }, "Volo.Abp.AuditLogging.EntityFrameworkCore": { - "path": "src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.csproj", - "folder": "src", - "includes": { - "lib.ef": {} - } + "path": "src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.abppkg.json", + "folder": "src" }, "Volo.Abp.AuditLogging.MongoDB": { - "path": "src/Volo.Abp.AuditLogging.MongoDB/Volo.Abp.AuditLogging.MongoDB.csproj", - "folder": "src", - "includes": { - "lib.mongodb": {} - } - }, - "Volo.Abp.AuditLogging.TestBase": { - "path": "test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "src/Volo.Abp.AuditLogging.MongoDB/Volo.Abp.AuditLogging.MongoDB.abppkg.json", + "folder": "src" }, "Volo.Abp.AuditLogging.Tests": { - "path": "test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.AuditLogging.TestBase": { + "path": "test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.abppkg.json", + "folder": "test" }, "Volo.Abp.AuditLogging.EntityFrameworkCore.Tests": { - "path": "test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.AuditLogging.MongoDB.Tests": { - "path": "test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.abppkg.json", + "folder": "test" } } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.json new file mode 100644 index 0000000000..8b3de05f76 --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.abppkg.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.abppkg.json new file mode 100644 index 0000000000..1d574efe45 --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo.Abp.AuditLogging.Domain.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.abppkg.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.abppkg.json new file mode 100644 index 0000000000..e1c64f0175 --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo.Abp.AuditLogging.EntityFrameworkCore.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo.Abp.AuditLogging.MongoDB.abppkg.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo.Abp.AuditLogging.MongoDB.abppkg.json new file mode 100644 index 0000000000..8b23fd1e69 --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo.Abp.AuditLogging.MongoDB.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mongodb" +} \ No newline at end of file diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.abppkg.json b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.abppkg.json b/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.abppkg.json b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.abppkg.json b/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file From 0bdebe8a748fabe5190c63d9bfcbccfb183764c8 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 03:04:32 +0300 Subject: [PATCH 020/129] init background jobs module --- .../Volo.Abp.BackgroundJobs.abpmdl.json | 83 +++++++++---------- ...ackgroundJobs.DemoApp.HangFire.abppkg.json | 1 + ....BackgroundJobs.DemoApp.Quartz.abppkg.json | 1 + ...ackgroundJobs.DemoApp.RabbitMq.abppkg.json | 1 + ....BackgroundJobs.DemoApp.Shared.abppkg.json | 1 + ...olo.Abp.BackgroundJobs.DemoApp.abppkg.json | 1 + ...p.BackgroundJobs.Domain.Shared.abppkg.json | 3 + ...Volo.Abp.BackgroundJobs.Domain.abppkg.json | 3 + ...groundJobs.EntityFrameworkCore.abppkg.json | 3 + ...olo.Abp.BackgroundJobs.MongoDB.abppkg.json | 3 + ...bp.BackgroundJobs.Domain.Tests.abppkg.json | 3 + ...Jobs.EntityFrameworkCore.Tests.abppkg.json | 3 + ...p.BackgroundJobs.MongoDB.Tests.abppkg.json | 3 + ...lo.Abp.BackgroundJobs.TestBase.abppkg.json | 1 + 14 files changed, 68 insertions(+), 42 deletions(-) create mode 100644 modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.abppkg.json create mode 100644 modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json create mode 100644 modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.abppkg.json create mode 100644 modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.abppkg.json create mode 100644 modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.abppkg.json create mode 100644 modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.json create mode 100644 modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.json create mode 100644 modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.json create mode 100644 modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.json create mode 100644 modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.abppkg.json create mode 100644 modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.abppkg.json create mode 100644 modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.abppkg.json create mode 100644 modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.abppkg.json diff --git a/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json b/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json index da2cab8b84..e3bea65da3 100644 --- a/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json +++ b/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json @@ -1,64 +1,63 @@ { "folders": { - "src": {}, - "test": {} + "items": { + "src": {}, + "test": {}, + "app": {} + } }, "packages": { "Volo.Abp.BackgroundJobs.Domain.Shared": { - "path": "src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.csproj", - "folder": "src", - "includes": { - "lib.domain.shared": {} - } + "path": "src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.json", + "folder": "src" }, "Volo.Abp.BackgroundJobs.Domain": { - "path": "src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.csproj", - "folder": "src", - "includes": { - "lib.domain": {} - } + "path": "src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.json", + "folder": "src" }, "Volo.Abp.BackgroundJobs.EntityFrameworkCore": { - "path": "src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.csproj", - "folder": "src", - "includes": { - "lib.ef": {} - } + "path": "src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.json", + "folder": "src" }, "Volo.Abp.BackgroundJobs.MongoDB": { - "path": "src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.csproj", - "folder": "src", - "includes": { - "lib.mongodb": {} - } + "path": "src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.json", + "folder": "src" }, "Volo.Abp.BackgroundJobs.TestBase": { - "path": "test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.abppkg.json", + "folder": "test" }, "Volo.Abp.BackgroundJobs.Domain.Tests": { - "path": "test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests": { - "path": "test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.BackgroundJobs.MongoDB.Tests": { - "path": "test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.BackgroundJobs.DemoApp": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.abppkg.json", + "folder": "app" + }, + "Volo.Abp.BackgroundJobs.DemoApp.Shared": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.abppkg.json", + "folder": "app" + }, + "Volo.Abp.BackgroundJobs.DemoApp.HangFire": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.abppkg.json", + "folder": "app" + }, + "Volo.Abp.BackgroundJobs.DemoApp.RabbitMq": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.abppkg.json", + "folder": "app" + }, + "Volo.Abp.BackgroundJobs.DemoApp.Quartz": { + "path": "app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json", + "folder": "app" } } } \ No newline at end of file diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.abppkg.json b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.abppkg.json b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.abppkg.json b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.abppkg.json b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.json b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.json new file mode 100644 index 0000000000..8b3de05f76 --- /dev/null +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.json b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.json new file mode 100644 index 0000000000..1d574efe45 --- /dev/null +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.json b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.json new file mode 100644 index 0000000000..e1c64f0175 --- /dev/null +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.json b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.json new file mode 100644 index 0000000000..8b23fd1e69 --- /dev/null +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mongodb" +} \ No newline at end of file diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.abppkg.json b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.abppkg.json b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.abppkg.json b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.abppkg.json b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file From e31a29148554904485a79df207a63712050b1fae Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 03:06:36 +0300 Subject: [PATCH 021/129] init identity module --- .../identity/Volo.Abp.Identity.abpmdl.json | 168 ++++++------------ ...Identity.Application.Contracts.abppkg.json | 3 + .../Volo.Abp.Identity.Application.abppkg.json | 3 + .../Volo.Abp.Identity.AspNetCore.abppkg.json | 1 + ...olo.Abp.Identity.Blazor.Server.abppkg.json | 3 + ...bp.Identity.Blazor.WebAssembly.abppkg.json | 3 + .../Volo.Abp.Identity.Blazor.abppkg.json | 3 + ...olo.Abp.Identity.Domain.Shared.abppkg.json | 3 + .../Volo.Abp.Identity.Domain.abppkg.json | 3 + ...p.Identity.EntityFrameworkCore.abppkg.json | 3 + ...lo.Abp.Identity.HttpApi.Client.abppkg.json | 3 + .../Volo.Abp.Identity.HttpApi.abppkg.json | 3 + .../Volo.Abp.Identity.MongoDB.abppkg.json | 3 + .../Volo.Abp.Identity.Web.abppkg.json | 3 + ...sionManagement.Domain.Identity.abppkg.json | 1 + ...Abp.Identity.Application.Tests.abppkg.json | 3 + ....Abp.Identity.AspNetCore.Tests.abppkg.json | 3 + ...Volo.Abp.Identity.Domain.Tests.abppkg.json | 3 + ...tity.EntityFrameworkCore.Tests.abppkg.json | 3 + ...olo.Abp.Identity.MongoDB.Tests.abppkg.json | 3 + .../Volo.Abp.Identity.TestBase.abppkg.json | 1 + 21 files changed, 108 insertions(+), 114 deletions(-) create mode 100644 modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo.Abp.Identity.Application.Contracts.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.HttpApi.Client/Volo.Abp.Identity.HttpApi.Client.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.abppkg.json create mode 100644 modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.abppkg.json create mode 100644 modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.abppkg.json create mode 100644 modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.abppkg.json create mode 100644 modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.abppkg.json create mode 100644 modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.abppkg.json create mode 100644 modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.abppkg.json create mode 100644 modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.abppkg.json diff --git a/modules/identity/Volo.Abp.Identity.abpmdl.json b/modules/identity/Volo.Abp.Identity.abpmdl.json index 91c285965d..f58988ab30 100644 --- a/modules/identity/Volo.Abp.Identity.abpmdl.json +++ b/modules/identity/Volo.Abp.Identity.abpmdl.json @@ -1,150 +1,90 @@ { "folders": { - "src": {}, - "test": {} - }, - "imports": { - "Volo.Abp.Users": { - "path": "../users/Volo.Abp.Users.abpmdl.json" - }, - "Volo.Abp.PermissionManagement": { - "path": "../permission-management/Volo.Abp.PermissionManagement.abpmdl.json" + "items": { + "src": {}, + "test": {} } }, "packages": { "Volo.Abp.Identity.Domain.Shared": { - "path": "src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj", - "folder": "src", - "includes": { - "lib.domain.shared": {} - } + "path": "src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.abppkg.json", + "folder": "src" }, "Volo.Abp.Identity.Domain": { - "path": "src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj", - "folder": "src", - "includes": { - "lib.domain": {} - } + "path": "src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.json", + "folder": "src" }, "Volo.Abp.Identity.Application.Contracts": { - "path": "src/Volo.Abp.Identity.Application.Contracts/Volo.Abp.Identity.Application.Contracts.csproj", - "folder": "src", - "includes": { - "lib.application.contracts": {} - } + "path": "src/Volo.Abp.Identity.Application.Contracts/Volo.Abp.Identity.Application.Contracts.abppkg.json", + "folder": "src" }, "Volo.Abp.Identity.Application": { - "path": "src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj", - "folder": "src", - "includes": { - "lib.application": {} - } + "path": "src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.abppkg.json", + "folder": "src" }, "Volo.Abp.Identity.EntityFrameworkCore": { - "path": "src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.csproj", - "folder": "src", - "includes": { - "lib.ef": {} - } - }, - "Volo.Abp.Identity.MongoDB": { - "path": "src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.csproj", - "folder": "src", - "includes": { - "lib.mongodb": {} - } - }, - "Volo.Abp.Identity.AspNetCore": { - "path": "src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.csproj", + "path": "src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.abppkg.json", "folder": "src" }, "Volo.Abp.Identity.HttpApi": { - "path": "src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.csproj", - "folder": "src", - "includes": { - "lib.http-api": {} - } + "path": "src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.abppkg.json", + "folder": "src" }, "Volo.Abp.Identity.HttpApi.Client": { - "path": "src/Volo.Abp.Identity.HttpApi.Client/Volo.Abp.Identity.HttpApi.Client.csproj", - "folder": "src", - "includes": { - "lib.http-api-client": {} - } + "path": "src/Volo.Abp.Identity.HttpApi.Client/Volo.Abp.Identity.HttpApi.Client.abppkg.json", + "folder": "src" }, "Volo.Abp.Identity.Web": { - "path": "src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj", - "folder": "src", - "includes": { - "lib.ui.mvc": {} - } + "path": "src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.abppkg.json", + "folder": "src" }, - "Volo.Abp.Identity.Blazor": { - "path": "src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor": {} - } + "Volo.Abp.Identity.Application.Tests": { + "path": "test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.abppkg.json", + "folder": "test" }, - "Volo.Abp.Identity.Blazor.Server": { - "path": "src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor-server": {} - } + "Volo.Abp.Identity.MongoDB": { + "path": "src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.abppkg.json", + "folder": "src" }, - "Volo.Abp.Identity.Blazor.WebAssembly": { - "path": "src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor-wasm": {} - } + "Volo.Abp.Identity.MongoDB.Tests": { + "path": "test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.abppkg.json", + "folder": "test" }, - "Volo.Abp.PermissionManagement.Domain.Identity": { - "path": "src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj", - "folder": "src" + "Volo.Abp.Identity.EntityFrameworkCore.Tests": { + "path": "test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.Identity.TestBase": { - "path": "test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.abppkg.json", + "folder": "test" }, "Volo.Abp.Identity.Domain.Tests": { - "path": "test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } - }, - "Volo.Abp.Identity.EntityFrameworkCore.Tests": { - "path": "test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.abppkg.json", + "folder": "test" }, - "Volo.Abp.Identity.MongoDB.Tests": { - "path": "test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.Identity.AspNetCore": { + "path": "src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.abppkg.json", + "folder": "src" }, - "Volo.Abp.Identity.Application.Tests": { - "path": "test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.PermissionManagement.Domain.Identity": { + "path": "src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.abppkg.json", + "folder": "src" }, "Volo.Abp.Identity.AspNetCore.Tests": { - "path": "test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.Identity.Blazor": { + "path": "src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Identity.Blazor.Server": { + "path": "src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Identity.Blazor.WebAssembly": { + "path": "src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.abppkg.json", + "folder": "src" } } } \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo.Abp.Identity.Application.Contracts.abppkg.json b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo.Abp.Identity.Application.Contracts.abppkg.json new file mode 100644 index 0000000000..49032794e2 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo.Abp.Identity.Application.Contracts.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.application-contracts" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.abppkg.json b/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.abppkg.json new file mode 100644 index 0000000000..412567ac33 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.application" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.abppkg.json b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo.Abp.Identity.AspNetCore.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.abppkg.json b/modules/identity/src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.abppkg.json new file mode 100644 index 0000000000..ef40d81585 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Blazor.Server/Volo.Abp.Identity.Blazor.Server.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor-server" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.abppkg.json b/modules/identity/src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.abppkg.json new file mode 100644 index 0000000000..471ef5e067 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Blazor.WebAssembly/Volo.Abp.Identity.Blazor.WebAssembly.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor-wasm" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.abppkg.json b/modules/identity/src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.abppkg.json new file mode 100644 index 0000000000..19c29b7b8b --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Volo.Abp.Identity.Blazor.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.abppkg.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.abppkg.json new file mode 100644 index 0000000000..8b3de05f76 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.json b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.json new file mode 100644 index 0000000000..1d574efe45 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.abppkg.json b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.abppkg.json new file mode 100644 index 0000000000..e1c64f0175 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo.Abp.Identity.EntityFrameworkCore.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.HttpApi.Client/Volo.Abp.Identity.HttpApi.Client.abppkg.json b/modules/identity/src/Volo.Abp.Identity.HttpApi.Client/Volo.Abp.Identity.HttpApi.Client.abppkg.json new file mode 100644 index 0000000000..7deef5e383 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.HttpApi.Client/Volo.Abp.Identity.HttpApi.Client.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api-client" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.abppkg.json b/modules/identity/src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.abppkg.json new file mode 100644 index 0000000000..515bfe64c4 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.HttpApi/Volo.Abp.Identity.HttpApi.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.abppkg.json b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.abppkg.json new file mode 100644 index 0000000000..8b23fd1e69 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mongodb" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.abppkg.json b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.abppkg.json new file mode 100644 index 0000000000..930c4018b3 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mvc" +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.abppkg.json b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.abppkg.json b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.abppkg.json b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.abppkg.json b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.abppkg.json b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.abppkg.json b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.abppkg.json b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file From dc82dbd373bd8d8bb07c2eafe6381710ebe59c4e Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 03:07:14 +0300 Subject: [PATCH 022/129] init identity-server module --- .../Volo.Abp.IdentityServer.abpmdl.json | 84 ++++++------------- ...p.IdentityServer.Domain.Shared.abppkg.json | 3 + ...Volo.Abp.IdentityServer.Domain.abppkg.json | 3 + ...tityServer.EntityFrameworkCore.abppkg.json | 3 + ...olo.Abp.IdentityServer.MongoDB.abppkg.json | 3 + ...nagement.Domain.IdentityServer.abppkg.json | 1 + ...bp.IdentityServer.Domain.Tests.abppkg.json | 3 + ...rver.EntityFrameworkCore.Tests.abppkg.json | 3 + ...p.IdentityServer.MongoDB.Tests.abppkg.json | 3 + ...lo.Abp.IdentityServer.TestBase.abppkg.json | 1 + 10 files changed, 50 insertions(+), 57 deletions(-) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.abppkg.json create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.abppkg.json create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.abppkg.json create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.abppkg.json create mode 100644 modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo.Abp.PermissionManagement.Domain.IdentityServer.abppkg.json create mode 100644 modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.abppkg.json create mode 100644 modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.abppkg.json create mode 100644 modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.abppkg.json create mode 100644 modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.abppkg.json diff --git a/modules/identityserver/Volo.Abp.IdentityServer.abpmdl.json b/modules/identityserver/Volo.Abp.IdentityServer.abpmdl.json index b56f99933a..01fe37ad9f 100644 --- a/modules/identityserver/Volo.Abp.IdentityServer.abpmdl.json +++ b/modules/identityserver/Volo.Abp.IdentityServer.abpmdl.json @@ -1,76 +1,46 @@ { "folders": { - "src": {}, - "test": {} - }, - "imports": { - "Volo.Abp.Identity": { - "path": "../identity/Volo.Abp.Identity.abpmdl.json" - }, - "Volo.Abp.PermissionManagement": { - "path": "../permission-management/Volo.Abp.PermissionManagement.abpmdl.json" + "items": { + "src": {}, + "test": {} } }, "packages": { - "Volo.Abp.IdentityServer.Domain.Shared": { - "path": "src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj", - "folder": "src", - "includes": { - "lib.domain.shared": {} - } - }, "Volo.Abp.IdentityServer.Domain": { - "path": "src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj", - "folder": "src", - "includes": { - "lib.domain": {} - } + "path": "src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.abppkg.json", + "folder": "src" + }, + "Volo.Abp.IdentityServer.Domain.Shared": { + "path": "src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.abppkg.json", + "folder": "src" }, "Volo.Abp.IdentityServer.EntityFrameworkCore": { - "path": "src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.csproj", - "folder": "src", - "includes": { - "lib.ef": {} - } + "path": "src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.abppkg.json", + "folder": "src" }, - "Volo.Abp.IdentityServer.MongoDB": { - "path": "src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.csproj", - "folder": "src", - "includes": { - "lib.mongodb": {} - } + "Volo.Abp.IdentityServer.EntityFrameworkCore.Tests": { + "path": "test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.abppkg.json", + "folder": "test" }, - "Volo.Abp.PermissionManagement.Domain.IdentityServer": { - "path": "src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo.Abp.PermissionManagement.Domain.IdentityServer.csproj", + "Volo.Abp.IdentityServer.MongoDB": { + "path": "src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.abppkg.json", "folder": "src" }, "Volo.Abp.IdentityServer.TestBase": { - "path": "test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.abppkg.json", + "folder": "test" }, - "Volo.Abp.IdentityServer.Domain.Tests": { - "path": "test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.IdentityServer.MongoDB.Tests": { + "path": "test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.abppkg.json", + "folder": "test" }, - "Volo.Abp.IdentityServer.EntityFrameworkCore.Tests": { - "path": "test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.IdentityServer.Domain.Tests": { + "path": "test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.abppkg.json", + "folder": "test" }, - "Volo.Abp.IdentityServer.MongoDB.Tests": { - "path": "test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.PermissionManagement.Domain.IdentityServer": { + "path": "src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo.Abp.PermissionManagement.Domain.IdentityServer.abppkg.json", + "folder": "src" } } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.abppkg.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.abppkg.json new file mode 100644 index 0000000000..8b3de05f76 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.abppkg.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.abppkg.json new file mode 100644 index 0000000000..1d574efe45 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.abppkg.json b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.abppkg.json new file mode 100644 index 0000000000..e1c64f0175 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo.Abp.IdentityServer.EntityFrameworkCore.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.abppkg.json b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.abppkg.json new file mode 100644 index 0000000000..8b23fd1e69 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo.Abp.IdentityServer.MongoDB.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mongodb" +} \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo.Abp.PermissionManagement.Domain.IdentityServer.abppkg.json b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo.Abp.PermissionManagement.Domain.IdentityServer.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo.Abp.PermissionManagement.Domain.IdentityServer.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.abppkg.json b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.abppkg.json b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.abppkg.json b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.abppkg.json b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file From 23ab8417cbcf9247db40d9f296ab5694c0827710 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 03:08:00 +0300 Subject: [PATCH 023/129] init permission management module --- .../Volo.Abp.PermissionManagement.abpmdl.json | 147 ++++++------------ ...nagement.Application.Contracts.abppkg.json | 3 + ...rmissionManagement.Application.abppkg.json | 3 + ...issionManagement.Blazor.Server.abppkg.json | 3 + ...nManagement.Blazor.WebAssembly.abppkg.json | 3 + ...bp.PermissionManagement.Blazor.abppkg.json | 3 + ...issionManagement.Domain.Shared.abppkg.json | 3 + ...bp.PermissionManagement.Domain.abppkg.json | 3 + ...Management.EntityFrameworkCore.abppkg.json | 3 + ...ssionManagement.HttpApi.Client.abppkg.json | 3 + ...p.PermissionManagement.HttpApi.abppkg.json | 3 + ...p.PermissionManagement.MongoDB.abppkg.json | 3 + ...o.Abp.PermissionManagement.Web.abppkg.json | 3 + ...onManagement.Application.Tests.abppkg.json | 3 + ...missionManagement.Domain.Tests.abppkg.json | 3 + ...ment.EntityFrameworkCore.Tests.abppkg.json | 3 + ...issionManagement.MongoDB.Tests.abppkg.json | 3 + ....PermissionManagement.TestBase.abppkg.json | 1 + 18 files changed, 98 insertions(+), 98 deletions(-) create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.json create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.json create mode 100644 modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.abppkg.json create mode 100644 modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.abppkg.json create mode 100644 modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.abppkg.json create mode 100644 modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.abppkg.json create mode 100644 modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.abppkg.json diff --git a/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json b/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json index b0c0b4ebb7..82dc87dade 100644 --- a/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json +++ b/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json @@ -1,127 +1,78 @@ { "folders": { - "src": {}, - "test": {} + "items": { + "src": {}, + "test": {} + } }, "packages": { "Volo.Abp.PermissionManagement.Domain.Shared": { - "path": "src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj", - "folder": "src", - "includes": { - "lib.domain.shared": {} - } + "path": "src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.json", + "folder": "src" }, "Volo.Abp.PermissionManagement.Domain": { - "path": "src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.csproj", - "folder": "src", - "includes": { - "lib.domain": {} - } + "path": "src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.json", + "folder": "src" }, "Volo.Abp.PermissionManagement.Application.Contracts": { - "path": "src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.csproj", - "folder": "src", - "includes": { - "lib.application.contracts": {} - } + "path": "src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.json", + "folder": "src" }, "Volo.Abp.PermissionManagement.Application": { - "path": "src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj", - "folder": "src", - "includes": { - "lib.application": {} - } + "path": "src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.json", + "folder": "src" }, "Volo.Abp.PermissionManagement.EntityFrameworkCore": { - "path": "src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj", - "folder": "src", - "includes": { - "lib.ef": {} - } + "path": "src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.json", + "folder": "src" + }, + "Volo.Abp.PermissionManagement.Web": { + "path": "src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.json", + "folder": "src" + }, + "Volo.Abp.PermissionManagement.Domain.Tests": { + "path": "test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.PermissionManagement.TestBase": { + "path": "test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.abppkg.json", + "folder": "test" + }, + "Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests": { + "path": "test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.PermissionManagement.MongoDB": { - "path": "src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.csproj", - "folder": "src", - "includes": { - "lib.mongodb": {} - } + "path": "src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.json", + "folder": "src" + }, + "Volo.Abp.PermissionManagement.MongoDB.Tests": { + "path": "test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.PermissionManagement.HttpApi": { - "path": "src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.csproj", - "folder": "src", - "includes": { - "lib.http-api": {} - } + "path": "src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.json", + "folder": "src" }, "Volo.Abp.PermissionManagement.HttpApi.Client": { - "path": "src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.csproj", - "folder": "src", - "includes": { - "lib.http-api-client": {} - } + "path": "src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.json", + "folder": "src" }, - "Volo.Abp.PermissionManagement.Web": { - "path": "src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj", - "folder": "src", - "includes": { - "lib.ui.mvc": {} - } + "Volo.Abp.PermissionManagement.Application.Tests": { + "path": "test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.PermissionManagement.Blazor": { - "path": "src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor": {} - } + "path": "src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.abppkg.json", + "folder": "src" }, "Volo.Abp.PermissionManagement.Blazor.Server": { - "path": "src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor-server": {} - } + "path": "src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.abppkg.json", + "folder": "src" }, "Volo.Abp.PermissionManagement.Blazor.WebAssembly": { - "path": "src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor-wasm": {} - } - }, - "Volo.Abp.PermissionManagement.TestBase": { - "path": "test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } - }, - "Volo.Abp.PermissionManagement.Domain.Tests": { - "path": "test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } - }, - "Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests": { - "path": "test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } - }, - "Volo.Abp.PermissionManagement.MongoDB.Tests": { - "path": "test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } - }, - "Volo.Abp.PermissionManagement.Application.Tests": { - "path": "test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.abppkg.json", + "folder": "src" } } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.json new file mode 100644 index 0000000000..49032794e2 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.application-contracts" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.json new file mode 100644 index 0000000000..412567ac33 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.application" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.abppkg.json new file mode 100644 index 0000000000..ef40d81585 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.Server/Volo.Abp.PermissionManagement.Blazor.Server.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor-server" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.abppkg.json new file mode 100644 index 0000000000..471ef5e067 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor-wasm" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.abppkg.json new file mode 100644 index 0000000000..19c29b7b8b --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Volo.Abp.PermissionManagement.Blazor.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.json new file mode 100644 index 0000000000..8b3de05f76 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.json new file mode 100644 index 0000000000..1d574efe45 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.json new file mode 100644 index 0000000000..e1c64f0175 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.json new file mode 100644 index 0000000000..7deef5e383 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api-client" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.json new file mode 100644 index 0000000000..515bfe64c4 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.json new file mode 100644 index 0000000000..8b23fd1e69 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mongodb" +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.json new file mode 100644 index 0000000000..930c4018b3 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mvc" +} \ No newline at end of file diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.abppkg.json b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.abppkg.json b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.abppkg.json b/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.abppkg.json b/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.abppkg.json b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file From 804c88ee25b1ff3ac435d9a7747b625012bee885 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 03:08:30 +0300 Subject: [PATCH 024/129] init setting management module --- .../Volo.Abp.SettingManagement.abpmdl.json | 147 +++++++----------- ....Abp.SettingManagement.DemoApp.abppkg.json | 1 + ...nagement.Application.Contracts.abppkg.json | 3 + ....SettingManagement.Application.abppkg.json | 3 + ...ettingManagement.Blazor.Server.abppkg.json | 3 + ...gManagement.Blazor.WebAssembly.abppkg.json | 3 + ...o.Abp.SettingManagement.Blazor.abppkg.json | 3 + ...ettingManagement.Domain.Shared.abppkg.json | 3 + ...o.Abp.SettingManagement.Domain.abppkg.json | 3 + ...Management.EntityFrameworkCore.abppkg.json | 3 + ...ttingManagement.HttpApi.Client.abppkg.json | 3 + ....Abp.SettingManagement.HttpApi.abppkg.json | 3 + ....Abp.SettingManagement.MongoDB.abppkg.json | 3 + ...Volo.Abp.SettingManagement.Web.abppkg.json | 3 + ...ment.EntityFrameworkCore.Tests.abppkg.json | 3 + ...ettingManagement.MongoDB.Tests.abppkg.json | 3 + ...Abp.SettingManagement.TestBase.abppkg.json | 1 + ...lo.Abp.SettingManagement.Tests.abppkg.json | 3 + 18 files changed, 100 insertions(+), 94 deletions(-) create mode 100644 modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo.Abp.SettingManagement.Application.Contracts.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.json create mode 100644 modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.abppkg.json create mode 100644 modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.abppkg.json create mode 100644 modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.abppkg.json create mode 100644 modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.abppkg.json diff --git a/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json b/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json index 8181f78b91..899d1a00ed 100644 --- a/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json +++ b/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json @@ -1,120 +1,79 @@ { "folders": { - "src": {}, - "test": {} + "items": { + "src": {}, + "test": {}, + "app": {} + } }, "packages": { "Volo.Abp.SettingManagement.Domain.Shared": { - "path": "src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj", - "folder": "src", - "includes": { - "lib.domain.shared": {} - } + "path": "src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.json", + "folder": "src" }, "Volo.Abp.SettingManagement.Domain": { - "path": "src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.csproj", - "folder": "src", - "includes": { - "lib.domain": {} - } - }, - "Volo.Abp.SettingManagement.Application.Contracts": { - "path": "src/Volo.Abp.SettingManagement.Application.Contracts/Volo.Abp.SettingManagement.Application.Contracts.csproj", - "folder": "src", - "includes": { - "lib.application.contracts": {} - } - }, - "Volo.Abp.SettingManagement.Application": { - "path": "src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj", - "folder": "src", - "includes": { - "lib.application": {} - } + "path": "src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.json", + "folder": "src" }, "Volo.Abp.SettingManagement.EntityFrameworkCore": { - "path": "src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.csproj", - "folder": "src", - "includes": { - "lib.ef": {} - } + "path": "src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.Tests": { + "path": "test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.SettingManagement.MongoDB": { - "path": "src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.csproj", - "folder": "src", - "includes": { - "lib.mongodb": {} - } + "path": "src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.json", + "folder": "src" }, - "Volo.Abp.SettingManagement.HttpApi": { - "path": "src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.csproj", - "folder": "src", - "includes": { - "lib.http-api": {} - } + "Volo.Abp.SettingManagement.TestBase": { + "path": "test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.abppkg.json", + "folder": "test" }, - "Volo.Abp.SettingManagement.HttpApi.Client": { - "path": "src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.csproj", - "folder": "src", - "includes": { - "lib.http-api-client": {} - } + "Volo.Abp.SettingManagement.EntityFrameworkCore.Tests": { + "path": "test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.SettingManagement.MongoDB.Tests": { + "path": "test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.SettingManagement.Web": { - "path": "src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj", - "folder": "src", - "includes": { - "lib.ui.mvc": {} - } + "path": "src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.json", + "folder": "src" }, "Volo.Abp.SettingManagement.Blazor": { - "path": "src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor": {} - } + "path": "src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.abppkg.json", + "folder": "src" }, - "Volo.Abp.SettingManagement.Blazor.Server": { - "path": "src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor-server": {} - } + "Volo.Abp.SettingManagement.Application": { + "path": "src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.json", + "folder": "src" }, - "Volo.Abp.SettingManagement.Blazor.WebAssembly": { - "path": "src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.csproj", - "folder": "src", - "includes": { - "lib.ui.blazor-wasm": {} - } + "Volo.Abp.SettingManagement.Application.Contracts": { + "path": "src/Volo.Abp.SettingManagement.Application.Contracts/Volo.Abp.SettingManagement.Application.Contracts.abppkg.json", + "folder": "src" }, - "Volo.Abp.SettingManagement.TestBase": { - "path": "test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.SettingManagement.HttpApi": { + "path": "src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.json", + "folder": "src" }, - "Volo.Abp.SettingManagement.Tests": { - "path": "test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.SettingManagement.HttpApi.Client": { + "path": "src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.json", + "folder": "src" }, - "Volo.Abp.SettingManagement.EntityFrameworkCore.Tests": { - "path": "test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.SettingManagement.DemoApp": { + "path": "app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.abppkg.json", + "folder": "app" }, - "Volo.Abp.SettingManagement.MongoDB.Tests": { - "path": "test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "Volo.Abp.SettingManagement.Blazor.Server": { + "path": "src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.abppkg.json", + "folder": "src" + }, + "Volo.Abp.SettingManagement.Blazor.WebAssembly": { + "path": "src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.abppkg.json", + "folder": "src" } } } \ No newline at end of file diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.abppkg.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/Volo.Abp.SettingManagement.DemoApp.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo.Abp.SettingManagement.Application.Contracts.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo.Abp.SettingManagement.Application.Contracts.abppkg.json new file mode 100644 index 0000000000..49032794e2 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo.Abp.SettingManagement.Application.Contracts.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.application-contracts" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.json new file mode 100644 index 0000000000..412567ac33 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.application" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.abppkg.json new file mode 100644 index 0000000000..ef40d81585 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.Server/Volo.Abp.SettingManagement.Blazor.Server.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor-server" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.abppkg.json new file mode 100644 index 0000000000..471ef5e067 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor-wasm" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.abppkg.json new file mode 100644 index 0000000000..19c29b7b8b --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.blazor" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.json new file mode 100644 index 0000000000..8b3de05f76 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.json new file mode 100644 index 0000000000..1d574efe45 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.json new file mode 100644 index 0000000000..e1c64f0175 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.json new file mode 100644 index 0000000000..7deef5e383 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api-client" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.json new file mode 100644 index 0000000000..515bfe64c4 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.http-api" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.json new file mode 100644 index 0000000000..8b23fd1e69 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mongodb" +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.json new file mode 100644 index 0000000000..930c4018b3 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mvc" +} \ No newline at end of file diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.abppkg.json b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.abppkg.json b/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.abppkg.json b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.abppkg.json b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file From fb6f6084ac65ca210b4762ecf5e5232238f8ad25 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 03:12:10 +0300 Subject: [PATCH 025/129] init users module --- modules/users/Volo.Abp.Users.abpmdl.json | 16 ++++++++-------- .../Volo.Abp.Users.Domain.Shared.abppkg.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/users/Volo.Abp.Users.abpmdl.json b/modules/users/Volo.Abp.Users.abpmdl.json index 63ec84a14e..f2b03eef4f 100644 --- a/modules/users/Volo.Abp.Users.abpmdl.json +++ b/modules/users/Volo.Abp.Users.abpmdl.json @@ -5,14 +5,6 @@ } }, "packages": { - "Volo.Abp.Users.Abstractions": { - "path": "src/Volo.Abp.Users.Abstractions/Volo.Abp.Users.Abstractions.abppkg.json", - "folder": "src" - }, - "Volo.Abp.Users.Domain.Shared": { - "path": "src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.json", - "folder": "src" - }, "Volo.Abp.Users.Domain": { "path": "src/Volo.Abp.Users.Domain/Volo.Abp.Users.Domain.abppkg.json", "folder": "src" @@ -21,6 +13,14 @@ "path": "src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.abppkg.json", "folder": "src" }, + "Volo.Abp.Users.Domain.Shared": { + "path": "src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.json", + "folder": "src" + }, + "Volo.Abp.Users.Abstractions": { + "path": "src/Volo.Abp.Users.Abstractions/Volo.Abp.Users.Abstractions.abppkg.json", + "folder": "src" + }, "Volo.Abp.Users.MongoDB": { "path": "src/Volo.Abp.Users.MongoDB/Volo.Abp.Users.MongoDB.abppkg.json", "folder": "src" diff --git a/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.json b/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.json index 169c71c1e1..8b3de05f76 100644 --- a/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.json +++ b/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.json @@ -1,3 +1,3 @@ { - "role": "lib.domain.shared" + "role": "lib.domain-shared" } \ No newline at end of file From 320875a4b25e6280eae74bcf27ad812143f9b5a2 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 4 May 2021 15:27:10 +0300 Subject: [PATCH 026/129] Created LoginInfoCommand --- .../Volo/Abp/Cli/AbpCliCoreModule.cs | 1 + .../Volo/Abp/Cli/Auth/AuthService.cs | 43 +++++++++++-- .../Volo/Abp/Cli/Auth/LoginInfo.cs | 16 +++++ .../Abp/Cli/Commands/LoginInfoCommand..cs | 63 +++++++++++++++++++ 4 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/LoginInfo.cs create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand..cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index 330cbeb77a..ce6ab1e831 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -36,6 +36,7 @@ namespace Volo.Abp.Cli options.Commands["add-module"] = typeof(AddModuleCommand); options.Commands["list-modules"] = typeof(ListModulesCommand); options.Commands["login"] = typeof(LoginCommand); + options.Commands["login-info"] = typeof(LoginInfoCommand); options.Commands["logout"] = typeof(LogoutCommand); options.Commands[GenerateProxyCommand.Name] = typeof(GenerateProxyCommand); options.Commands[RemoveProxyCommand.Name] = typeof(RemoveProxyCommand); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs index 61008ee826..bb16733e16 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs @@ -9,8 +9,10 @@ using IdentityModel; using Microsoft.Extensions.Logging; using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Http; +using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.DependencyInjection; using Volo.Abp.IdentityModel; +using Volo.Abp.Json; using Volo.Abp.Threading; namespace Volo.Abp.Cli.Auth @@ -18,21 +20,54 @@ namespace Volo.Abp.Cli.Auth public class AuthService : ITransientDependency { protected IIdentityModelAuthenticationService AuthenticationService { get; } - protected ILogger Logger { get; } + protected ILogger Logger { get; } protected CliHttpClientFactory CliHttpClientFactory { get; } + public RemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; } + public IJsonSerializer JsonSerializer { get; } public ICancellationTokenProvider CancellationTokenProvider { get; } public AuthService( IIdentityModelAuthenticationService authenticationService, - ILogger logger, + ILogger logger, ICancellationTokenProvider cancellationTokenProvider, - CliHttpClientFactory cliHttpClientFactory + CliHttpClientFactory cliHttpClientFactory, + RemoteServiceExceptionHandler remoteServiceExceptionHandler, + IJsonSerializer jsonSerializer ) { AuthenticationService = authenticationService; Logger = logger; CancellationTokenProvider = cancellationTokenProvider; CliHttpClientFactory = cliHttpClientFactory; + RemoteServiceExceptionHandler = remoteServiceExceptionHandler; + JsonSerializer = jsonSerializer; + } + + public async Task GetLoginInfoAsync() + { + if (!IsLoggedIn()) + { + return null; + } + + var url = $"{CliUrls.WwwAbpIo}api/license/login-info"; + + var client = CliHttpClientFactory.CreateClient(); + + using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger)) + { + if (!response.IsSuccessStatusCode) + { + Logger.LogError("Remote server returns '{response.StatusCode}'"); + return null; + } + + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); + + var responseContent = await response.Content.ReadAsStringAsync(); + + return JsonSerializer.Deserialize(responseContent); + } } public async Task LoginAsync(string userName, string password, string organizationName = null) @@ -108,4 +143,4 @@ namespace Volo.Abp.Cli.Auth return File.Exists(CliPaths.AccessToken); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/LoginInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/LoginInfo.cs new file mode 100644 index 0000000000..2ad31421e5 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/LoginInfo.cs @@ -0,0 +1,16 @@ + +namespace Volo.Abp.Cli.Auth +{ + public class LoginInfo + { + public string Name { get; set; } + + public string Surname { get; set; } + + public string Username { get; set; } + + public string EmailAddress { get; set; } + + public string Organization { get; set; } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand..cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand..cs new file mode 100644 index 0000000000..e5bd62c393 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand..cs @@ -0,0 +1,63 @@ +using System; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Auth; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.Commands +{ + public class LoginInfoCommand : IConsoleCommand, ITransientDependency + { + public ILogger Logger { get; set; } + + protected AuthService AuthService { get; } + + public LoginInfoCommand(AuthService authService) + { + AuthService = authService; + Logger = NullLogger.Instance; + } + + public async Task ExecuteAsync(CommandLineArgs commandLineArgs) + { + var loginInfo = await AuthService.GetLoginInfoAsync(); + + if (loginInfo == null) + { + Logger.LogError("Unable to get login info."); + return; + } + + var sb = new StringBuilder(); + sb.AppendLine(""); + sb.AppendLine($"Login info:"); + sb.AppendLine($"Name: {loginInfo.Name}"); + sb.AppendLine($"Surname: {loginInfo.Surname}"); + sb.AppendLine($"Username: {loginInfo.Username}"); + sb.AppendLine($"Email Address: {loginInfo.EmailAddress}"); + sb.AppendLine($"Organization: {loginInfo.Organization}"); + Logger.LogInformation(sb.ToString()); + } + + public string GetUsageInfo() + { + var sb = new StringBuilder(); + + sb.AppendLine(""); + sb.AppendLine("Usage:"); + sb.AppendLine(" abp login-info"); + sb.AppendLine(""); + sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI"); + + return sb.ToString(); + } + + public string GetShortDescription() + { + return "Show your login info."; + } + } +} From 07be3549c42716a938a692d2cda498d5ed25eed7 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 4 May 2021 17:54:56 +0300 Subject: [PATCH 027/129] init blob-storing db module --- .../Volo.Abp.BlobStoring.Database.abpmdl.json | 79 ++++++++----------- .../Volo.Abp.BlobStoring.Database.abpsln.json | 3 + ...oring.Database.Host.ConsoleApp.abpmdl.json | 13 +++ ...ase.Host.ConsoleApp.ConsoleApp.abppkg.json | 1 + ...Storing.Database.Domain.Shared.abppkg.json | 3 + ...bp.BlobStoring.Database.Domain.abppkg.json | 3 + ...g.Database.EntityFrameworkCore.abppkg.json | 3 + ...p.BlobStoring.Database.MongoDB.abppkg.json | 3 + ...bStoring.Database.Domain.Tests.abppkg.json | 3 + ...base.EntityFrameworkCore.Tests.abppkg.json | 3 + ...Storing.Database.MongoDB.Tests.abppkg.json | 3 + ....BlobStoring.Database.TestBase.abppkg.json | 1 + 12 files changed, 74 insertions(+), 44 deletions(-) create mode 100644 modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.abpmdl.json create mode 100644 modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json create mode 100644 modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.json create mode 100644 modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.json create mode 100644 modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.json create mode 100644 modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.json create mode 100644 modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.abppkg.json create mode 100644 modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.abppkg.json create mode 100644 modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.abppkg.json create mode 100644 modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.abppkg.json diff --git a/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json b/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json index 2d5e84ad96..f5f118cbdc 100644 --- a/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json +++ b/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json @@ -1,64 +1,55 @@ { "folders": { - "src": {}, - "test": {} + "items": { + "src": {}, + "test": {}, + "host": { + "items": { + "BlobStoring.Database.Host.ConsoleApp": { + "items": { + "src": {} + } + } + } + } + } }, "packages": { "Volo.Abp.BlobStoring.Database.Domain.Shared": { - "path": "src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.csproj", - "folder": "src", - "includes": { - "lib.domain.shared": {} - } + "path": "src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.json", + "folder": "src" }, "Volo.Abp.BlobStoring.Database.Domain": { - "path": "src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.csproj", - "folder": "src", - "includes": { - "lib.domain": {} - } + "path": "src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.json", + "folder": "src" }, "Volo.Abp.BlobStoring.Database.EntityFrameworkCore": { - "path": "src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.csproj", - "folder": "src", - "includes": { - "lib.ef": {} - } + "path": "src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.json", + "folder": "src" }, "Volo.Abp.BlobStoring.Database.MongoDB": { - "path": "src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.csproj", - "folder": "src", - "includes": { - "lib.mongodb": {} - } + "path": "src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.json", + "folder": "src" }, "Volo.Abp.BlobStoring.Database.TestBase": { - "path": "test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } - }, - "Volo.Abp.BlobStoring.Database.Domain.Tests": { - "path": "test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.abppkg.json", + "folder": "test" }, "Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests": { - "path": "test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.abppkg.json", + "folder": "test" }, "Volo.Abp.BlobStoring.Database.MongoDB.Tests": { - "path": "test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj", - "folder": "test", - "includes": { - "lib.test": {} - } + "path": "test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.BlobStoring.Database.Domain.Tests": { + "path": "test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.abppkg.json", + "folder": "test" + }, + "BlobStoring.Database.Host.ConsoleApp.ConsoleApp": { + "path": "host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json", + "folder": "host/BlobStoring.Database.Host.ConsoleApp/src" } } } \ No newline at end of file diff --git a/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpsln.json b/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpsln.json index 3261567c56..e90f5d10ff 100644 --- a/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpsln.json +++ b/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpsln.json @@ -2,6 +2,9 @@ "modules": { "Volo.Abp.BlobStoring.Database": { "path": "Volo.Abp.BlobStoring.Database.abpmdl.json" + }, + "BlobStoring.Database.Host.ConsoleApp": { + "path": "host/BlobStoring.Database.Host.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.abpmdl.json" } } } \ No newline at end of file diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.abpmdl.json b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.abpmdl.json new file mode 100644 index 0000000000..e8b2a715c8 --- /dev/null +++ b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.abpmdl.json @@ -0,0 +1,13 @@ +{ + "folders": { + "items": { + "src": {} + } + }, + "packages": { + "BlobStoring.Database.Host.ConsoleApp.ConsoleApp": { + "path": "src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json", + "folder": "src" + } + } +} \ No newline at end of file diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.json b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.json new file mode 100644 index 0000000000..8b3de05f76 --- /dev/null +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.json b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.json new file mode 100644 index 0000000000..1d574efe45 --- /dev/null +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.json b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.json new file mode 100644 index 0000000000..e1c64f0175 --- /dev/null +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.json b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.json new file mode 100644 index 0000000000..8b23fd1e69 --- /dev/null +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mongodb" +} \ No newline at end of file diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.abppkg.json b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.abppkg.json b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.abppkg.json b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.abppkg.json b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.abppkg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.abppkg.json @@ -0,0 +1 @@ +{} \ No newline at end of file From 0862dc148a8284cc4dc75a0383207ad708e2eda6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 5 May 2021 01:06:06 +0300 Subject: [PATCH 028/129] Resolved #8885: ABP CLI batch command --- .../Volo/Abp/Cli/CliService.cs | 71 +++++++++++++++---- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs index 11ba6dedde..a847881d60 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs @@ -41,33 +41,76 @@ namespace Volo.Abp.Cli { Logger.LogInformation("ABP CLI (https://abp.io)"); - var commandLineArgs = CommandLineArgumentParser.Parse(args); - #if !DEBUG if (!commandLineArgs.Options.ContainsKey("skip-cli-version-check")) { await CheckCliVersionAsync(); } #endif - - var commandType = CommandSelector.Select(commandLineArgs); - - using (var scope = ServiceScopeFactory.CreateScope()) + var commandLineArgs = CommandLineArgumentParser.Parse(args); + + try { - var command = (IConsoleCommand)scope.ServiceProvider.GetRequiredService(commandType); - - try + if (commandLineArgs.IsCommand("batch")) { - await command.ExecuteAsync(commandLineArgs); + await RunBatchAsync(commandLineArgs); } - catch (CliUsageException usageException) + else { - Logger.LogWarning(usageException.Message); + await RunInternalAsync(commandLineArgs); } - catch (Exception ex) + } + catch (CliUsageException usageException) + { + Logger.LogWarning(usageException.Message); + } + catch (Exception ex) + { + Logger.LogException(ex); + } + } + + private async Task RunBatchAsync(CommandLineArgs commandLineArgs) + { + var targetFile = commandLineArgs.Target; + if (targetFile.IsNullOrWhiteSpace()) + { + throw new CliUsageException( + "Must provide a file name/path that contains a list of commands" + + Environment.NewLine + Environment.NewLine + + "Example: " + + " abp batch commands.txt" + ); + } + + var filePath = Path.Combine(Directory.GetCurrentDirectory(), targetFile); + var fileLines = File.ReadAllLines(filePath); + foreach (var line in fileLines) + { + var lineText = line; + if (lineText.IsNullOrWhiteSpace() || lineText.StartsWith("#")) { - Logger.LogException(ex); + continue; } + + if (lineText.Contains('#')) + { + lineText = lineText.Substring(0, lineText.IndexOf('#')); + } + + var args = CommandLineArgumentParser.Parse(lineText.Split(' ')); + await RunInternalAsync(args); + } + } + + private async Task RunInternalAsync(CommandLineArgs commandLineArgs) + { + var commandType = CommandSelector.Select(commandLineArgs); + + using (var scope = ServiceScopeFactory.CreateScope()) + { + var command = (IConsoleCommand) scope.ServiceProvider.GetRequiredService(commandType); + await command.ExecuteAsync(commandLineArgs); } } From c4e92a3431787b1a6727a615768a7a2906a9ba69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 5 May 2021 03:17:18 +0300 Subject: [PATCH 029/129] Resolved #8890: Get connection string name from the replaced dbcontext --- .../Data/IConnectionStringResolverExtensions.cs | 17 +++++++++++++++-- .../UnitOfWorkDbContextProvider.cs | 9 ++++----- .../MongoDB/UnitOfWorkMongoDbContextProvider.cs | 16 ++++++++-------- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolverExtensions.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolverExtensions.cs index 1fa097964c..ceeaec8f8f 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolverExtensions.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolverExtensions.cs @@ -10,13 +10,26 @@ namespace Volo.Abp.Data [Obsolete("Use ResolveAsync method")] public static string Resolve(this IConnectionStringResolver resolver) { - return resolver.Resolve(ConnectionStringNameAttribute.GetConnStringName()); + return resolver.Resolve(typeof(T)); } [NotNull] public static Task ResolveAsync(this IConnectionStringResolver resolver) { - return resolver.ResolveAsync(ConnectionStringNameAttribute.GetConnStringName()); + return resolver.ResolveAsync(typeof(T)); + } + + [NotNull] + [Obsolete("Use ResolveAsync method")] + public static string Resolve(this IConnectionStringResolver resolver, Type type) + { + return resolver.Resolve(ConnectionStringNameAttribute.GetConnStringName(type)); + } + + [NotNull] + public static Task ResolveAsync(this IConnectionStringResolver resolver, Type type) + { + return resolver.ResolveAsync(ConnectionStringNameAttribute.GetConnStringName(type)); } } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs index 2fa56b550b..e5e4c2584a 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs @@ -62,10 +62,9 @@ namespace Volo.Abp.Uow.EntityFrameworkCore throw new AbpException("A DbContext can only be created inside a unit of work!"); } - var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(); - var connectionString = ResolveConnectionString(connectionStringName); - var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TDbContext)); + var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType); + var connectionString = ResolveConnectionString(connectionStringName); var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}"; var databaseApi = unitOfWork.GetOrAddDatabaseApi( @@ -85,10 +84,10 @@ namespace Volo.Abp.Uow.EntityFrameworkCore throw new AbpException("A DbContext can only be created inside a unit of work!"); } - var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(); + var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TDbContext)); + var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType); var connectionString = await ResolveConnectionStringAsync(connectionStringName); - var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TDbContext)); var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}"; var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey); diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs index a26307234d..2a3842441f 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs @@ -62,8 +62,8 @@ namespace Volo.Abp.Uow.MongoDB $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); } - var connectionString = ResolveConnectionString(); var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TMongoDbContext)); + var connectionString = ResolveConnectionString(targetDbContextType); var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}"; var mongoUrl = new MongoUrl(connectionString); @@ -90,8 +90,8 @@ namespace Volo.Abp.Uow.MongoDB $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); } - var connectionString = await ResolveConnectionStringAsync(); var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TMongoDbContext)); + var connectionString = await ResolveConnectionStringAsync(targetDbContextType); var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}"; var mongoUrl = new MongoUrl(connectionString); @@ -244,33 +244,33 @@ namespace Volo.Abp.Uow.MongoDB return dbContext; } - private async Task ResolveConnectionStringAsync() + private async Task ResolveConnectionStringAsync(Type dbContextType) { // Multi-tenancy unaware contexts should always use the host connection string if (typeof(TMongoDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false)) { using (_currentTenant.Change(null)) { - return await _connectionStringResolver.ResolveAsync(); + return await _connectionStringResolver.ResolveAsync(dbContextType); } } - return await _connectionStringResolver.ResolveAsync(); + return await _connectionStringResolver.ResolveAsync(dbContextType); } [Obsolete("Use ResolveConnectionStringAsync method.")] - private string ResolveConnectionString() + private string ResolveConnectionString(Type dbContextType) { // Multi-tenancy unaware contexts should always use the host connection string if (typeof(TMongoDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false)) { using (_currentTenant.Change(null)) { - return _connectionStringResolver.Resolve(); + return _connectionStringResolver.Resolve(dbContextType); } } - return _connectionStringResolver.Resolve(); + return _connectionStringResolver.Resolve(dbContextType); } protected virtual CancellationToken GetCancellationToken(CancellationToken preferredValue = default) From a4be7d8baf90dc7d1d6336c13bd1b2a890dc2f88 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 5 May 2021 11:20:55 +0800 Subject: [PATCH 030/129] Use DateTimeModelBinder instead of SimpleTypeModelBinder for binding datetime. --- .../ModelBinding/AbpDateTimeModelBinder.cs | 37 +++--------- .../AbpDateTimeModelBinderProvider.cs | 56 +++++++++++-------- .../RegularTestControllerClientProxy_Tests.cs | 4 +- 3 files changed, 43 insertions(+), 54 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinder.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinder.cs index 1916b9aa16..66124748cc 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinder.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinder.cs @@ -2,48 +2,29 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Binders; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Volo.Abp.Timing; namespace Volo.Abp.AspNetCore.Mvc.ModelBinding { public class AbpDateTimeModelBinder : IModelBinder { - private readonly Type _type; - private readonly SimpleTypeModelBinder _simpleTypeModelBinder; + private readonly DateTimeModelBinder _dateTimeModelBinder; private readonly IClock _clock; - public AbpDateTimeModelBinder(ModelBinderProviderContext context) + public AbpDateTimeModelBinder(IClock clock, DateTimeModelBinder dateTimeModelBinder) { - _type = context.Metadata.ModelType; - _clock = context.Services.GetRequiredService(); - _simpleTypeModelBinder = new SimpleTypeModelBinder(context.Metadata.ModelType, - context.Services.GetRequiredService()); + _clock = clock; + _dateTimeModelBinder = dateTimeModelBinder; } public async Task BindModelAsync(ModelBindingContext bindingContext) { - await _simpleTypeModelBinder.BindModelAsync(bindingContext); - - if (!bindingContext.Result.IsModelSet) - { - return; - } - - if (_type == typeof(DateTime)) - { - var dateTime = (DateTime) bindingContext.Result.Model; - bindingContext.Result = ModelBindingResult.Success(_clock.Normalize(dateTime)); - } - else + await _dateTimeModelBinder.BindModelAsync(bindingContext); + if (bindingContext.Result.IsModelSet) { - var dateTime = (DateTime?) bindingContext.Result.Model; - if (dateTime != null) - { - bindingContext.Result = ModelBindingResult.Success(_clock.Normalize(dateTime.Value)); - } + // ReSharper disable once PossibleNullReferenceException + bindingContext.Result = ModelBindingResult.Success(_clock.Normalize((DateTime) bindingContext.Result.Model)); } } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinderProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinderProvider.cs index ddda91c8a0..83129199bc 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinderProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/AbpDateTimeModelBinderProvider.cs @@ -1,48 +1,56 @@ using System; +using System.Globalization; using System.Linq; using Microsoft.AspNetCore.Mvc.ModelBinding; +using Microsoft.AspNetCore.Mvc.ModelBinding.Binders; using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Volo.Abp.Timing; namespace Volo.Abp.AspNetCore.Mvc.ModelBinding { - public class AbpDateTimeModelBinderProvider : IModelBinderProvider { public IModelBinder GetBinder(ModelBinderProviderContext context) { - if (context.Metadata.ModelType != typeof(DateTime) && - context.Metadata.ModelType != typeof(DateTime?)) - { - return null; - } - - if (context.Metadata.ContainerType == null) + var modelType = context.Metadata.UnderlyingOrModelType; + if (modelType == typeof(DateTime)) { - if (context.Metadata is DefaultModelMetadata defaultModelMetadata && - defaultModelMetadata.Attributes.Attributes.All(x => x.GetType() != typeof(DisableDateTimeNormalizationAttribute))) + if (context.Metadata.ContainerType == null) { - return new AbpDateTimeModelBinder(context); + if (context.Metadata is DefaultModelMetadata defaultModelMetadata && + defaultModelMetadata.Attributes.Attributes.All(x => x.GetType() != typeof(DisableDateTimeNormalizationAttribute))) + { + return CreateAbpDateTimeModelBinder(context); + } } - } - else - { - var dateNormalizationDisabledForClass = - context.Metadata.ContainerType.IsDefined(typeof(DisableDateTimeNormalizationAttribute), true); + else + { + var dateNormalizationDisabledForClass = + context.Metadata.ContainerType.IsDefined(typeof(DisableDateTimeNormalizationAttribute), true); - var dateNormalizationDisabledForProperty = context.Metadata.ContainerType - .GetProperty(context.Metadata.PropertyName) - ?.IsDefined(typeof(DisableDateTimeNormalizationAttribute), true); + var dateNormalizationDisabledForProperty = context.Metadata.ContainerType + .GetProperty(context.Metadata.PropertyName) + ?.IsDefined(typeof(DisableDateTimeNormalizationAttribute), true); - if (!dateNormalizationDisabledForClass && - dateNormalizationDisabledForProperty != null && - !dateNormalizationDisabledForProperty.Value) - { - return new AbpDateTimeModelBinder(context); + if (!dateNormalizationDisabledForClass && + dateNormalizationDisabledForProperty != null && + !dateNormalizationDisabledForProperty.Value) + { + return CreateAbpDateTimeModelBinder(context); + } } } return null; } + + protected virtual AbpDateTimeModelBinder CreateAbpDateTimeModelBinder(ModelBinderProviderContext context) + { + const DateTimeStyles supportedStyles = DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal; + var dateTimeModelBinder = new DateTimeModelBinder(supportedStyles, context.Services.GetRequiredService()); + return new AbpDateTimeModelBinder(context.Services.GetRequiredService(), dateTimeModelBinder); + } } } diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs index 2ac327e5e7..bd35016989 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs @@ -46,7 +46,7 @@ namespace Volo.Abp.Http.DynamicProxying { var dateTime1 = new DateTime(2020, 04, 19, 19, 05, 01); var result = await _controller.GetWithDateTimeParameterAsync(dateTime1); - result.ShouldBe(dateTime1); + result.ToUniversalTime().ShouldBe(dateTime1.ToUniversalTime()); } [Fact] @@ -56,7 +56,7 @@ namespace Volo.Abp.Http.DynamicProxying { var dateTime1 = new DateTime(2020, 04, 19, 19, 05, 01); var result = await _controller.GetWithDateTimeParameterAsync(dateTime1); - result.ShouldBe(dateTime1); + result.ToUniversalTime().ShouldBe(dateTime1.ToUniversalTime()); } } From 7cba9e28908ebc1630aab6280f37b149a5f953c7 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 5 May 2021 11:55:09 +0800 Subject: [PATCH 031/129] Throw UserFriendlyException when tenant is not exist. --- .../Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs | 7 ++++++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/ar.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/cs.json | 1 + .../AspNetCore/Mvc/UI/MultiTenancy/Localization/de-DE.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/de.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/es-mx.json | 1 + .../AspNetCore/Mvc/UI/MultiTenancy/Localization/es.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/fr.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/hu.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/nl.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/pl-PL.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/pt-BR.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/ru.json | 1 + .../AspNetCore/Mvc/UI/MultiTenancy/Localization/sl.json | 1 + .../AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json | 3 ++- .../AspNetCore/Mvc/UI/MultiTenancy/Localization/vi.json | 1 + .../Mvc/UI/MultiTenancy/Localization/zh-Hans.json | 3 ++- .../Mvc/UI/MultiTenancy/Localization/zh-Hant.json | 3 ++- 21 files changed, 41 insertions(+), 16 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs index d4f0ff2187..f47edab789 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs @@ -48,7 +48,12 @@ namespace Pages.Abp.MultiTenancy else { var tenant = await TenantStore.FindAsync(Input.Name); - if (tenant == null || !tenant.IsActive) + if (tenant == null) + { + throw new UserFriendlyException(L["GivenTenantIsNotExist", Input.Name]); + } + + if (!tenant.IsActive) { throw new UserFriendlyException(L["GivenTenantIsNotAvailable", Input.Name]); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/ar.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/ar.json index 7e5f26edc6..fafc04a6ee 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/ar.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/ar.json @@ -1,6 +1,7 @@ { "culture": "ar", "texts": { + "GivenTenantIsNotExist": "المستأجر المحدد غير موجود: {0}", "GivenTenantIsNotAvailable": "الجهة المحددة غير متاحة: {0}", "Tenant": "الجهة", "Switch": "تغيير", @@ -9,4 +10,4 @@ "SwitchTenant": "تغيير الجهة", "NotSelected": "غير محدد" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/cs.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/cs.json index 05457dfa16..0f63728c77 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/cs.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/cs.json @@ -1,6 +1,7 @@ { "culture": "cs", "texts": { + "GivenTenantIsNotExist": "Vybraný tenant neexistuje: {0}", "GivenTenantIsNotAvailable": "Zvolený tenant není dostupný: {0}", "Tenant": "Tenant", "Switch": "změnit", diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/de-DE.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/de-DE.json index 3b1f12c29d..a0bb43999a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/de-DE.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/de-DE.json @@ -1,6 +1,7 @@ { "culture": "de-DE", "texts": { + "GivenTenantIsNotExist": "Der angegebene Client ist nicht vorhanden: {0}", "GivenTenantIsNotAvailable": "Der angegebene Mandant ist nicht verfügbar: {0}", "Tenant": "Mandant", "Switch": "wechseln", @@ -9,4 +10,4 @@ "SwitchTenant": "Mandant wechseln", "NotSelected": "Nicht ausgewählt" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/de.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/de.json index 98909d9847..029e7ed76a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/de.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/de.json @@ -1,6 +1,7 @@ { "culture": "de", "texts": { + "GivenTenantIsNotExist": "Der angegebene Client ist nicht vorhanden: {0}", "GivenTenantIsNotAvailable": "Der angegebene Mandant ist nicht verfügbar: {0}", "Tenant": "Mandant", "Switch": "wechseln", @@ -9,4 +10,4 @@ "SwitchTenant": "Mandant wechseln", "NotSelected": "Nicht ausgewählt" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json index be5593fbd3..e93e7ef25e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json @@ -1,6 +1,7 @@ { "culture": "en-GB", "texts": { + "GivenTenantIsNotExist": "Given tenant is not exist: {0}", "GivenTenantIsNotAvailable": "Given tenant is not available: {0}", "Tenant": "Tenant", "Switch": "switch", @@ -9,4 +10,4 @@ "SwitchTenant": "Switch tenant", "NotSelected": "Not selected" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json index d1a9f1f09e..25516ba765 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json @@ -1,6 +1,7 @@ { "culture": "en", "texts": { + "GivenTenantIsNotExist": "Given tenant is not exist: {0}", "GivenTenantIsNotAvailable": "Given tenant is not available: {0}", "Tenant": "Tenant", "Switch": "switch", @@ -9,4 +10,4 @@ "SwitchTenant": "Switch tenant", "NotSelected": "Not selected" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es-mx.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es-mx.json index 746f1dec0f..5cd08ab345 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es-mx.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es-mx.json @@ -1,6 +1,7 @@ { "culture": "es-MX", "texts": { + "GivenTenantIsNotExist": "El inquilino {0} no existe", "GivenTenantIsNotAvailable": "El inquilino {0} no está disponible", "Tenant": "Inquilino", "Switch": "cambiar", diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es.json index d6fd84dcbe..bd2d82a2d0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es.json @@ -1,6 +1,7 @@ { "culture": "es", "texts": { + "GivenTenantIsNotExist": "El inquilino {0} no existe", "GivenTenantIsNotAvailable": "El inquilino {0} no está disponible", "Tenant": "Inquilino", "Switch": "cambiar", @@ -9,4 +10,4 @@ "SwitchTenantHint": "Deje en blanco el campo nombre para cambiar el lado del host.", "NotSelected": "No seleccionado" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json index 7cbeabe8cd..d6fb04eb4c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json @@ -1,6 +1,7 @@ { "culture": "fi", "texts": { + "GivenTenantIsNotExist": "Annettua vuokralaista ei ole olemassa: {0}", "GivenTenantIsNotAvailable": "Annettua vuokralaista ei ole saatavilla: {0}", "Tenant": "Vuokralainen", "Switch": "vaihtaa", @@ -9,4 +10,4 @@ "SwitchTenant": "Vaihda vuokralainen", "NotSelected": "Ei valittu" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fr.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fr.json index dbd17957fc..6fe00242b5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fr.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fr.json @@ -1,6 +1,7 @@ { "culture": "fr", "texts": { + "GivenTenantIsNotExist": "Adott bérlő nem létezik: {0}", "GivenTenantIsNotAvailable": "Le Tenant donné n'est pas disponible: {0}", "Tenant": "Tenant", "Switch": "Changer", @@ -9,4 +10,4 @@ "SwitchTenant": "Changer le Tenant", "NotSelected": "Non séléctionné" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/hu.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/hu.json index 057e9d2968..108b3520d7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/hu.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/hu.json @@ -1,6 +1,7 @@ { "culture": "hu", "texts": { + "GivenTenantIsNotExist": "Adott bérlő nem létezik: {0}", "GivenTenantIsNotAvailable": "A megadott előfizető nem érhető el: {0}", "Tenant": "Előfizető", "Switch": "váltás", @@ -9,4 +10,4 @@ "SwitchTenant": "Előfizető váltás", "NotSelected": "Nincs kiválasztva" } - } \ No newline at end of file + } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/nl.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/nl.json index ea15166b9e..3cbb689f03 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/nl.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/nl.json @@ -1,6 +1,7 @@ { "culture": "nl", "texts": { + "GivenTenantIsNotExist": "Opgegeven huurder bestaat niet: {0}", "GivenTenantIsNotAvailable": "Gegeven klant is niet beschikbaar: {0}", "Tenant": "Klant", "Switch": "Schakel over", @@ -9,4 +10,4 @@ "SwitchTenant": "Klant wisselen", "NotSelected": "Niet geselecteerd" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pl-PL.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pl-PL.json index 438d770a7c..79d3e9640d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pl-PL.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pl-PL.json @@ -1,6 +1,7 @@ { "culture": "pl-PL", "texts": { + "GivenTenantIsNotExist": "Podany najemca nie istnieje: {0}", "GivenTenantIsNotAvailable": "Podany tenant jest niedostępny: {0}", "Tenant": "Tenant", "Switch": "zmień", @@ -8,4 +9,4 @@ "SwitchTenantHint": "Pozostaw pole nazwy puste, aby przełączyć się na stronę hosta.", "NotSelected": "Nie wybrano" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pt-BR.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pt-BR.json index 8ac517d594..95396abca1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pt-BR.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pt-BR.json @@ -1,6 +1,7 @@ { "culture": "pt-BR", "texts": { + "GivenTenantIsNotExist": "O inquilino dado não existe: {0}", "GivenTenantIsNotAvailable": "Inquilino não está disponível: {0}", "Tenant": "Inquilino", "Switch": "trocar", @@ -9,4 +10,4 @@ "SwitchTenant": "Alterar Inquilino", "NotSelected": "Não selecionado" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/ru.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/ru.json index 04b2e5cf85..5492a7d7bb 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/ru.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/ru.json @@ -1,6 +1,7 @@ { "culture": "ru", "texts": { + "GivenTenantIsNotExist": "Данный арендатор не существует: {0}", "GivenTenantIsNotAvailable": "Данный арендатор недоступен: {0}", "Tenant": "Арендатор", "Switch": "переключиться", diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/sl.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/sl.json index 51938a569e..b1a07d3ee9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/sl.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/sl.json @@ -1,6 +1,7 @@ { "culture": "sl", "texts": { + "GivenTenantIsNotExist": "Dani najemnik ne obstaja: {0}", "GivenTenantIsNotAvailable": "Najemnik ni na voljo: {0}", "Tenant": "Najemnik", "Switch": "Zamenjaj", diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json index 994579e934..b5b6c374c1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/tr.json @@ -1,6 +1,7 @@ { "culture": "tr", "texts": { + "GivenTenantIsNotExist": "İstenilen müşteri bulunamadı: {0}", "GivenTenantIsNotAvailable": "İstenilen müşteri bulunamadı: {0}", "Tenant": "Müşteri", "Switch": "değiştir", @@ -9,4 +10,4 @@ "SwitchTenant": "Müşteri değiştir", "NotSelected": "Seçili değil" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/vi.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/vi.json index 975e1b4590..b8ad08bb82 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/vi.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/vi.json @@ -1,6 +1,7 @@ { "culture": "vi", "texts": { + "GivenTenantIsNotExist": "Người thuê đã cho không tồn tại: {0}", "GivenTenantIsNotAvailable": "Người thuê không có sẵn: {0}", "Tenant": "Người thuê", "Switch": "Chuyển đổi", diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hans.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hans.json index 31588cbebd..0e86d66293 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hans.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hans.json @@ -1,6 +1,7 @@ { "culture": "zh-Hans", "texts": { + "GivenTenantIsNotExist": "给定的租户不存在: {0}", "GivenTenantIsNotAvailable": "给定的租户不可用: {0}", "Tenant": "租户", "Switch": "切换", @@ -9,4 +10,4 @@ "SwitchTenant": "切换租户", "NotSelected": "未选中" } - } \ No newline at end of file + } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hant.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hant.json index 12eea67007..10a0da1023 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hant.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hant.json @@ -1,6 +1,7 @@ { "culture": "zh-Hant", "texts": { + "GivenTenantIsNotExist": "指定的租戶不存在: {0}", "GivenTenantIsNotAvailable": "指定的租戶不可用: {0}", "SwitchTenant": "切換租戶", "Name": "名稱", @@ -9,4 +10,4 @@ "Switch": "切換", "NotSelected": "尚未選定" } -} \ No newline at end of file +} From 24e9e7bacaeeb549dbec69ac2863a904512046b9 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 5 May 2021 14:03:03 +0800 Subject: [PATCH 032/129] Rename some services and properties of StateChecker. --- .../Toolbars/ToolbarItem.cs | 4 ++-- .../Toolbars/ToolbarManager.cs | 2 +- .../Permissions/PermissionDefinition.cs | 4 ++-- .../Permissions/PermissionChecker.cs | 10 +++++----- .../PermissionSimpleStateCheckerExtensions.cs | 13 +++++-------- .../AbpSimpleStateCheckerOptions.cs | 4 ++-- .../IHasSimpleStateCheckers.cs | 2 +- .../SimpleStateCheckerManager.cs | 10 +++++----- .../FeatureSimpleStateCheckerExtensions.cs | 2 +- .../GlobalFeatureSimpleStateCheckerExtensions.cs | 4 ++-- .../Abp/Ui/Navigation/ApplicationMenuItem.cs | 4 ++-- .../Volo/Abp/Ui/Navigation/MenuManager.cs | 2 +- .../PermissionStateProvider_Tests.cs | 16 ++++++++-------- ...horizationTestPermissionDefinitionProvider.cs | 2 +- .../SimpleStateCheckerTestBase.cs | 6 +++--- .../SimpleStateChecker_GlobalCheckCount_Test.cs | 4 ++-- .../SimpleStateChecker_Tests.cs | 4 ++-- 17 files changed, 45 insertions(+), 48 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarItem.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarItem.cs index f884e3436b..f7cba501c3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarItem.cs @@ -20,14 +20,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars [Obsolete("Use RequirePermissions extension method.")] public string RequiredPermissionName { get; set; } - public List> SimpleStateCheckers { get; } + public List> StateCheckers { get; } public ToolbarItem([NotNull] Type componentType, int order = 0, string requiredPermissionName = null) { Order = order; ComponentType = Check.NotNull(componentType, nameof(componentType)); RequiredPermissionName = requiredPermissionName; - SimpleStateCheckers = new List>(); + StateCheckers = new List>(); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs index b8e1e4687b..d27ab355c0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs @@ -56,7 +56,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars item.RequirePermissions(item.RequiredPermissionName); } - var checkPermissionsToolbarItems = toolbar.Items.Where(x => x.SimpleStateCheckers.Any()).ToArray(); + var checkPermissionsToolbarItems = toolbar.Items.Where(x => x.StateCheckers.Any()).ToArray(); if (checkPermissionsToolbarItems.Any()) { var result = await SimpleStateCheckerManager.IsEnabledAsync(checkPermissionsToolbarItems); diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs index 462672377c..92eda28b4b 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs @@ -32,7 +32,7 @@ namespace Volo.Abp.Authorization.Permissions /// public List Providers { get; } //TODO: Rename to AllowedProviders? - public List> SimpleStateCheckers { get; } + public List> StateCheckers { get; } public ILocalizableString DisplayName { @@ -89,7 +89,7 @@ namespace Volo.Abp.Authorization.Permissions Properties = new Dictionary(); Providers = new List(); - SimpleStateCheckers = new List>(); + StateCheckers = new List>(); _children = new List(); } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs index 0bcf197c5b..234fbf7ea2 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs @@ -16,20 +16,20 @@ namespace Volo.Abp.Authorization.Permissions protected ICurrentPrincipalAccessor PrincipalAccessor { get; } protected ICurrentTenant CurrentTenant { get; } protected IPermissionValueProviderManager PermissionValueProviderManager { get; } - protected ISimpleStateCheckerManager PermissionSimpleStateCheckerManager { get; } + protected ISimpleStateCheckerManager StateCheckerManager { get; } public PermissionChecker( ICurrentPrincipalAccessor principalAccessor, IPermissionDefinitionManager permissionDefinitionManager, ICurrentTenant currentTenant, IPermissionValueProviderManager permissionValueProviderManager, - ISimpleStateCheckerManager permissionSimpleStateCheckerManager) + ISimpleStateCheckerManager stateCheckerManager) { PrincipalAccessor = principalAccessor; PermissionDefinitionManager = permissionDefinitionManager; CurrentTenant = currentTenant; PermissionValueProviderManager = permissionValueProviderManager; - PermissionSimpleStateCheckerManager = permissionSimpleStateCheckerManager; + StateCheckerManager = stateCheckerManager; } public virtual async Task IsGrantedAsync(string name) @@ -50,7 +50,7 @@ namespace Volo.Abp.Authorization.Permissions return false; } - if (!await PermissionSimpleStateCheckerManager.IsEnabledAsync(permission)) + if (!await StateCheckerManager.IsEnabledAsync(permission)) { return false; } @@ -113,7 +113,7 @@ namespace Volo.Abp.Authorization.Permissions result.Result.Add(name, PermissionGrantResult.Undefined); if (permission.IsEnabled && - await PermissionSimpleStateCheckerManager.IsEnabledAsync(permission) && + await StateCheckerManager.IsEnabledAsync(permission) && permission.MultiTenancySide.HasFlag(multiTenancySide)) { permissionDefinitions.Add(permission); diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs index c7849416b3..5fc22cb93c 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionSimpleStateCheckerExtensions.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.Authorization.Permissions public static TState RequireAuthenticated([NotNull] this TState state) where TState : IHasSimpleStateCheckers { - state.SimpleStateCheckers.Add(new RequireAuthenticatedSimpleStateChecker()); + state.StateCheckers.Add(new RequireAuthenticatedSimpleStateChecker()); return state; } @@ -34,7 +34,7 @@ namespace Volo.Abp.Authorization.Permissions public static TState RequirePermissions( [NotNull] this TState state, bool requiresAll, - bool batchCheck = true, + bool batchCheck, params string[] permissions) where TState : IHasSimpleStateCheckers { @@ -43,15 +43,12 @@ namespace Volo.Abp.Authorization.Permissions if (batchCheck) { - lock (state) - { - RequirePermissionsSimpleBatchStateChecker.Instance.AddCheckModels(new RequirePermissionsSimpleBatchStateCheckerModel(state, permissions, requiresAll)); - state.SimpleStateCheckers.Add(RequirePermissionsSimpleBatchStateChecker.Instance); - } + RequirePermissionsSimpleBatchStateChecker.Instance.AddCheckModels(new RequirePermissionsSimpleBatchStateCheckerModel(state, permissions, requiresAll)); + state.StateCheckers.Add(RequirePermissionsSimpleBatchStateChecker.Instance); } else { - state.SimpleStateCheckers.Add(new RequirePermissionsSimpleStateChecker(new RequirePermissionsSimpleBatchStateCheckerModel(state, permissions, requiresAll))); + state.StateCheckers.Add(new RequirePermissionsSimpleStateChecker(new RequirePermissionsSimpleBatchStateCheckerModel(state, permissions, requiresAll))); } return state; diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/AbpSimpleStateCheckerOptions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/AbpSimpleStateCheckerOptions.cs index bdc756fdb8..66201449a1 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/AbpSimpleStateCheckerOptions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/AbpSimpleStateCheckerOptions.cs @@ -5,11 +5,11 @@ namespace Volo.Abp.SimpleStateChecking public class AbpSimpleStateCheckerOptions where TState : IHasSimpleStateCheckers { - public ITypeList> GlobalSimpleStateCheckers { get; } + public ITypeList> GlobalStateCheckers { get; } public AbpSimpleStateCheckerOptions() { - GlobalSimpleStateCheckers = new TypeList>(); + GlobalStateCheckers = new TypeList>(); } } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/IHasSimpleStateCheckers.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/IHasSimpleStateCheckers.cs index cf5a7df6fb..b9548e3bf4 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/IHasSimpleStateCheckers.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/IHasSimpleStateCheckers.cs @@ -5,6 +5,6 @@ namespace Volo.Abp.SimpleStateChecking public interface IHasSimpleStateCheckers where TState : IHasSimpleStateCheckers { - List> SimpleStateCheckers { get; } + List> StateCheckers { get; } } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerManager.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerManager.cs index 22831d8674..61a252850d 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerManager.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerManager.cs @@ -32,7 +32,7 @@ namespace Volo.Abp.SimpleStateChecking using (var scope = ServiceProvider.CreateScope()) { - var batchStateCheckers = states.SelectMany(x => x.SimpleStateCheckers) + var batchStateCheckers = states.SelectMany(x => x.StateCheckers) .Where(x => x is ISimpleBatchStateChecker) .Cast>() .GroupBy(x => x) @@ -42,7 +42,7 @@ namespace Volo.Abp.SimpleStateChecking { var context = new SimpleBatchStateCheckerContext( scope.ServiceProvider.GetRequiredService(), - states.Where(x => x.SimpleStateCheckers.Contains(stateChecker)).ToArray()); + states.Where(x => x.StateCheckers.Contains(stateChecker)).ToArray()); foreach (var x in await stateChecker.IsEnabledAsync(context)) { @@ -55,7 +55,7 @@ namespace Volo.Abp.SimpleStateChecking } } - foreach (ISimpleBatchStateChecker globalStateChecker in Options.GlobalSimpleStateCheckers + foreach (ISimpleBatchStateChecker globalStateChecker in Options.GlobalStateCheckers .Where(x => typeof(ISimpleBatchStateChecker).IsAssignableFrom(x)) .Select(x => ServiceProvider.GetRequiredService(x))) { @@ -87,7 +87,7 @@ namespace Volo.Abp.SimpleStateChecking { var context = new SimpleStateCheckerContext(scope.ServiceProvider.GetRequiredService(), state); - foreach (var provider in state.SimpleStateCheckers.WhereIf(!useBatchChecker, x => x is not ISimpleBatchStateChecker)) + foreach (var provider in state.StateCheckers.WhereIf(!useBatchChecker, x => x is not ISimpleBatchStateChecker)) { if (!await provider.IsEnabledAsync(context)) { @@ -95,7 +95,7 @@ namespace Volo.Abp.SimpleStateChecking } } - foreach (ISimpleStateChecker provider in Options.GlobalSimpleStateCheckers + foreach (ISimpleStateChecker provider in Options.GlobalStateCheckers .WhereIf(!useBatchChecker, x => !typeof(ISimpleBatchStateChecker).IsAssignableFrom(x)) .Select(x => ServiceProvider.GetRequiredService(x))) { diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureSimpleStateCheckerExtensions.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureSimpleStateCheckerExtensions.cs index b05a5f9d7a..d06e55effa 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureSimpleStateCheckerExtensions.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureSimpleStateCheckerExtensions.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.Features Check.NotNull(state, nameof(state)); Check.NotNullOrEmpty(features, nameof(features)); - state.SimpleStateCheckers.Add(new RequireFeaturesSimpleStateChecker(requiresAll, features)); + state.StateCheckers.Add(new RequireFeaturesSimpleStateChecker(requiresAll, features)); return state; } } diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureSimpleStateCheckerExtensions.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureSimpleStateCheckerExtensions.cs index dab3aa5b0e..f18f3d1569 100644 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureSimpleStateCheckerExtensions.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureSimpleStateCheckerExtensions.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.GlobalFeatures Check.NotNull(state, nameof(state)); Check.NotNullOrEmpty(globalFeatures, nameof(globalFeatures)); - state.SimpleStateCheckers.Add(new RequireGlobalFeaturesSimpleStateChecker(requiresAll, globalFeatures)); + state.StateCheckers.Add(new RequireGlobalFeaturesSimpleStateChecker(requiresAll, globalFeatures)); return state; } @@ -44,7 +44,7 @@ namespace Volo.Abp.GlobalFeatures Check.NotNull(state, nameof(state)); Check.NotNullOrEmpty(globalFeatures, nameof(globalFeatures)); - state.SimpleStateCheckers.Add(new RequireGlobalFeaturesSimpleStateChecker(requiresAll, globalFeatures)); + state.StateCheckers.Add(new RequireGlobalFeaturesSimpleStateChecker(requiresAll, globalFeatures)); return state; } } diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs index ff2490cdeb..f269c34598 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs @@ -76,7 +76,7 @@ namespace Volo.Abp.UI.Navigation [Obsolete("Use RequirePermissions extension method.")] public string RequiredPermissionName { get; set; } - public List> SimpleStateCheckers { get; } + public List> StateCheckers { get; } ///

/// Can be used to store a custom object related to this menu item. Optional. @@ -118,7 +118,7 @@ namespace Volo.Abp.UI.Navigation ElementId = elementId ?? GetDefaultElementId(); CssClass = cssClass; RequiredPermissionName = requiredPermissionName; - SimpleStateCheckers = new List>(); + StateCheckers = new List>(); Items = new ApplicationMenuItemList(); } diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs index 24870070a7..fe5c5da242 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs @@ -59,7 +59,7 @@ namespace Volo.Abp.UI.Navigation } } - var checkPermissionsMenuItems = allMenuItems.Where(x => x.SimpleStateCheckers.Any()).ToArray(); + var checkPermissionsMenuItems = allMenuItems.Where(x => x.StateCheckers.Any()).ToArray(); if (checkPermissionsMenuItems.Any()) { diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs index 162fb755a4..43dfa11330 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs @@ -12,13 +12,13 @@ namespace Volo.Abp.Authorization { public abstract class PermissionStateProvider_Tests : AuthorizationTestBase { - protected ISimpleStateCheckerManager PermissionSimpleStateCheckerManager { get; } + protected ISimpleStateCheckerManager StateCheckerManager { get; } protected IPermissionDefinitionManager PermissionDefinitionManager { get; } protected ICurrentPrincipalAccessor CurrentPrincipalAccessor { get; } public PermissionStateProvider_Tests() { - PermissionSimpleStateCheckerManager = GetRequiredService>(); + StateCheckerManager = GetRequiredService>(); PermissionDefinitionManager = GetRequiredService(); CurrentPrincipalAccessor = GetRequiredService(); } @@ -30,13 +30,13 @@ namespace Volo.Abp.Authorization public async Task PermissionState_Test() { var myPermission1 = PermissionDefinitionManager.Get("MyPermission1"); - myPermission1.SimpleStateCheckers.ShouldContain(x => x.GetType() == typeof(TestRequireEditionPermissionSimpleStateChecker)); + myPermission1.StateCheckers.ShouldContain(x => x.GetType() == typeof(TestRequireEditionPermissionSimpleStateChecker)); - (await PermissionSimpleStateCheckerManager.IsEnabledAsync(myPermission1)).ShouldBeFalse(); + (await StateCheckerManager.IsEnabledAsync(myPermission1)).ShouldBeFalse(); using (CurrentPrincipalAccessor.Change(new Claim(AbpClaimTypes.EditionId, Guid.NewGuid().ToString()))) { - (await PermissionSimpleStateCheckerManager.IsEnabledAsync(myPermission1)).ShouldBeTrue(); + (await StateCheckerManager.IsEnabledAsync(myPermission1)).ShouldBeTrue(); } } } @@ -47,7 +47,7 @@ namespace Volo.Abp.Authorization { services.Configure>(options => { - options.GlobalSimpleStateCheckers.Add(); + options.GlobalStateCheckers.Add(); }); } @@ -56,11 +56,11 @@ namespace Volo.Abp.Authorization { var myPermission2 = PermissionDefinitionManager.Get("MyPermission2"); - (await PermissionSimpleStateCheckerManager.IsEnabledAsync(myPermission2)).ShouldBeFalse(); + (await StateCheckerManager.IsEnabledAsync(myPermission2)).ShouldBeFalse(); using (CurrentPrincipalAccessor.Change(new Claim(AbpClaimTypes.Role, "admin"))) { - (await PermissionSimpleStateCheckerManager.IsEnabledAsync(myPermission2)).ShouldBeTrue(); + (await StateCheckerManager.IsEnabledAsync(myPermission2)).ShouldBeTrue(); } } } diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs index 868cc0225a..6f284d7029 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.Authorization.TestServices group.AddPermission("MyAuthorizedService1"); - group.AddPermission("MyPermission1").SimpleStateCheckers.Add(new TestRequireEditionPermissionSimpleStateChecker()); + group.AddPermission("MyPermission1").StateCheckers.Add(new TestRequireEditionPermissionSimpleStateChecker()); group.AddPermission("MyPermission2"); group.GetPermissionOrNull("MyAuthorizedService1").ShouldNotBeNull(); diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateCheckerTestBase.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateCheckerTestBase.cs index 989cd9fdc2..2debf8a66b 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateCheckerTestBase.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateCheckerTestBase.cs @@ -30,16 +30,16 @@ namespace Volo.Abp.SimpleStateChecking public DateTime? LastModificationTime { get; set; } - public List> SimpleStateCheckers { get; } + public List> StateCheckers { get; } public MyStateEntity() { - SimpleStateCheckers = new List>(); + StateCheckers = new List>(); } public MyStateEntity AddSimpleStateChecker(ISimpleStateChecker checker) { - SimpleStateCheckers.Add(checker); + StateCheckers.Add(checker); return this; } } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_GlobalCheckCount_Test.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_GlobalCheckCount_Test.cs index 89905a3123..c727238139 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_GlobalCheckCount_Test.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_GlobalCheckCount_Test.cs @@ -13,8 +13,8 @@ namespace Volo.Abp.SimpleStateChecking { services.Configure>(options => { - options.GlobalSimpleStateCheckers.Add(); - options.GlobalSimpleStateCheckers.Add(); + options.GlobalStateCheckers.Add(); + options.GlobalStateCheckers.Add(); }); base.AfterAddApplication(services); diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_Tests.cs index 536f8c3c68..06b7cf2eb7 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/SimpleStateChecking/SimpleStateChecker_Tests.cs @@ -13,8 +13,8 @@ namespace Volo.Abp.SimpleStateChecking { services.Configure>(options => { - options.GlobalSimpleStateCheckers.Add(); - options.GlobalSimpleStateCheckers.Add(); + options.GlobalStateCheckers.Add(); + options.GlobalStateCheckers.Add(); }); base.AfterAddApplication(services); From 12a7659bf7a3d15f9d80cf793bb9386260ff800c Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 5 May 2021 14:20:51 +0800 Subject: [PATCH 033/129] Rename SimpleStateCheckers to StateCheckers. --- .../PermissionManagement/TestPermissionDefinitionProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs index 86b2057239..f01961d24c 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.PermissionManagement testGroup.AddPermission("MyPermission4", multiTenancySide: MultiTenancySides.Host).WithProviders(UserPermissionValueProvider.ProviderName); - testGroup.AddPermission("MyPermission5").SimpleStateCheckers.Add(new TestRequireRolePermissionStateProvider("super-admin")); + testGroup.AddPermission("MyPermission5").StateCheckers.Add(new TestRequireRolePermissionStateProvider("super-admin")); } } } From f39543add6890b19db0cab18a0b326e5c8cfcd25 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 5 May 2021 14:46:43 +0800 Subject: [PATCH 034/129] Introduce ReplaceDbContextAttribute --- framework/Volo.Abp.sln | 7 +++ .../ReplaceDbContextAttribute.cs | 14 ++++++ .../AbpEntityFrameworkCoreModule.cs | 7 +++ .../AbpDbContextConventionalRegistrar.cs | 37 +++++++++++++++ .../AbpMongoDbConventionalRegistrar.cs | 23 ++++++++++ .../TestApp/FourthContext/FourthDbContext.cs | 17 +++++++ .../FourthDbContextDummyEntity.cs | 10 +++++ .../TestApp/FourthContext/IFourthDbContext.cs | 9 ++++ .../AbpEfCoreTestSecondContextModule.cs | 8 +++- .../AbpEntityFrameworkCoreTestModule.cs | 4 +- .../DbContext_Replace_Tests.cs | 21 +++++++-- .../EntityFrameworkCore/TestAppDbContext.cs | 13 ++++-- ...olo.Abp.MongoDB.Tests.SecondContext.csproj | 19 ++++++++ .../TestApp/FourthContext/FourthDbContext.cs | 13 ++++++ .../FourthDbContextDummyEntity.cs | 10 +++++ .../TestApp/FourthContext/IFourthDbContext.cs | 10 +++++ .../AbpMongoDbTestSecondContextModule.cs | 45 +++++++++++++++++++ .../SecondContext/BookInSecondDbContext.cs | 21 +++++++++ .../SecondContext/PhoneInSecondDbContext.cs | 18 ++++++++ .../SecondContextTestDataBuilder.cs | 30 +++++++++++++ .../TestApp/SecondContext/SecondDbContext.cs | 11 +++++ .../TestApp/ThirdDbContext/IThirdDbContext.cs | 9 ++++ .../TestApp/ThirdDbContext/ThirdDbContext.cs | 11 +++++ .../ThirdDbContextDummyEntity.cs | 10 +++++ .../Volo.Abp.MongoDB.Tests.csproj | 2 +- .../Volo/Abp/MongoDB/AbpMongoDbTestModule.cs | 13 +++--- .../Abp/MongoDB/DbContext_Replace_Tests.cs | 31 +++++++++++++ .../TestApp/MongoDb/TestAppMongoDbContext.cs | 11 ++++- 28 files changed, 415 insertions(+), 19 deletions(-) create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextConventionalRegistrar.cs create mode 100644 framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/FourthDbContext.cs create mode 100644 framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/FourthDbContextDummyEntity.cs create mode 100644 framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/IFourthDbContext.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/FourthDbContext.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/FourthDbContextDummyEntity.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/IFourthDbContext.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/AbpMongoDbTestSecondContextModule.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/BookInSecondDbContext.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/PhoneInSecondDbContext.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/SecondContextTestDataBuilder.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/SecondDbContext.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/IThirdDbContext.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/ThirdDbContext.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/ThirdDbContextDummyEntity.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DbContext_Replace_Tests.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 160918667d..b71288ab93 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -395,6 +395,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TextTemplating.Raz EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TextTemplating.Scriban.Tests", "test\Volo.Abp.TextTemplating.Scriban.Tests\Volo.Abp.TextTemplating.Scriban.Tests.csproj", "{75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.MongoDB.Tests.SecondContext", "test\Volo.Abp.MongoDB.Tests.SecondContext\Volo.Abp.MongoDB.Tests.SecondContext.csproj", "{90B1866A-EF99-40B9-970E-B898E5AA523F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1177,6 +1179,10 @@ Global {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Debug|Any CPU.Build.0 = Debug|Any CPU {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Release|Any CPU.ActiveCfg = Release|Any CPU {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Release|Any CPU.Build.0 = Release|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1376,6 +1382,7 @@ Global {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C996F458-98FB-483D-9306-4701290E2FC1} = {447C8A77-E5F0-4538-8687-7383196D04EA} {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {90B1866A-EF99-40B9-970E-B898E5AA523F} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs new file mode 100644 index 0000000000..7c3b280803 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs @@ -0,0 +1,14 @@ +using System; + +namespace Volo.Abp.DependencyInjection +{ + public class ReplaceDbContextAttribute : Attribute + { + public Type[] ReplacedDbContextTypes { get; } + + public ReplaceDbContextAttribute(params Type[] replacedDbContextTypes) + { + ReplacedDbContextTypes = replacedDbContextTypes; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs index e92c8d35fa..3d03698443 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs @@ -1,6 +1,8 @@ using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.Domain; +using Volo.Abp.EntityFrameworkCore.DependencyInjection; using Volo.Abp.Modularity; using Volo.Abp.Uow.EntityFrameworkCore; @@ -9,6 +11,11 @@ namespace Volo.Abp.EntityFrameworkCore [DependsOn(typeof(AbpDddDomainModule))] public class AbpEntityFrameworkCoreModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddConventionalRegistrar(new AbpDbContextConventionalRegistrar()); + } + public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextConventionalRegistrar.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextConventionalRegistrar.cs new file mode 100644 index 0000000000..d9d6214895 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextConventionalRegistrar.cs @@ -0,0 +1,37 @@ +using System; +using System.Reflection; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.DependencyInjection +{ + public class AbpDbContextConventionalRegistrar : DefaultConventionalRegistrar + { + public override void AddType(IServiceCollection services, Type type) + { + if (!typeof(IAbpEfCoreDbContext).IsAssignableFrom(type) || type == typeof(AbpDbContext<>)) + { + return; + } + + var replaceDbContextAttribute = type.GetCustomAttribute(true); + if (replaceDbContextAttribute == null) + { + return; + } + + foreach (var dbContextType in replaceDbContextAttribute.ReplacedDbContextTypes) + { + services.Replace( + ServiceDescriptor.Transient( + dbContextType, + sp => sp.GetRequiredService(type) + ) + ); + + services.Configure(opts => { opts.DbContextReplacements[dbContextType] = type; }); + } + } + } +} diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs index cb1ed7ea54..8e8a0e39aa 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs @@ -1,5 +1,7 @@ using System; +using System.Reflection; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.DependencyInjection; namespace Volo.Abp.MongoDB.DependencyInjection @@ -22,6 +24,27 @@ namespace Volo.Abp.MongoDB.DependencyInjection } services.Add(ServiceDescriptor.Describe(typeof(IAbpMongoDbContext), type, ServiceLifetime.Transient)); + + var replaceDbContextAttribute = type.GetCustomAttribute(true); + if (replaceDbContextAttribute == null) + { + return; + } + + foreach (var dbContextType in replaceDbContextAttribute.ReplacedDbContextTypes) + { + services.Replace( + ServiceDescriptor.Transient( + dbContextType, + sp => sp.GetRequiredService(type) + ) + ); + + services.Configure(opts => + { + opts.DbContextReplacements[dbContextType] = type; + }); + } } } } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/FourthDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/FourthDbContext.cs new file mode 100644 index 0000000000..5fa8a80367 --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/FourthDbContext.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext; + +namespace Volo.Abp.EntityFrameworkCore.TestApp.FourthContext +{ + /* This dbcontext is just for testing to replace dbcontext from the application using ReplaceDbContextAttribute + */ + public class FourthDbContext : AbpDbContext, IFourthDbContext + { + public DbSet FourthDummyEntities { get; set; } + + public FourthDbContext(DbContextOptions options) + : base(options) + { + } + } +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/FourthDbContextDummyEntity.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/FourthDbContextDummyEntity.cs new file mode 100644 index 0000000000..8043301215 --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/FourthDbContextDummyEntity.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.EntityFrameworkCore.TestApp.FourthContext +{ + public class FourthDbContextDummyEntity : AggregateRoot + { + public string Value { get; set; } + } +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/IFourthDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/IFourthDbContext.cs new file mode 100644 index 0000000000..eb2380d681 --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/FourthContext/IFourthDbContext.cs @@ -0,0 +1,9 @@ +using Microsoft.EntityFrameworkCore; + +namespace Volo.Abp.EntityFrameworkCore.TestApp.FourthContext +{ + public interface IFourthDbContext : IEfCoreDbContext + { + DbSet FourthDummyEntities { get; set; } + } +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/SecondContext/AbpEfCoreTestSecondContextModule.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/SecondContext/AbpEfCoreTestSecondContextModule.cs index 80ece93c07..e5e02efa3b 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/SecondContext/AbpEfCoreTestSecondContextModule.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo/Abp/EntityFrameworkCore/TestApp/SecondContext/AbpEfCoreTestSecondContextModule.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.EntityFrameworkCore.TestApp.FourthContext; using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -19,6 +20,11 @@ namespace Volo.Abp.EntityFrameworkCore.TestApp.SecondContext { options.AddDefaultRepositories(); }); + + context.Services.AddAbpDbContext(options => + { + options.AddDefaultRepositories(); + }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) @@ -36,4 +42,4 @@ namespace Volo.Abp.EntityFrameworkCore.TestApp.SecondContext } } } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs index a1ca2e2846..4f8faef65e 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs @@ -39,7 +39,7 @@ namespace Volo.Abp.EntityFrameworkCore { opt.DefaultWithDetailsFunc = q => q.Include(p => p.Phones); }); - + options.Entity(opt => { opt.DefaultWithDetailsFunc = q => q.Include(p => p.Books); @@ -76,7 +76,7 @@ namespace Volo.Abp.EntityFrameworkCore @"CREATE VIEW View_PersonView AS SELECT Name, CreationTime, Birthday, LastActive FROM People"); } - + return connection; } } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DbContext_Replace_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DbContext_Replace_Tests.cs index 8fd88f23fe..4e343e7331 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DbContext_Replace_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DbContext_Replace_Tests.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Shouldly; using Volo.Abp.Domain.Repositories; +using Volo.Abp.EntityFrameworkCore.TestApp.FourthContext; using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext; using Volo.Abp.TestApp.Domain; using Volo.Abp.TestApp.EntityFrameworkCore; @@ -15,13 +16,15 @@ namespace Volo.Abp.EntityFrameworkCore public class DbContext_Replace_Tests : EntityFrameworkCoreTestBase { private readonly IBasicRepository _dummyRepository; - private readonly IPersonRepository _personRepository; + private readonly IBasicRepository _fourthDummyRepository; + private readonly IPersonRepository _personRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly AbpDbContextOptions _options; public DbContext_Replace_Tests() { _dummyRepository = GetRequiredService>(); + _fourthDummyRepository = GetRequiredService>(); _personRepository = GetRequiredService(); _unitOfWorkManager = GetRequiredService(); _options = GetRequiredService>().Value; @@ -31,8 +34,10 @@ namespace Volo.Abp.EntityFrameworkCore public async Task Should_Replace_DbContext() { _options.GetReplacedTypeOrSelf(typeof(IThirdDbContext)).ShouldBe(typeof(TestAppDbContext)); - + _options.GetReplacedTypeOrSelf(typeof(IFourthDbContext)).ShouldBe(typeof(TestAppDbContext)); + (ServiceProvider.GetRequiredService() is TestAppDbContext).ShouldBeTrue(); + (ServiceProvider.GetRequiredService() is TestAppDbContext).ShouldBeTrue(); using (var uow = _unitOfWorkManager.Begin()) { @@ -44,11 +49,19 @@ namespace Volo.Abp.EntityFrameworkCore var instance3 = await _personRepository.GetDbContextAsync(); (instance3 is TestAppDbContext).ShouldBeTrue(); - + + var instance4 = await _fourthDummyRepository.GetDbContextAsync(); + (instance4 is IFourthDbContext).ShouldBeTrue(); + + var instance5 = await _fourthDummyRepository.GetDbContextAsync(); + (instance5 is TestAppDbContext).ShouldBeTrue(); + // All instances should be the same! instance3.ShouldBe(instance1); instance3.ShouldBe(instance2); - + instance3.ShouldBe(instance4); + instance3.ShouldBe(instance5); + await uow.CompleteAsync(); } } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs index da8bbc8a6c..cd8bb75b78 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs @@ -1,12 +1,17 @@ using Microsoft.EntityFrameworkCore; +using Volo.Abp.DependencyInjection; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.TestApp.FourthContext; using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext; using Volo.Abp.TestApp.Domain; namespace Volo.Abp.TestApp.EntityFrameworkCore { - public class TestAppDbContext : AbpDbContext, IThirdDbContext + [ReplaceDbContext(typeof(IFourthDbContext))] + public class TestAppDbContext : AbpDbContext, IThirdDbContext, IFourthDbContext { + private DbSet _dummyEntities; + private DbSet _dummyEntities1; public DbSet People { get; set; } public DbSet Cities { get; set; } @@ -16,10 +21,12 @@ namespace Volo.Abp.TestApp.EntityFrameworkCore public DbSet DummyEntities { get; set; } public DbSet EntityWithIntPks { get; set; } - + public DbSet Author { get; set; } - public TestAppDbContext(DbContextOptions options) + public DbSet FourthDummyEntities { get; set; } + + public TestAppDbContext(DbContextOptions options) : base(options) { diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj new file mode 100644 index 0000000000..e779329ad7 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj @@ -0,0 +1,19 @@ + + + + + + net5.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + true + true + true + true + + + + + + + + diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/FourthDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/FourthDbContext.cs new file mode 100644 index 0000000000..7b496f954f --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/FourthDbContext.cs @@ -0,0 +1,13 @@ +using MongoDB.Driver; +using Volo.Abp.EntityFrameworkCore.TestApp.FourthContext; + +namespace Volo.Abp.MongoDB.TestApp.FourthContext +{ + /* This dbcontext is just for testing to replace dbcontext from the application using ReplaceDbContextAttribute + */ + public class FourthDbContext : AbpMongoDbContext, IFourthDbContext + { + public IMongoCollection FourthDummyEntities => Collection(); + + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/FourthDbContextDummyEntity.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/FourthDbContextDummyEntity.cs new file mode 100644 index 0000000000..8043301215 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/FourthDbContextDummyEntity.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.EntityFrameworkCore.TestApp.FourthContext +{ + public class FourthDbContextDummyEntity : AggregateRoot + { + public string Value { get; set; } + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/IFourthDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/IFourthDbContext.cs new file mode 100644 index 0000000000..ae9ee2f281 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/FourthContext/IFourthDbContext.cs @@ -0,0 +1,10 @@ +using MongoDB.Driver; +using Volo.Abp.EntityFrameworkCore.TestApp.FourthContext; + +namespace Volo.Abp.MongoDB.TestApp.FourthContext +{ + public interface IFourthDbContext : IAbpMongoDbContext + { + IMongoCollection FourthDummyEntities { get;} + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/AbpMongoDbTestSecondContextModule.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/AbpMongoDbTestSecondContextModule.cs new file mode 100644 index 0000000000..ba5eaf7f79 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/AbpMongoDbTestSecondContextModule.cs @@ -0,0 +1,45 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; +using Volo.Abp.MongoDB.TestApp.FourthContext; +using Volo.Abp.MongoDB.TestApp.ThirdDbContext; +using Volo.Abp.Threading; + +namespace Volo.Abp.MongoDB.TestApp.SecondContext +{ + [DependsOn(typeof(AbpMongoDbModule))] + public class AbpMongoDbTestSecondContextModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddMongoDbContext(options => + { + options.AddDefaultRepositories(); + }); + + context.Services.AddMongoDbContext(options => + { + options.AddDefaultRepositories(); + }); + + context.Services.AddMongoDbContext(options => + { + options.AddDefaultRepositories(); + }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + SeedTestData(context); + } + + private static void SeedTestData(ApplicationInitializationContext context) + { + using (var scope = context.ServiceProvider.CreateScope()) + { + AsyncHelper.RunSync(() => scope.ServiceProvider + .GetRequiredService() + .BuildAsync()); + } + } + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/BookInSecondDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/BookInSecondDbContext.cs new file mode 100644 index 0000000000..d7e81f4258 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/BookInSecondDbContext.cs @@ -0,0 +1,21 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.MongoDB.TestApp.SecondContext +{ + public class BookInSecondDbContext : AggregateRoot + { + public string Name { get; set; } + + public BookInSecondDbContext() + { + + } + + public BookInSecondDbContext(Guid id, string name) + : base(id) + { + Name = name; + } + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/PhoneInSecondDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/PhoneInSecondDbContext.cs new file mode 100644 index 0000000000..d808d5a52a --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/PhoneInSecondDbContext.cs @@ -0,0 +1,18 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.MongoDB.TestApp.SecondContext +{ + public class PhoneInSecondDbContext : AggregateRoot + { + public virtual Guid PersonId { get; set; } + + public virtual string Number { get; set; } + + public override object[] GetKeys() + { + return new object[] {PersonId, Number}; + } + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/SecondContextTestDataBuilder.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/SecondContextTestDataBuilder.cs new file mode 100644 index 0000000000..c3fb902c64 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/SecondContextTestDataBuilder.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Guids; + +namespace Volo.Abp.MongoDB.TestApp.SecondContext +{ + public class SecondContextTestDataBuilder : ITransientDependency + { + private readonly IBasicRepository _bookRepository; + private readonly IGuidGenerator _guidGenerator; + + public SecondContextTestDataBuilder(IBasicRepository bookRepository, IGuidGenerator guidGenerator) + { + _bookRepository = bookRepository; + _guidGenerator = guidGenerator; + } + + public async Task BuildAsync() + { + await _bookRepository.InsertAsync( + new BookInSecondDbContext( + _guidGenerator.Create(), + "TestBook1" + ) + ); + } + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/SecondDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/SecondDbContext.cs new file mode 100644 index 0000000000..2df5785b20 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/SecondContext/SecondDbContext.cs @@ -0,0 +1,11 @@ +using MongoDB.Driver; + +namespace Volo.Abp.MongoDB.TestApp.SecondContext +{ + public class SecondDbContext : AbpMongoDbContext + { + public IMongoCollection Books => Collection(); + + public IMongoCollection Phones => Collection(); + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/IThirdDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/IThirdDbContext.cs new file mode 100644 index 0000000000..cfe629b5a7 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/IThirdDbContext.cs @@ -0,0 +1,9 @@ +using MongoDB.Driver; + +namespace Volo.Abp.MongoDB.TestApp.ThirdDbContext +{ + public interface IThirdDbContext : IAbpMongoDbContext + { + IMongoCollection DummyEntities { get; } + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/ThirdDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/ThirdDbContext.cs new file mode 100644 index 0000000000..c3b018a699 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/ThirdDbContext.cs @@ -0,0 +1,11 @@ +using MongoDB.Driver; + +namespace Volo.Abp.MongoDB.TestApp.ThirdDbContext +{ + /* This dbcontext is just for testing to replace dbcontext from the application using AbpDbContextRegistrationOptions.ReplaceDbContext + */ + public class ThirdDbContext : AbpMongoDbContext, IThirdDbContext + { + public IMongoCollection DummyEntities => Collection(); + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/ThirdDbContextDummyEntity.cs b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/ThirdDbContextDummyEntity.cs new file mode 100644 index 0000000000..a784406ff5 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests.SecondContext/Volo/Abp/MongoDB/TestApp/ThirdDbContext/ThirdDbContextDummyEntity.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.MongoDB.TestApp.ThirdDbContext +{ + public class ThirdDbContextDummyEntity : AggregateRoot + { + public string Value { get; set; } + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj b/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj index c36fbb799c..21bcac616e 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj @@ -9,8 +9,8 @@ - + diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs index e580c6fce6..100011560e 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs @@ -1,21 +1,18 @@ using System; -using System.Linq; -using System.Threading; using Microsoft.Extensions.DependencyInjection; -using MongoDB.Driver; -using MongoDB.Driver.Core.Servers; using Volo.Abp.Data; using Volo.Abp.Modularity; +using Volo.Abp.MongoDB.TestApp.SecondContext; +using Volo.Abp.MongoDB.TestApp.ThirdDbContext; using Volo.Abp.TestApp; using Volo.Abp.TestApp.Domain; using Volo.Abp.TestApp.MongoDB; -using Volo.Abp.Uow; namespace Volo.Abp.MongoDB { [DependsOn( - typeof(AbpMongoDbModule), - typeof(TestAppModule) + typeof(TestAppModule), + typeof(AbpMongoDbTestSecondContextModule) )] public class AbpMongoDbTestModule : AbpModule { @@ -35,6 +32,8 @@ namespace Volo.Abp.MongoDB { options.AddDefaultRepositories(); options.AddRepository(); + + options.ReplaceDbContext(); }); } } diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DbContext_Replace_Tests.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DbContext_Replace_Tests.cs new file mode 100644 index 0000000000..eefa6852bf --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DbContext_Replace_Tests.cs @@ -0,0 +1,31 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Shouldly; +using Volo.Abp.MongoDB.TestApp.FourthContext; +using Volo.Abp.MongoDB.TestApp.ThirdDbContext; +using Volo.Abp.TestApp.MongoDB; +using Xunit; + +namespace Volo.Abp.MongoDB +{ + [Collection(MongoTestCollection.Name)] + public class DbContext_Replace_Tests : MongoDbTestBase + { + private readonly AbpMongoDbContextOptions _options; + + public DbContext_Replace_Tests() + { + _options = GetRequiredService>().Value; + } + + [Fact] + public void Should_Replace_DbContext() + { + _options.GetReplacedTypeOrSelf(typeof(IThirdDbContext)).ShouldBe(typeof(TestAppMongoDbContext)); + _options.GetReplacedTypeOrSelf(typeof(IFourthDbContext)).ShouldBe(typeof(TestAppMongoDbContext)); + + (ServiceProvider.GetRequiredService() is TestAppMongoDbContext).ShouldBeTrue(); + (ServiceProvider.GetRequiredService() is TestAppMongoDbContext).ShouldBeTrue(); + } + } +} diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/TestAppMongoDbContext.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/TestAppMongoDbContext.cs index eed8d4ade3..68a2856e01 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/TestAppMongoDbContext.cs +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/TestApp/MongoDb/TestAppMongoDbContext.cs @@ -1,12 +1,17 @@ using MongoDB.Driver; using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EntityFrameworkCore.TestApp.FourthContext; using Volo.Abp.MongoDB; +using Volo.Abp.MongoDB.TestApp.FourthContext; +using Volo.Abp.MongoDB.TestApp.ThirdDbContext; using Volo.Abp.TestApp.Domain; namespace Volo.Abp.TestApp.MongoDB { [ConnectionStringName("TestApp")] - public class TestAppMongoDbContext : AbpMongoDbContext, ITestAppMongoDbContext + [ReplaceDbContext(typeof(IFourthDbContext))] + public class TestAppMongoDbContext : AbpMongoDbContext, ITestAppMongoDbContext, IThirdDbContext, IFourthDbContext { [MongoCollection("Persons")] //Intentionally changed the collection name to test it public IMongoCollection People => Collection(); @@ -15,6 +20,10 @@ namespace Volo.Abp.TestApp.MongoDB public IMongoCollection Cities => Collection(); + public IMongoCollection DummyEntities => Collection(); + + public IMongoCollection FourthDummyEntities => Collection(); + protected internal override void CreateModel(IMongoModelBuilder modelBuilder) { base.CreateModel(modelBuilder); From 6bd06f6f678093da1faa62068889a100c953b725 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 5 May 2021 15:08:52 +0800 Subject: [PATCH 035/129] Update document --- docs/en/Entity-Framework-Core.md | 14 +++++++++++++- docs/en/MongoDB.md | 14 +++++++++++++- docs/zh-Hans/Entity-Framework-Core.md | 14 +++++++++++++- docs/zh-Hans/MongoDB.md | 14 +++++++++++++- 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/docs/en/Entity-Framework-Core.md b/docs/en/Entity-Framework-Core.md index a2c0e79996..aced8d406d 100644 --- a/docs/en/Entity-Framework-Core.md +++ b/docs/en/Entity-Framework-Core.md @@ -706,7 +706,19 @@ One advantage of using an interface for a DbContext is then it will be replaceab ### Replace Other DbContextes -Once you properly define and use an interface for DbContext, then any other implementation can replace it using the `ReplaceDbContext` option: +Once you properly define and use an interface for DbContext, then any other implementation can use the following ways to replace it: + +**ReplaceDbContextAttribute** + +```csharp +[ReplaceDbContext(typeof(IBookStoreDbContext))] +public class OtherDbContext : AbpDbContext, IBookStoreDbContext +{ + //... +} +``` + +**ReplaceDbContext option** ````csharp context.Services.AddAbpDbContext(options => diff --git a/docs/en/MongoDB.md b/docs/en/MongoDB.md index a12d216b3d..ae8f5c82d1 100644 --- a/docs/en/MongoDB.md +++ b/docs/en/MongoDB.md @@ -373,7 +373,19 @@ One advantage of using interface for a MongoDbContext is then it becomes replace #### Replace Other DbContextes -Once you properly define and use an interface for a MongoDbContext , then any other implementation can replace it using the `ReplaceDbContext` option: +Once you properly define and use an interface for a MongoDbContext , then any other implementation can use the following ways to replace it: + +**ReplaceDbContextAttribute** + +```csharp +[ReplaceDbContext(typeof(IBookStoreMongoDbContext))] +public class OtherMongoDbContext : AbpMongoDbContext, IBookStoreMongoDbContext +{ + //... +} +``` + +**ReplaceDbContext option** ```csharp context.Services.AddMongoDbContext(options => diff --git a/docs/zh-Hans/Entity-Framework-Core.md b/docs/zh-Hans/Entity-Framework-Core.md index b5252b86c0..4139407f04 100644 --- a/docs/zh-Hans/Entity-Framework-Core.md +++ b/docs/zh-Hans/Entity-Framework-Core.md @@ -433,7 +433,19 @@ public class BookRepository : EfCoreRepository, ### 替换其他仓储 -正确定义并使用DbContext接口后,任何其他实现都可以使用以下ReplaceDbContext options 替换它: +正确定义并使用DbContext接口后,任何其他实现都可以使用以下方法替换它: + +**ReplaceDbContextAttribute** + +```csharp +[ReplaceDbContext(typeof(IBookStoreDbContext))] +public class OtherDbContext : AbpDbContext, IBookStoreDbContext +{ + //... +} +``` + +**ReplaceDbContext option** ````csharp context.Services.AddAbpDbContext(options => diff --git a/docs/zh-Hans/MongoDB.md b/docs/zh-Hans/MongoDB.md index af63642a41..87c99d3207 100644 --- a/docs/zh-Hans/MongoDB.md +++ b/docs/zh-Hans/MongoDB.md @@ -329,7 +329,19 @@ public class BookRepository ##### 替换其他的DbContexts -一旦你正确定义并为MongoDbContext使用了接口,其他的实现就可以使用`ReplaceDbContext`来替换: +一旦你正确定义并为MongoDbContext使用了接口,任何其他实现都可以使用以下方法替换它: + +**ReplaceDbContextAttribute** + +```csharp +[ReplaceDbContext(typeof(IBookStoreMongoDbContext))] +public class OtherMongoDbContext : AbpMongoDbContext, IBookStoreMongoDbContext +{ + //... +} +``` + +**ReplaceDbContext option** ```csharp context.Services.AddMongoDbContext(options => From adc3097dd7a91c897fb53155ed8a880cc2db0257 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 5 May 2021 16:22:53 +0800 Subject: [PATCH 036/129] Update ReplaceDbContextAttribute --- .../Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs index 7c3b280803..708d3ff470 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/ReplaceDbContextAttribute.cs @@ -2,6 +2,7 @@ namespace Volo.Abp.DependencyInjection { + [AttributeUsage(AttributeTargets.Class)] public class ReplaceDbContextAttribute : Attribute { public Type[] ReplacedDbContextTypes { get; } From b0e95169ea8e3911409cb50e5995be5116f9927b Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 5 May 2021 20:05:57 +0800 Subject: [PATCH 037/129] Add Simple State Checker document. Resolve #8895 --- docs/en/Authorization.md | 32 +----- docs/en/SimpleStateChecker.md | 125 +++++++++++++++++++++++ docs/en/UI/AspNetCore/Navigation-Menu.md | 19 ++-- docs/en/UI/AspNetCore/Toolbars.md | 4 +- docs/en/docs-nav.json | 4 + 5 files changed, 141 insertions(+), 43 deletions(-) create mode 100644 docs/en/SimpleStateChecker.md diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index 2632f3c88a..73ee36af8f 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -265,37 +265,7 @@ myGroup.AddPermission("Book_Creation") #### Creating a Custom Permission Dependency -Any class implements the `IPermissionStateProvider` interface can disable a permission based on a custom condition. - -**Example:** - -````csharp -public class MyCustomPermissionStateProvider : IPermissionStateProvider -{ - public Task IsEnabledAsync(PermissionStateContext context) - { - // You can implement your own logic here. - return Task.FromResult( - context.Permission.Name.StartsWith("Acme.BookStore")); - } -} -```` - -Then you can add `MyCustomPermissionStateProvider` to any permission definition, using the `AddStateProviders` extension method: - -````csharp -myGroup.AddPermission("Book_Creation") - .AddStateProviders(new MyCustomPermissionStateProvider()); -```` - -Or you can globally add your custom provider to make it working for all permissions: - -````csharp -Configure(options => -{ - options.GlobalStateProviders.Add(); -}); -```` +`PermissionDefinition` supports state check, Please refer to [Simple State Checker's documentation](SimpleStateChecker.md) ## IAuthorizationService diff --git a/docs/en/SimpleStateChecker.md b/docs/en/SimpleStateChecker.md new file mode 100644 index 0000000000..077f2be477 --- /dev/null +++ b/docs/en/SimpleStateChecker.md @@ -0,0 +1,125 @@ +# Simple State Checker + +The **state** of some objects may depend on multiple conditions, such as some permissions are required, features need to be enabled, or it is only for special users and roles are available. + +## Definition state checker. + +Any class can inherit `IHasSimpleStateCheckers` to support state checks. + +````csharp +public class MyObject : IHasSimpleStateCheckers +{ + public int Id { get; set; } + + public List> SimpleStateCheckers { get; } + + public MyObject() + { + SimpleStateCheckers = new List>(); + } +} +```` + +The `MyObject` class contains a collection of state checkers, you can add your custom checkers to it. + +````csharp +public class MyObjectStateChecker : ISimpleStateChecker +{ + public Task IsEnabledAsync(SimpleStateCheckerContext context) + { + var currentUser = context.ServiceProvider.GetRequiredService(); + return Task.FromResult(currentUser.IsInRole("Admin")); + } +} +```` + +````csharp +var myobj = new MyObject() +{ + Id = 100 +}; + +myobj.SimpleStateCheckers.Add(new MyObjectStateChecker()); +```` + +## Definition global state checker. + +`AbpSimpleStateCheckerOptions` is the options class that used to set the global state checkers for specific object. + +Example: Add global state for `MyObject`: + +````csharp +services.Configure>(options => +{ + options.GlobalSimpleStateCheckers.Add(); + //options.GlobalSimpleStateCheckers.Add<>(); //Add more global state checkers +}); +```` + +> Write this inside the `ConfigureServices` method of your module. + +### Check the state + +You can inject `ISimpleStateCheckerManager` service to check state. + +````csharp +bool enabled = await stateCheckerManager.IsEnabledAsync(myobj); +```` + +### Batch check the states + +If there are many instance items that require state checking, there may be performance problems. + +In this case, you can implement `ISimpleBatchStateChecker`. It can check multiple items at once. +You need to make sure that the same `ISimpleBatchStateChecker` instance is added to the `SimpleStateCheckers` of multiple instances. + +> `SimpleBatchStateCheckerBase` inherits the `ISimpleBatchStateChecker` interface and implements the `IsEnabledAsync` method of a single object by default. + +````csharp +public class MyObjectBatchStateChecker : SimpleBatchStateCheckerBase +{ + public override Task> IsEnabledAsync(SimpleBatchStateCheckerContext context) + { + var result = new SimpleStateCheckerResult(context.States); + + foreach (var myObject in context.States) + { + if (myObject.Id > 100) + { + result[myObject] = true; + } + } + + return Task.FromResult(result); + } +} +```` + +````csharp +var myobj1 = new MyObject() +{ + Id = 100 +}; +var myobj2 = new MyObject() +{ + Id = 99 +}; + +var myObjectBatchStateChecker = new MyObjectBatchStateChecker(); + +myobj1.SimpleStateCheckers.Add(myObjectBatchStateChecker); +myobj2.SimpleStateCheckers.Add(myObjectBatchStateChecker); + +SimpleStateCheckerResult stateCheckerResult = await stateCheckerManager.IsEnabledAsync(new []{ myobj1, myobj2 }); +```` + +## Built-in state checker + +The `PermissionDefinition`, `ApplicationMenuItem` and `ToolbarItem` objects have implemented state checks and have built-in general state checkers, you can directly use their extension methods. + +````csharp +RequireAuthenticated(); +RequirePermissions(bool requiresAll, params string[] permissions); +RequireFeatures(bool requiresAll, params string[] features); +RequireGlobalFeatures(bool requiresAll, params Type[] globalFeatures); +```` \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/Navigation-Menu.md b/docs/en/UI/AspNetCore/Navigation-Menu.md index 8480590f50..97e3d1a47d 100644 --- a/docs/en/UI/AspNetCore/Navigation-Menu.md +++ b/docs/en/UI/AspNetCore/Navigation-Menu.md @@ -104,7 +104,6 @@ There are more options of a menu item (the constructor of the `ApplicationMenuIt * `target` (`string`): Target of the menu item. Can be `null` (default), "\_*blank*", "\_*self*", "\_*parent*", "\_*top*" or a frame name for web applications. * `elementId` (`string`): Can be used to render the element with a specific HTML `id` attribute. * `cssClass` (`string`): Additional string classes for the menu item. -* `RequiredPermissionName` (`string`): The required permission name, this menu item will be removed if this permission is not granted. ### Authorization @@ -121,21 +120,21 @@ if (await context.IsGrantedAsync("MyPermissionName")) } ```` -For the authorization, you can use `RequiredPermissionName` as a shortcut. It is also more performant, ABP optimizes the permission check for all the items. +For the authorization, you can use `RequirePermissions` extension method as a shortcut. It is also more performant, ABP optimizes the permission check for all the items. ````csharp context.Menu.AddItem( new ApplicationMenuItem("MyProject.Crm", l["Menu:CRM"]) .AddItem(new ApplicationMenuItem( - name: "MyProject.Crm.Customers", - displayName: l["Menu:Customers"], - url: "/crm/customers", - requiredPermissionName: "MyProject.Crm.Customers") + name: "MyProject.Crm.Customers", + displayName: l["Menu:Customers"], + url: "/crm/customers") + .RequirePermissions("MyProject.Crm.Customers") ).AddItem(new ApplicationMenuItem( - name: "MyProject.Crm.Orders", - displayName: l["Menu:Orders"], - url: "/crm/orders", - requiredPermissionName: "MyProject.Crm.Orders") + name: "MyProject.Crm.Orders", + displayName: l["Menu:Orders"], + url: "/crm/orders") + .RequirePermissions("MyProject.Crm.Orders") ) ); ```` diff --git a/docs/en/UI/AspNetCore/Toolbars.md b/docs/en/UI/AspNetCore/Toolbars.md index 66ec7519b8..d82150b47e 100644 --- a/docs/en/UI/AspNetCore/Toolbars.md +++ b/docs/en/UI/AspNetCore/Toolbars.md @@ -61,10 +61,10 @@ if (await context.IsGrantedAsync("MyPermissionName")) } ```` -You can use `RequiredPermissionName` as a shortcut. It is also more performant, ABP optimizes the permission check for all the items. +You can use `RequirePermissions` extension method as a shortcut. It is also more performant, ABP optimizes the permission check for all the items. ````csharp -context.Toolbar.Items.Insert(0, new ToolbarItem(typeof(NotificationViewComponent), requiredPermissionName: "MyPermissionName")); +context.Toolbar.Items.Insert(0, new ToolbarItem(typeof(NotificationViewComponent)).RequirePermissions("MyPermissionName")); ```` This class adds the `NotificationViewComponent` as the first item in the `Main` toolbar. diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 0a7722de78..9a1bad449e 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -379,6 +379,10 @@ { "text": "Cancellation Token Provider", "path": "Cancellation-Token-Provider.md" + }, + { + "text": "Simple State Checker", + "path": "SimpleStateChecker.md" } ] }, From 7e52a7ac146928644aa62ea076244850528dc01a Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Wed, 5 May 2021 18:20:50 +0300 Subject: [PATCH 038/129] order values by their keys. --- .../Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs index d54ee7104a..237953db4a 100644 --- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs +++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs @@ -2,6 +2,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; +using System.Linq; using JetBrains.Annotations; using Volo.Abp.Data; @@ -68,7 +69,9 @@ namespace Volo.Abp.ObjectExtending [NotNull] public virtual ImmutableList GetProperties() { - return Properties.Values.ToImmutableList(); + return Properties.OrderBy(t=>t.Key) + .Select(t=>t.Value) + .ToImmutableList(); } [CanBeNull] From 292dcf239d2a2aa0b0fd84273060678f6ed8a1f7 Mon Sep 17 00:00:00 2001 From: Ilkay Ilknur Date: Thu, 6 May 2021 17:37:58 +0300 Subject: [PATCH 039/129] CMS Kit Introduction post added. --- docs/en/Blog-Posts/2021-04-05 CmsKit/POST.md | 86 +++++++++++++++++- .../2021-04-05 CmsKit/cms-kit-menu.png | Bin 0 -> 161516 bytes 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 docs/en/Blog-Posts/2021-04-05 CmsKit/cms-kit-menu.png diff --git a/docs/en/Blog-Posts/2021-04-05 CmsKit/POST.md b/docs/en/Blog-Posts/2021-04-05 CmsKit/POST.md index ad8b89faa0..740adb96c7 100644 --- a/docs/en/Blog-Posts/2021-04-05 CmsKit/POST.md +++ b/docs/en/Blog-Posts/2021-04-05 CmsKit/POST.md @@ -1,3 +1,85 @@ -# Introducing the CMS Kit Module for the ABP Framework +# Introducing The CMS-Kit Module + +One of the most exciting announcements of the ABP Framework 4.3 release was releasing the initial version of the CMS Kit module. The team had been working hard to release the initial version for months. For those who didn't read the [ABP Framework 4.3 release post](https://blog.abp.io/abp/ABP-Framework-4.3-RC-Has-Been-Published), the CMS Kit module adds CMS(Content Management System) capabilities to your application. Some of the CMS Kit features are open source and free, while others are only included in the Pro version included in the ABP Commercial. + +List of free and pro features in the CMS Kit module; + +- Free + - Page System: Provides a **page** management system to manage dynamic pages. + - Blog System: Provides a **blog** system to create blogs and publish posts. + - Tag System: Provides a **tag** system to tag any kind of resources, such as blog posts. + - Comment System: Provides a **comment** system to add comments feature to any type of resource, such as blog posts, products, etc. + - Reaction System: Provides a **reaction** system to add reactions to any type of resource, such as blog posts or comments, etc. + - Rating System: Provides a **rating** system to add ratings feature to any type of resource, such as comments, products, etc. +- Pro + - Newsletter System: Provides a **newsletter** system to allow users to subscribe to newsletters. + - Contact Form System: Provides a **contact form** system to allow users to write a message to you on public websites. + +## Installation + +CMS Kit module comes installed with commercial templates when you create the solution with the public website option. You can run the following command and create a solution with a public website. + +```bash +abp new Acme --with-public-website +``` + +If you're using the open-source version or adding the module to an existing project, the ABP CLI allows adding a module to a solution using `add-module` command. + +You can run the following command to add the module to an open-source solution. + +```bash +abp add-module Volo.CmsKit +``` + +If you're a commercial user, run the following command to install the pro version of the module. + +```bash +abp add-module Volo.CmsKit.Pro +``` + +After adding the module to the solution, you need to configure features. The CMS Kit module uses the [global feature](https://docs.abp.io/en/abp/latest/Global-Features) system for all features. To enable the features in the CMS Kit module, open the `GlobalFeatureConfigurator` class in the `Domain.Shared` project and place the following code to the `Configure` method to enable all features in the CMS kit module. + + ```csharp +GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => +{ + cmsKit.EnableAll(); +}); + ``` + +If you're a commercial user, you need to enable CMS Kit Pro features as well. + +```csharp +GlobalFeatureManager.Instance.Modules.CmsKitPro(cmsKitPro => +{ + cmsKitPro.EnableAll(); +}); +``` + +> If you are using Entity Framework Core, do not forget to add a new migration and update your database after configuring the features. + +We've completed the installation step. Run the project, and you will see the CMS menu item in the menu. + +![cms-kit-menu](cms-kit-menu.png) + +> CMS Kit's initial release only supports the MVC UI. We're planning to add Angular and Blazor support in upcoming releases. + +## Package Structures + +CMS Kit is designed for various usage scenarios. When you visit [nuget.org](https://www.nuget.org/packages?q=Volo.CmsKit) or [abp.io](https://abp.io/packages?moduleName=Volo.CmsKit.Pro) to see the available CMS Kit packages, you will find out that packages have admin, public and unified versions. + +For example, + + - `Volo.CmsKit.Admin.Application`: Contains functionality required by admin websites. + - `Volo.CmsKit.Public.Application`: Contains functionality required by public websites. + - `Volo.CmsKit.Application` : Unified package dependent on both public and admin packages. + + If you want to separate admin and public website codes, you can use the admin and public packages. However, if you want to keep admin and public website codes in a shared project, you can use the unified packages to include admin and public packages. + +> It is recommended to use the unified packages instead of adding both admin and public packages. + + + +We've covered the initial features, installation and configuration steps in this post. You can read the [open-source](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit) and [commercial](https://docs.abp.io/en/commercial/latest/modules/CMS-Kit) documentation to get further information about features and the CMS Kit module. CMS Kit's initial version contains lots of features that you can easily integrate and use in your applications. We're planning to improve the existing features, fixing bugs and adding new features in upcoming releases. If you want to give some feedback or have a feature request, please reach out to us from [GitHub](https://github.com/abpframework/abp) or [support.abp.io](https://support.abp.io). We will be happy to plan the CMS Kit module's future together. + +Thank you! -TODO... \ No newline at end of file diff --git a/docs/en/Blog-Posts/2021-04-05 CmsKit/cms-kit-menu.png b/docs/en/Blog-Posts/2021-04-05 CmsKit/cms-kit-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..3f187c9a9d62543cad5bc72ce538539fda45e36a GIT binary patch literal 161516 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 z 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ðFf@7f_ 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

( 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 Date: Thu, 6 May 2021 23:12:54 +0300 Subject: [PATCH 040/129] Update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3c5c4f89da..2f820efc4d 100644 --- a/.gitignore +++ b/.gitignore @@ -310,4 +310,7 @@ abp-build-config.json /templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Test/ # Identity Server temp signature file -tempkey.jwk \ No newline at end of file +tempkey.jwk + +# ABP Analyzing files +*.abppkg.analyze.json \ No newline at end of file From ce89faebf9270c306bfa7ce92953a34de8e8dc9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 6 May 2021 23:26:22 +0300 Subject: [PATCH 041/129] Allow to globally disable class interceptors. --- .../AbpRegistrationBuilderExtensions.cs | 22 ++++++++++++++----- ...eCollectionRegistrationActionExtensions.cs | 10 +++++++++ .../ServiceRegistrationActionList.cs | 2 +- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs b/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs index 96caf956b1..776a8b9a7a 100644 --- a/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs @@ -35,7 +35,11 @@ namespace Autofac.Builder return registrationBuilder; } - private static IRegistrationBuilder InvokeRegistrationActions(this IRegistrationBuilder registrationBuilder, ServiceRegistrationActionList registrationActionList, Type serviceType, Type implementationType) + private static IRegistrationBuilder InvokeRegistrationActions( + this IRegistrationBuilder registrationBuilder, + ServiceRegistrationActionList registrationActionList, + Type serviceType, + Type implementationType) where TActivatorData : ReflectionActivatorData { var serviceRegistredArgs = new OnServiceRegistredContext(serviceType, implementationType); @@ -48,6 +52,7 @@ namespace Autofac.Builder if (serviceRegistredArgs.Interceptors.Any()) { registrationBuilder = registrationBuilder.AddInterceptors( + registrationActionList, serviceType, serviceRegistredArgs.Interceptors ); @@ -71,10 +76,12 @@ namespace Autofac.Builder return registrationBuilder; } - private static IRegistrationBuilder AddInterceptors( - this IRegistrationBuilder registrationBuilder, - Type serviceType, - IEnumerable interceptors) + private static IRegistrationBuilder + AddInterceptors( + this IRegistrationBuilder registrationBuilder, + ServiceRegistrationActionList serviceRegistrationActionList, + Type serviceType, + IEnumerable interceptors) where TActivatorData : ReflectionActivatorData { if (serviceType.IsInterface) @@ -83,6 +90,11 @@ namespace Autofac.Builder } else { + if (serviceRegistrationActionList.IsClassInterceptorsDisabled) + { + return registrationBuilder; + } + (registrationBuilder as IRegistrationBuilder)?.EnableClassInterceptors(); } diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionRegistrationActionExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionRegistrationActionExtensions.cs index 59cbdec860..41676f00d5 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionRegistrationActionExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionRegistrationActionExtensions.cs @@ -28,6 +28,16 @@ namespace Microsoft.Extensions.DependencyInjection return actionList; } + + public static void DisableAbpClassInterceptors(this IServiceCollection services) + { + GetOrCreateRegistrationActionList(services).IsClassInterceptorsDisabled = true; + } + + public static bool IsAbpClassInterceptorsDisabled(this IServiceCollection services) + { + return GetOrCreateRegistrationActionList(services).IsClassInterceptorsDisabled; + } // OnExposing diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ServiceRegistrationActionList.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ServiceRegistrationActionList.cs index bb72d28929..19ab6cdba2 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ServiceRegistrationActionList.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ServiceRegistrationActionList.cs @@ -5,6 +5,6 @@ namespace Volo.Abp.DependencyInjection { public class ServiceRegistrationActionList : List> { - + public bool IsClassInterceptorsDisabled { get; set; } } } \ No newline at end of file From 9d90f16e160a9fc0328f2bad2648d9e4f4fa7d62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 7 May 2021 02:15:45 +0300 Subject: [PATCH 042/129] abp batch command should handle spaces and quotes in arguments. --- .../Abp/Cli/Args/CommandLineArgumentParser.cs | 47 +++++++++++++++++++ .../Cli/Args/ICommandLineArgumentParser.cs | 2 + .../Volo/Abp/Cli/CliService.cs | 6 ++- .../Cli/CommandLineArgumentParser_Tests.cs | 21 +++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/CommandLineArgumentParser.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/CommandLineArgumentParser.cs index 1dd29e5df7..b7cd95a3e0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/CommandLineArgumentParser.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/CommandLineArgumentParser.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.Args @@ -71,6 +72,11 @@ namespace Volo.Abp.Cli.Args return commandLineArgs; } + public CommandLineArgs Parse(string lineText) + { + return Parse(GetArgsArrayFromLine(lineText)); + } + private static bool IsOptionName(string argument) { return argument.StartsWith("-") || argument.StartsWith("--"); @@ -100,5 +106,46 @@ namespace Volo.Abp.Cli.Args throw new ArgumentException("Option names should start with '-' or '--'."); } + + private static string[] GetArgsArrayFromLine(string lineText) + { + var args = new List(); + var currentArgBuilder = new StringBuilder(); + string currentArg = null; + bool isInQuotes = false; + for (int i = 0; i < lineText.Length; i++) + { + var c = lineText[i]; + if (c == ' ' && !isInQuotes) + { + currentArg = currentArgBuilder.ToString(); + if (!currentArg.IsNullOrWhiteSpace()) + { + args.Add(currentArg); + } + + currentArgBuilder = new StringBuilder(); + } + else + { + if (c == '\"') + { + isInQuotes = !isInQuotes; + } + else + { + currentArgBuilder.Append(c); + } + } + } + + currentArg = currentArgBuilder.ToString(); + if (!currentArg.IsNullOrWhiteSpace()) + { + args.Add(currentArg); + } + + return args.ToArray(); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/ICommandLineArgumentParser.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/ICommandLineArgumentParser.cs index c467541210..4e8ee7cd77 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/ICommandLineArgumentParser.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/ICommandLineArgumentParser.cs @@ -3,5 +3,7 @@ public interface ICommandLineArgumentParser { CommandLineArgs Parse(string[] args); + + CommandLineArgs Parse(string lineText); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs index a847881d60..cfae12c76e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs @@ -3,9 +3,11 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using NuGet.Versioning; using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Text; using System.Threading.Tasks; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands; @@ -98,11 +100,11 @@ namespace Volo.Abp.Cli lineText = lineText.Substring(0, lineText.IndexOf('#')); } - var args = CommandLineArgumentParser.Parse(lineText.Split(' ')); + var args = CommandLineArgumentParser.Parse(lineText); await RunInternalAsync(args); } } - + private async Task RunInternalAsync(CommandLineArgs commandLineArgs) { var commandType = CommandSelector.Select(commandLineArgs); diff --git a/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/CommandLineArgumentParser_Tests.cs b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/CommandLineArgumentParser_Tests.cs index c8d31990cf..36174f1004 100644 --- a/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/CommandLineArgumentParser_Tests.cs +++ b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/CommandLineArgumentParser_Tests.cs @@ -64,5 +64,26 @@ namespace Volo.Abp.Cli commandLineArgs.Options.ShouldContainKey("optionC"); commandLineArgs.Options["optionC"].ShouldBe("value2"); } + + [Fact] + public void Should_Parse_From_Line_Text() + { + var commandLineArgs = _commandLineArgumentParser.Parse( + "mycommand mytarget -a value1 -b \"value with space\" --optionC" + ); + + commandLineArgs.Command.ShouldBe("mycommand"); + commandLineArgs.Target.ShouldBe("mytarget"); + commandLineArgs.Options.Any().ShouldBeTrue(); + + commandLineArgs.Options.ShouldContainKey("a"); + commandLineArgs.Options["a"].ShouldBe("value1"); + + commandLineArgs.Options.ShouldContainKey("b"); + commandLineArgs.Options["b"].ShouldBe("value with space"); + + commandLineArgs.Options.ShouldContainKey("optionC"); + commandLineArgs.Options["optionC"].ShouldBeNull(); + } } } From d13b6c8b0c9a2d9373f0db4a38c8b4369c943be1 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 7 May 2021 09:11:41 +0800 Subject: [PATCH 043/129] Improved --- .../AbpEfCoreServiceCollectionExtensions.cs | 10 ++++- .../AbpEntityFrameworkCoreModule.cs | 5 --- .../AbpDbContextConventionalRegistrar.cs | 37 ------------------- .../AbpMongoDbServiceCollectionExtensions.cs | 10 ++++- .../AbpMongoDbConventionalRegistrar.cs | 21 ----------- 5 files changed, 18 insertions(+), 65 deletions(-) delete mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextConventionalRegistrar.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs index 538614ee22..07e86cb0e3 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs @@ -1,5 +1,7 @@ using System; +using System.Reflection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Volo.Abp.DependencyInjection; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.DependencyInjection; @@ -8,7 +10,7 @@ namespace Microsoft.Extensions.DependencyInjection public static class AbpEfCoreServiceCollectionExtensions { public static IServiceCollection AddAbpDbContext( - this IServiceCollection services, + this IServiceCollection services, Action optionsBuilder = null) where TDbContext : AbpDbContext { @@ -19,6 +21,12 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddTransient(DbContextOptionsFactory.Create); + var replaceDbContextAttribute = typeof(TDbContext).GetCustomAttribute(true); + if (replaceDbContextAttribute != null) + { + options.ReplacedDbContextTypes.AddRange(replaceDbContextAttribute.ReplacedDbContextTypes); + } + foreach (var dbContextType in options.ReplacedDbContextTypes) { services.Replace( diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs index 3d03698443..b5d9eb8436 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs @@ -11,11 +11,6 @@ namespace Volo.Abp.EntityFrameworkCore [DependsOn(typeof(AbpDddDomainModule))] public class AbpEntityFrameworkCoreModule : AbpModule { - public override void PreConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddConventionalRegistrar(new AbpDbContextConventionalRegistrar()); - } - public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextConventionalRegistrar.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextConventionalRegistrar.cs deleted file mode 100644 index d9d6214895..0000000000 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/AbpDbContextConventionalRegistrar.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Reflection; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.EntityFrameworkCore.DependencyInjection -{ - public class AbpDbContextConventionalRegistrar : DefaultConventionalRegistrar - { - public override void AddType(IServiceCollection services, Type type) - { - if (!typeof(IAbpEfCoreDbContext).IsAssignableFrom(type) || type == typeof(AbpDbContext<>)) - { - return; - } - - var replaceDbContextAttribute = type.GetCustomAttribute(true); - if (replaceDbContextAttribute == null) - { - return; - } - - foreach (var dbContextType in replaceDbContextAttribute.ReplacedDbContextTypes) - { - services.Replace( - ServiceDescriptor.Transient( - dbContextType, - sp => sp.GetRequiredService(type) - ) - ); - - services.Configure(opts => { opts.DbContextReplacements[dbContextType] = type; }); - } - } - } -} diff --git a/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs b/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs index 5adf7300ee..48e3115306 100644 --- a/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs @@ -1,5 +1,7 @@ using System; +using System.Reflection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Volo.Abp.DependencyInjection; using Volo.Abp.MongoDB; using Volo.Abp.MongoDB.DependencyInjection; @@ -13,11 +15,17 @@ namespace Microsoft.Extensions.DependencyInjection var options = new AbpMongoDbContextRegistrationOptions(typeof(TMongoDbContext), services); optionsBuilder?.Invoke(options); + var replaceDbContextAttribute = typeof(TMongoDbContext).GetCustomAttribute(true); + if (replaceDbContextAttribute != null) + { + options.ReplacedDbContextTypes.AddRange(replaceDbContextAttribute.ReplacedDbContextTypes); + } + foreach (var dbContextType in options.ReplacedDbContextTypes) { services.Replace(ServiceDescriptor.Transient(dbContextType, typeof(TMongoDbContext))); } - + foreach (var dbContextType in options.ReplacedDbContextTypes) { services.Replace( diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs index 8e8a0e39aa..e0a6265f7c 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs @@ -24,27 +24,6 @@ namespace Volo.Abp.MongoDB.DependencyInjection } services.Add(ServiceDescriptor.Describe(typeof(IAbpMongoDbContext), type, ServiceLifetime.Transient)); - - var replaceDbContextAttribute = type.GetCustomAttribute(true); - if (replaceDbContextAttribute == null) - { - return; - } - - foreach (var dbContextType in replaceDbContextAttribute.ReplacedDbContextTypes) - { - services.Replace( - ServiceDescriptor.Transient( - dbContextType, - sp => sp.GetRequiredService(type) - ) - ); - - services.Configure(opts => - { - opts.DbContextReplacements[dbContextType] = type; - }); - } } } } From 7d80f5ce83e23e64edbeef87f904876b9423946b Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 7 May 2021 09:15:33 +0800 Subject: [PATCH 044/129] Update docs/en/SimpleStateChecker.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Halil İbrahim Kalkan --- docs/en/SimpleStateChecker.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/SimpleStateChecker.md b/docs/en/SimpleStateChecker.md index 077f2be477..7dc853158d 100644 --- a/docs/en/SimpleStateChecker.md +++ b/docs/en/SimpleStateChecker.md @@ -113,7 +113,7 @@ myobj2.SimpleStateCheckers.Add(myObjectBatchStateChecker); SimpleStateCheckerResult stateCheckerResult = await stateCheckerManager.IsEnabledAsync(new []{ myobj1, myobj2 }); ```` -## Built-in state checker +## Built-in State Checkers The `PermissionDefinition`, `ApplicationMenuItem` and `ToolbarItem` objects have implemented state checks and have built-in general state checkers, you can directly use their extension methods. @@ -122,4 +122,4 @@ RequireAuthenticated(); RequirePermissions(bool requiresAll, params string[] permissions); RequireFeatures(bool requiresAll, params string[] features); RequireGlobalFeatures(bool requiresAll, params Type[] globalFeatures); -```` \ No newline at end of file +```` From e083250cd8210129d1842118230e914c168c4a33 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 7 May 2021 09:15:38 +0800 Subject: [PATCH 045/129] Update docs/en/SimpleStateChecker.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Halil İbrahim Kalkan --- docs/en/SimpleStateChecker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/SimpleStateChecker.md b/docs/en/SimpleStateChecker.md index 7dc853158d..9d4c243f72 100644 --- a/docs/en/SimpleStateChecker.md +++ b/docs/en/SimpleStateChecker.md @@ -58,7 +58,7 @@ services.Configure>(options => > Write this inside the `ConfigureServices` method of your module. -### Check the state +## Check the state You can inject `ISimpleStateCheckerManager` service to check state. From 510fc3c4eec7f2ad74024e79401a64542f47b338 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 7 May 2021 09:15:43 +0800 Subject: [PATCH 046/129] Update docs/en/SimpleStateChecker.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Halil İbrahim Kalkan --- docs/en/SimpleStateChecker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/SimpleStateChecker.md b/docs/en/SimpleStateChecker.md index 9d4c243f72..b0529ee519 100644 --- a/docs/en/SimpleStateChecker.md +++ b/docs/en/SimpleStateChecker.md @@ -42,7 +42,7 @@ var myobj = new MyObject() myobj.SimpleStateCheckers.Add(new MyObjectStateChecker()); ```` -## Definition global state checker. +## Definition Global State Checkers `AbpSimpleStateCheckerOptions` is the options class that used to set the global state checkers for specific object. From 62b96f9796dd013318eb31d2a3ab9cdc876058fa Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 7 May 2021 09:15:49 +0800 Subject: [PATCH 047/129] Update docs/en/SimpleStateChecker.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Halil İbrahim Kalkan --- docs/en/SimpleStateChecker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/SimpleStateChecker.md b/docs/en/SimpleStateChecker.md index b0529ee519..584fef1592 100644 --- a/docs/en/SimpleStateChecker.md +++ b/docs/en/SimpleStateChecker.md @@ -1,6 +1,6 @@ # Simple State Checker -The **state** of some objects may depend on multiple conditions, such as some permissions are required, features need to be enabled, or it is only for special users and roles are available. +The simple state checking system can be used to enable/disable an object based on some dynamic conditions. For example, you can disable a menu item on the user interface, if the current user has not granted for a given permission. The simple state checking system provides a generic way to define and check such conditions. ## Definition state checker. From 2b0407d986f608c4f17a10c89d2400cd369810f1 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 7 May 2021 09:17:31 +0800 Subject: [PATCH 048/129] Get attribute before optionsBuilder?.Invoke(options); --- .../AbpEfCoreServiceCollectionExtensions.cs | 7 ++++--- .../AbpMongoDbServiceCollectionExtensions.cs | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs index 07e86cb0e3..956b2937aa 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs @@ -17,9 +17,6 @@ namespace Microsoft.Extensions.DependencyInjection services.AddMemoryCache(); var options = new AbpDbContextRegistrationOptions(typeof(TDbContext), services); - optionsBuilder?.Invoke(options); - - services.TryAddTransient(DbContextOptionsFactory.Create); var replaceDbContextAttribute = typeof(TDbContext).GetCustomAttribute(true); if (replaceDbContextAttribute != null) @@ -27,6 +24,10 @@ namespace Microsoft.Extensions.DependencyInjection options.ReplacedDbContextTypes.AddRange(replaceDbContextAttribute.ReplacedDbContextTypes); } + optionsBuilder?.Invoke(options); + + services.TryAddTransient(DbContextOptionsFactory.Create); + foreach (var dbContextType in options.ReplacedDbContextTypes) { services.Replace( diff --git a/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs b/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs index 48e3115306..13131718c0 100644 --- a/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs @@ -13,7 +13,6 @@ namespace Microsoft.Extensions.DependencyInjection where TMongoDbContext : AbpMongoDbContext { var options = new AbpMongoDbContextRegistrationOptions(typeof(TMongoDbContext), services); - optionsBuilder?.Invoke(options); var replaceDbContextAttribute = typeof(TMongoDbContext).GetCustomAttribute(true); if (replaceDbContextAttribute != null) @@ -21,6 +20,8 @@ namespace Microsoft.Extensions.DependencyInjection options.ReplacedDbContextTypes.AddRange(replaceDbContextAttribute.ReplacedDbContextTypes); } + optionsBuilder?.Invoke(options); + foreach (var dbContextType in options.ReplacedDbContextTypes) { services.Replace(ServiceDescriptor.Transient(dbContextType, typeof(TMongoDbContext))); From c49e3fb92681f7a759d7ab03f04c29238d603be5 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 7 May 2021 12:08:12 +0800 Subject: [PATCH 049/129] Prevent adding duplicate models. --- .../RequirePermissionsSimpleBatchStateChecker.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs index 5cce51ec51..f02ce38c74 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleBatchStateChecker.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -22,7 +22,16 @@ namespace Volo.Abp.Authorization.Permissions { Check.NotNullOrEmpty(models, nameof(models)); - _models.AddRange(models); + foreach (var model in models) + { + if (!_models.Any(x => x.State.GetType() == model.State.GetType() && + x.RequiresAll == model.RequiresAll && + x.Permissions.SequenceEqual(model.Permissions))) + { + _models.Add(model); + } + } + return this; } From 93603dbaa39951dc1722a3f320b289a758108964 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 7 May 2021 14:19:39 +0800 Subject: [PATCH 050/129] Add MultiTenancyMiddlewareErrorPageBuilder to show exception. Resolve #3503 --- .../AbpAspNetCoreMultiTenancyOptions.cs | 26 +++++++++++++++++-- .../MultiTenancy/MultiTenancyMiddleware.cs | 21 +++++++++++++-- .../AspNetCore/AbpSecurityStampValidator.cs | 14 ++++++++-- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs index 63b83885f9..b2ecf708c5 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs @@ -1,4 +1,9 @@ -using Volo.Abp.MultiTenancy; +using System; +using System.Globalization; +using System.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.AspNetCore.MultiTenancy { @@ -9,9 +14,26 @@ namespace Volo.Abp.AspNetCore.MultiTenancy ///

public string TenantKey { get; set; } + public Func MultiTenancyMiddlewareErrorPageBuilder { get; set; } + public AbpAspNetCoreMultiTenancyOptions() { TenantKey = TenantResolverConsts.DefaultTenantKey; + MultiTenancyMiddlewareErrorPageBuilder = async (context, exception)=> + { + context.Response.StatusCode = (int) HttpStatusCode.InternalServerError;; + context.Response.ContentType = "text/html"; + + var message = exception.Message; + var details = exception is BusinessException businessException ? businessException.Details : string.Empty; + + await context.Response.WriteAsync($"\r\n"); + await context.Response.WriteAsync($"

{message}

{details}
\r\n"); + await context.Response.WriteAsync("\r\n"); + + // Note the 500 spaces are to work around an IE 'feature' + await context.Response.WriteAsync(new string(' ', 500)); + }; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs index eaf5c753fd..361826672b 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs @@ -1,10 +1,14 @@ using System; using System.Globalization; +using System.IO; +using System.Net; using System.Threading.Tasks; +using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.RequestLocalization; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Localization; using Volo.Abp.MultiTenancy; @@ -16,18 +20,31 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { private readonly ITenantConfigurationProvider _tenantConfigurationProvider; private readonly ICurrentTenant _currentTenant; + private readonly AbpAspNetCoreMultiTenancyOptions _options; public MultiTenancyMiddleware( ITenantConfigurationProvider tenantConfigurationProvider, - ICurrentTenant currentTenant) + ICurrentTenant currentTenant, + IOptions options) { _tenantConfigurationProvider = tenantConfigurationProvider; _currentTenant = currentTenant; + _options = options.Value; } public async Task InvokeAsync(HttpContext context, RequestDelegate next) { - var tenant = await _tenantConfigurationProvider.GetAsync(saveResolveResult: true); + TenantConfiguration tenant; + try + { + tenant = await _tenantConfigurationProvider.GetAsync(saveResolveResult: true); + } + catch (Exception e) + { + await _options.MultiTenancyMiddlewareErrorPageBuilder(context, e); + return; + } + if (tenant?.Id != _currentTenant.Id) { using (_currentTenant.Change(tenant?.Id, tenant?.Name)) diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSecurityStampValidator.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSecurityStampValidator.cs index 1dcc624a47..8ae543bed2 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSecurityStampValidator.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSecurityStampValidator.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Identity; @@ -34,7 +35,16 @@ namespace Volo.Abp.Identity.AspNetCore [UnitOfWork] public override async Task ValidateAsync(CookieValidatePrincipalContext context) { - var tenant = await TenantConfigurationProvider.GetAsync(saveResolveResult: false); + TenantConfiguration tenant = null; + try + { + tenant = await TenantConfigurationProvider.GetAsync(saveResolveResult: false); + } + catch (Exception e) + { + Logger.LogException(e); + } + using (CurrentTenant.Change(tenant?.Id, tenant?.Name)) { await base.ValidateAsync(context); From 1641c7d0d8435746ab2de94f589861152af36758 Mon Sep 17 00:00:00 2001 From: Dominik Oswald <6849456+d-oit@users.noreply.github.com> Date: Fri, 7 May 2021 15:23:12 +0200 Subject: [PATCH 051/129] Add OnDeletedEntityAsync --- framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index 6ce4a10a53..73decfa470 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -487,14 +487,19 @@ namespace Volo.Abp.BlazoriseUI await CheckDeletePolicyAsync(); await AppService.DeleteAsync(entity.Id); - await GetEntitiesAsync(); - await InvokeAsync(StateHasChanged); + await OnDeletedEntityAsync(); } catch (Exception ex) { await HandleErrorAsync(ex); } } + + protected virtual async Task OnDeletedEntityAsync() + { + await GetEntitiesAsync(); + await InvokeAsync(StateHasChanged); + } protected virtual string GetDeleteConfirmationMessage(TListViewModel entity) { From 53ea77602e00a4bebc2593ba340e11d49253ca0f Mon Sep 17 00:00:00 2001 From: Dominik Oswald <6849456+d-oit@users.noreply.github.com> Date: Fri, 7 May 2021 17:01:07 +0200 Subject: [PATCH 052/129] Add OnDeletingEntityAsync --- framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index 73decfa470..19ace62aca 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -485,7 +485,7 @@ namespace Volo.Abp.BlazoriseUI try { await CheckDeletePolicyAsync(); - + await OnDeletingEntityAsync(); await AppService.DeleteAsync(entity.Id); await OnDeletedEntityAsync(); } @@ -495,6 +495,11 @@ namespace Volo.Abp.BlazoriseUI } } + protected virtual Task OnDeletingEntityAsync() + { + return Task.CompletedTask; + } + protected virtual async Task OnDeletedEntityAsync() { await GetEntitiesAsync(); From 5518a6a023e8df483c99f35e53636a0b4933e1b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 7 May 2021 23:22:59 +0300 Subject: [PATCH 053/129] Added IsConfigured methods to check if dbcontext was previously configured. --- .../EntityFrameworkCore/AbpDbContextOptions.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs index 92c6935900..75dd6a5dc4 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs @@ -39,6 +39,11 @@ namespace Volo.Abp.EntityFrameworkCore DefaultConfigureAction = action; } + public bool IsConfiguredDefault() + { + return DefaultConfigureAction != null; + } + public void PreConfigure([NotNull] Action> action) where TDbContext : AbpDbContext { @@ -60,6 +65,16 @@ namespace Volo.Abp.EntityFrameworkCore ConfigureActions[typeof(TDbContext)] = action; } + + public bool IsConfigured() + { + return IsConfigured(typeof(TDbContext)); + } + + public bool IsConfigured(Type dbContextType) + { + return ConfigureActions.ContainsKey(dbContextType); + } internal Type GetReplacedTypeOrSelf(Type dbContextType) { From e0afe18006c0b62381cce26c7896d63c60a0b1c1 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Sun, 9 May 2021 14:00:35 +0300 Subject: [PATCH 054/129] Commercial: Add new localizations for demo creation page --- .../Commercial/Localization/Resources/en-GB.json | 5 ++++- .../Commercial/Localization/Resources/en.json | 5 ++++- .../Commercial/Localization/Resources/tr.json | 5 ++++- .../Commercial/Localization/Resources/zh-Hans.json | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json index 56f4ed934f..f56f3a5734 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json @@ -34,6 +34,9 @@ "JoinOurMarketingNewsletter": "Join our marketing newsletter", "WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials e.g. product deals & special offers.", "StartUsingYourLicenseNow": "Start using your license now!", - "WelcomePage": "Welcome Page" + "WelcomePage": "Welcome Page", + "FullName": "Full name", + "CompanyName": "Company name", + "YourCompanyName": "Your company name" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 3c2a7cc59c..8f23b599ca 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -291,6 +291,9 @@ "PayViaAmexCard": "How can I pay via my AMEX card?", "PayViaAmexCardDescription": "The default payment gateway 'Iyzico' may decline some AMEX credit cards due to the security measures. In this case, you can pay through the alternative payment gateway '2Checkout'.", "ThankYou": "Thank you", - "InvalidReCaptchaErrorMessage": "There was an error verifying reCAPTCHA. Please try again." + "InvalidReCaptchaErrorMessage": "There was an error verifying reCAPTCHA. Please try again.", + "FullName": "Full name", + "CompanyName": "Company name", + "YourCompanyName": "Your company name" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json index e49c82c6fd..23c31a214f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json @@ -31,6 +31,9 @@ "SuccessfullyAddedToNewsletter": "Bültenimize abone olduğunuz için teşekkürler!", "MyProfile": "Profilim", "EmailNotValid": "Lütfen uygun bir e-posta adresi giriniz", - "InvalidReCaptchaErrorMessage": "ReCAPTCHA doğrulanırken hata oluştu, lütfen tekrar deneyin." + "InvalidReCaptchaErrorMessage": "ReCAPTCHA doğrulanırken hata oluştu, lütfen tekrar deneyin.", + "FullName": "Ad soyad", + "CompanyName": "Şirket adı", + "YourCompanyName": "Şirket adınız" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json index e92e55bf6c..35b92fcb33 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json @@ -290,6 +290,9 @@ "BuyNow": "现在购买", "PayViaAmexCard": "我如何通过我的AMEX卡付款?", "PayViaAmexCardDescription": "由于安全措施,默认付款网关“ Iyzico”可能会拒绝某些AMEX信用卡。 在这种情况下,您可以通过备用付款网关“ 2Checkout”付款。", - "InvalidReCaptchaErrorMessage": "验证reCAPTCHA时出错,请重试。" + "InvalidReCaptchaErrorMessage": "验证reCAPTCHA时出错,请重试。", + "FullName": "全名", + "CompanyName": "公司名称", + "YourCompanyName": "您的公司名称" } } From f560abd58daa2f6581f17584772c922142dc9992 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Sun, 9 May 2021 16:11:48 +0300 Subject: [PATCH 055/129] SEO meta tags volosoft/volo#1000 --- .../src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml | 2 +- .../src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml | 2 +- .../blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml index 1aa239efd7..a4fcbc0414 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml @@ -7,7 +7,7 @@ @inject IHtmlLocalizer L @model EditModel @{ - ViewBag.PageTitle = "Blog"; + ViewBag.PageTitle = "Edit Blog Post"; } @section styles { diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml index db9644a9ed..c325513079 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml @@ -11,7 +11,7 @@ @inject IHtmlLocalizer L @inject BloggingPageHelper BloggingPageHelper @{ - ViewBag.Title = "Blog"; + ViewBag.Title = "Read All Blog Posts"; } @section scripts { diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml index d57fd1b772..810a0e3203 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml @@ -7,7 +7,7 @@ @inject IHtmlLocalizer L @model NewModel @{ - ViewBag.PageTitle = "Blog"; + ViewBag.PageTitle = "New Blog Post"; } @section styles { From 679855134d5f30483fa8490305a568b8c83c5bfb Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Sun, 9 May 2021 16:49:28 +0300 Subject: [PATCH 056/129] add more supported languages for highlighting. closes #3111 --- ...mjsScriptBundleContributorDocsExtension.cs | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Web/Bundling/PrismjsScriptBundleContributorDocsExtension.cs b/modules/docs/src/Volo.Docs.Web/Bundling/PrismjsScriptBundleContributorDocsExtension.cs index 9406c2f6f2..9309234be7 100644 --- a/modules/docs/src/Volo.Docs.Web/Bundling/PrismjsScriptBundleContributorDocsExtension.cs +++ b/modules/docs/src/Volo.Docs.Web/Bundling/PrismjsScriptBundleContributorDocsExtension.cs @@ -5,14 +5,47 @@ namespace Volo.Docs.Bundling { public class PrismjsScriptBundleContributorDocsExtension : BundleContributor { + private static readonly string[] SupportedLanguages = new[] { + "csharp", + "json", + "aspnet", + "bash", + "css", + "css-extras", + "docker", + "javascript", + "less", + "markdown", + "nginx", + "powershell", + "regex", + "sass", + "scss", + "sql", + "typescript" + }; + public override void ConfigureBundle(BundleConfigurationContext context) + { + AddPlugins(context); + AddLanguages(context); + } + + private static void AddLanguages(IBundleConfigurationContext context) + { + const string componentsPath = "/libs/prismjs/components/prism-{0}.js"; + foreach (var language in SupportedLanguages) + { + context.Files.AddIfNotContains(string.Format(componentsPath, language)); + } + } + + private static void AddPlugins(IBundleConfigurationContext context) { context.Files.AddIfNotContains("/libs/prismjs/plugins/toolbar/prism-toolbar.js"); context.Files.AddIfNotContains("/libs/prismjs/plugins/show-language/prism-show-language.js"); context.Files.AddIfNotContains("/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js"); context.Files.AddIfNotContains("/libs/prismjs/plugins/line-highlight/prism-line-highlight.js"); - context.Files.AddIfNotContains("/libs/prismjs/components/prism-csharp.js"); - context.Files.AddIfNotContains("/libs/prismjs/components/prism-json.js"); } } } From 34ca1fbf79948c28d0bea0cbe7bd4ba9bbbbdad3 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 10 May 2021 13:32:16 +0800 Subject: [PATCH 057/129] Make sure the URL and template URL are the same. --- .../Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator.cs | 5 ++++- .../IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs | 4 +++- .../IdentityServer/AbpStrictRedirectUriValidator_Tests.cs | 2 ++ .../AbpWildcardSubdomainCorsPolicyService_Tests.cs | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator.cs index 359babde7e..a4459d99e2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using IdentityServer4.Models; using IdentityServer4.Validation; @@ -33,7 +34,9 @@ namespace Volo.Abp.IdentityServer var extractResult = FormattedStringValueExtracter.Extract(requestedUri, url, ignoreCase: true); if (extractResult.IsMatch) { - return Task.FromResult(true); + return Task.FromResult(extractResult.Matches + .Aggregate(url, (current, nameValue) => current.Replace($"{{{nameValue.Name}}}", nameValue.Value)) + .Contains(requestedUri, StringComparison.OrdinalIgnoreCase)); } if (url.Replace("{0}.", "").Contains(requestedUri, StringComparison.OrdinalIgnoreCase)) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs index 1a9d146ca9..daf8d1f6f2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Threading.Tasks; using IdentityServer4.Configuration; using Microsoft.Extensions.Options; @@ -32,7 +33,8 @@ namespace Volo.Abp.IdentityServer var extractResult = FormattedStringValueExtracter.Extract(origin, url, ignoreCase: true); if (extractResult.IsMatch) { - return true; + return extractResult.Matches.Aggregate(url, (current, nameValue) => current.Replace($"{{{nameValue.Name}}}", nameValue.Value)) + .Contains(origin, StringComparison.OrdinalIgnoreCase); } if (url.Replace("{0}.", "").Contains(origin, StringComparison.OrdinalIgnoreCase)) diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator_Tests.cs index a455cd9811..7f00d2e355 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpStrictRedirectUriValidator_Tests.cs @@ -54,6 +54,7 @@ namespace Volo.Abp.IdentityServer (await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("http://ng.abp.io", _testClient)).ShouldBeTrue(); (await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("https://api.t1.abp:8080/", _testClient)).ShouldBeFalse(); (await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("http://ng.t1.abp.io", _testClient)).ShouldBeFalse(); + (await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("http://t1.ng.abp.io/index.html.mydomain.com", _testClient)).ShouldBeFalse(); } [Fact] @@ -68,6 +69,7 @@ namespace Volo.Abp.IdentityServer (await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("http://ng.abp.io", _testClient)).ShouldBeTrue(); (await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("https://api.t1.abp:8080/", _testClient)).ShouldBeFalse(); (await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("http://ng.t1.abp.io", _testClient)).ShouldBeFalse(); + (await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("http://t1.ng.abp.io/index.html.mydomain.com", _testClient)).ShouldBeFalse(); } } } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService_Tests.cs index fcb8e756e0..36949582d7 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService_Tests.cs @@ -35,6 +35,8 @@ namespace Volo.Abp.IdentityServer (await _corsPolicyService.IsOriginAllowedAsync("https://abp.io")).ShouldBeTrue(); (await _corsPolicyService.IsOriginAllowedAsync("https://t1.abp.io")).ShouldBeTrue(); (await _corsPolicyService.IsOriginAllowedAsync("https://t1.ng.abp.io")).ShouldBeTrue(); + + (await _corsPolicyService.IsOriginAllowedAsync("https://t1.abp.io.mydomain.com")).ShouldBeFalse(); } } } From eb3fc01ca366bf1b0d47bfb97e2f566d139f2e03 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 10 May 2021 14:38:15 +0800 Subject: [PATCH 058/129] Update Page-Component.md --- docs/en/UI/Angular/Page-Component.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/UI/Angular/Page-Component.md b/docs/en/UI/Angular/Page-Component.md index a9e9857142..0c611c4081 100644 --- a/docs/en/UI/Angular/Page-Component.md +++ b/docs/en/UI/Angular/Page-Component.md @@ -11,7 +11,7 @@ Let's look at the following example without `abp-page` component. ```html
-

{{ '::Dashboard' | abpLocalization }}

+

{%{{ '::Dashboard' | abpLocalization }}%}