From 21d55821233ad06f0f2a63e3d4347a08f57317e4 Mon Sep 17 00:00:00 2001 From: Suhaib Date: Sat, 15 Jun 2024 11:56:31 +0300 Subject: [PATCH 1/9] new feature(CmsKit): Marked Item Add Marked Item feature to allow marking items as favorite, starred, flagged, or bookmarked. - Added Marked Toggling Component to mark items via pre-defined icons/emojis. - Created Marked Item widget for toggling marks on items. Documentation: Provided detailed usage and configuration instructions in the CMS Kit Module documentation. --- docs/en/Modules/Cms-Kit/Index.md | 1 + docs/en/Modules/Cms-Kit/MarkedItems.md | 148 + docs/en/images/cmskit-module-markedItems.png | Bin 0 -> 7460 bytes .../cmskit-module-markedItemsFilter.gif | Bin 0 -> 494739 bytes .../CmsKitWebUnifiedModule.cs | 11 + .../Pages/Index.cshtml | 30 + .../Volo.CmsKit.Common.Web/CmsKitUiOptions.cs | 4 + .../Icons/IconDictionaryHelper.cs | 21 + .../Icons/LocalizableIconDictionaryBase.cs | 18 + .../MarkedItems/MarkedItemIconDictionary.cs | 7 + .../Reactions/ReactionIconDictionary.cs | 16 +- .../Volo/CmsKit/CmsKitErrorCodes.cs | 5 + .../CmsKitFeatureDefinitionProvider.cs | 9 + .../Volo/CmsKit/Features/CmsKitFeatures.cs | 1 + .../GlobalFeatures/GlobalCmsKitFeatures.cs | 3 + .../GlobalFeatures/MarkedItemsFeature.cs | 27 + .../CmsKit/Localization/Resources/ar.json | 8 + .../CmsKit/Localization/Resources/en.json | 500 +- .../CmsKit/MarkedItems/StandardMarkedItems.cs | 9 + .../MarkedItems/UserMarkedItemConsts.cs | 9 + .../MarkedItems/CmsKitMarkedItemOptions.cs | 10 + .../DefaultMarkedItemDefinitionStore.cs | 36 + .../EntityCannotBeMarkedException.cs | 16 + .../MarkedItems/IMarkedItemDefinitionStore.cs | 8 + .../MarkedItems/IUserMarkedItemRepository.cs | 31 + .../MarkedItemEntityTypeDefinition.cs | 16 + .../CmsKit/MarkedItems/MarkedItemManager.cs | 58 + .../Volo/CmsKit/MarkedItems/UserMarkedItem.cs | 36 + .../EntityFrameworkCore/CmsKitDbContext.cs | 2 + .../CmsKitDbContextModelCreatingExtensions.cs | 23 + .../CmsKitEntityFrameworkCoreModule.cs | 2 + .../EntityFrameworkCore/ICmsKitDbContext.cs | 2 + .../EfCoreUserMarkedItemRepository.cs | 67 + .../CmsKit/MongoDB/CmsKitMongoDbContext.cs | 3 + .../MongoDB/CmsKitMongoDbContextExtensions.cs | 6 + .../CmsKit/MongoDB/CmsKitMongoDbModule.cs | 3 + .../CmsKit/MongoDB/ICmsKitMongoDbContext.cs | 3 + .../MongoUserMarkedItemRepository.cs | 67 + .../IMarkedItemPublicAppService.cs | 10 + .../Public/MarkedItems/MarkedItemDto.cs | 11 + .../MarkedItems/MarkedItemWithToggleDto.cs | 11 + .../MarkedItems/MarkedItemPublicAppService.cs | 69 + ...tFilteredPagedAndSortedResultRequestDto.cs | 15 + .../Public/Blogs/BlogPostGetListInput.cs | 17 + .../Public/Blogs/IBlogPostPublicAppService.cs | 28 + .../Volo/CmsKit/Public/Comments/CmsUserDto.cs | 21 + .../Volo/CmsKit/Public/Comments/CommentDto.cs | 33 + .../Public/Comments/CommentWithDetailsDto.cs | 31 + .../Public/Comments/CreateCommentInput.cs | 25 + .../Comments/ICommentPublicAppService.cs | 22 + .../Public/Comments/UpdateCommentInput.cs | 21 + .../GlobalResources/GlobalResourceDto.cs | 17 + .../IGlobalResourcePublicAppService.cs | 18 + .../IMarkedItemPublicAppService.cs | 18 + .../Public/MarkedItems/MarkedItemDto.cs | 15 + .../MarkedItemPublicClientProxy.Generated.cs | 37 + .../MarkedItemPublicClientProxy.cs | 7 + .../MarkedItems/MarkedItemWithToggleDto.cs | 17 + .../Public/Menus/IMenuItemPublicAppService.cs | 17 + .../Public/Pages/IPagePublicAppService.cs | 21 + .../Public/Ratings/CreateUpdateRatingInput.cs | 15 + .../Public/Ratings/IRatingPublicAppService.cs | 20 + .../Volo/CmsKit/Public/Ratings/RatingDto.cs | 25 + .../Public/Ratings/RatingWithStarCountDto.cs | 19 + .../Reactions/IReactionPublicAppService.cs | 20 + .../CmsKit/Public/Reactions/ReactionDto.cs | 17 + .../Reactions/ReactionWithSelectionDto.cs | 19 + .../Volo/CmsKit/Public/Tags/ITagAppService.cs | 18 + .../ClientProxies/cms-kit-generate-proxy.json | 8838 ++++++++++++++++- .../MarkedItems/MarkedItemPublicController.cs | 38 + .../CmsKitPublicWebModule.cs | 10 + .../CmsKitPublicWidgetsController.cs | 6 + .../MarkedItemToggle/Default.cshtml | 14 + ...MarkedItemToggleScriptBundleContributor.cs | 13 + .../MarkedItemToggleStyleBundleContributor.cs | 12 + .../MarkedItemToggleViewComponent.cs | 77 + .../Components/MarkedItemToggle/default.css | 7 + .../Components/MarkedItemToggle/default.js | 92 + .../Shared/Modals/Login/LoginModal.cshtml | 22 + .../Shared/Modals/Login/LoginModal.cshtml.cs | 32 + .../wwwroot/client-proxies/cms-kit-proxy.js | 22 + .../MarkedItemPublicAppService_Tests.cs | 65 + .../MarkedItems/MarkedItemManager_Tests.cs | 45 + .../UserMarkedItemRepository_Tests.cs | 6 + .../UserMarkedItemRepository_Tests.cs | 9 + .../CmsKitDataSeedContributor.cs | 28 +- .../UserMarkedItemRepository_Tests.cs | 64 + 87 files changed, 10988 insertions(+), 262 deletions(-) create mode 100644 docs/en/Modules/Cms-Kit/MarkedItems.md create mode 100644 docs/en/images/cmskit-module-markedItems.png create mode 100644 docs/en/images/cmskit-module-markedItemsFilter.gif create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/IconDictionaryHelper.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/LocalizableIconDictionaryBase.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/MarkedItems/MarkedItemIconDictionary.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MarkedItemsFeature.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/MarkedItems/StandardMarkedItems.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/MarkedItems/UserMarkedItemConsts.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/CmsKitMarkedItemOptions.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DefaultMarkedItemDefinitionStore.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/EntityCannotBeMarkedException.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IMarkedItemDefinitionStore.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IUserMarkedItemRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemEntityTypeDefinition.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/UserMarkedItem.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/MarkedItems/MongoUserMarkedItemRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/MarkedItemDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/MarkedItemWithToggleDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostFilteredPagedAndSortedResultRequestDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CmsUserDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CommentDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CreateCommentInput.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/GlobalResources/GlobalResourceDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/GlobalResources/IGlobalResourcePublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.Generated.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemWithToggleDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Menus/IMenuItemPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/RatingDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/IReactionPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/ReactionDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/ReactionWithSelectionDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Tags/ITagAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicController.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/Default.cshtml create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleScriptBundleContributor.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleStyleBundleContributor.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleViewComponent.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.css create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Modals/Login/LoginModal.cshtml create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Modals/Login/LoginModal.cshtml.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.Application.Tests/MarkedItems/MarkedItemPublicAppService_Tests.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.Domain.Tests/MarkedItems/MarkedItemManager_Tests.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/MarkedItems/UserMarkedItemRepository_Tests.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/MarkedItems/UserMarkedItemRepository_Tests.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.TestBase/MarkedItems/UserMarkedItemRepository_Tests.cs diff --git a/docs/en/Modules/Cms-Kit/Index.md b/docs/en/Modules/Cms-Kit/Index.md index 6c3201d0f9..f546552f16 100644 --- a/docs/en/Modules/Cms-Kit/Index.md +++ b/docs/en/Modules/Cms-Kit/Index.md @@ -17,6 +17,7 @@ The following features are currently available: * Provides a [**menu**](Menus.md) system to manage public menus dynamically. * Provides a [**global resources**](Global-Resources.md) system to add global styles and scripts dynamically. * Provides a [**Dynamic Widget**](Dynamic-Widget.md) system to create dynamic widgets for page and blog posts. +* Provides a [**Marked Item**](MarkedItems.md) system to mark any kind of resource, like a blog post or a product, as a favorite, starred, flagged, or bookmarked. > You can click on the any feature links above to understand and learn how to use it. diff --git a/docs/en/Modules/Cms-Kit/MarkedItems.md b/docs/en/Modules/Cms-Kit/MarkedItems.md new file mode 100644 index 0000000000..198d8dae47 --- /dev/null +++ b/docs/en/Modules/Cms-Kit/MarkedItems.md @@ -0,0 +1,148 @@ +# Marked Item System + +CMS kit provides a marking system to mark any kind of resource, like a blog post or a product, as a favorite, starred, flagged, or bookmarked. + +Marked toggling component allows users to mark your items via pre-defined icons/emojis. Here how the marked toggling components may look like: + +![markedItems](../../images/cmskit-module-markedItems.png) + + +you can also customize the marking icons shown in the toggling components. + +## Enabling the Marked Item Feature + +By default, CMS Kit features are disabled. Therefore, you need to enable the features you want, before starting to use it. You can use the [Global Feature](../../Global-Features.md) system to enable/disable CMS Kit features on development time. Alternatively, you can use the ABP Framework's [Feature System](https://docs.abp.io/en/abp/latest/Features) to disable a CMS Kit feature on runtime. + +> Check the ["How to Install" section of the CMS Kit Module documentation](Index.md#how-to-install) to see how to enable/disable CMS Kit features on development time. + +## Options + +Marking system provides a simple approach to define your entity type with mark types like favorite or starred. For example, if you want to use the marking system for products, you need to define an entity type named `product` with the icon name. + +`CmsKitMarkedItemOptions` can be configured in YourModule.cs, 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 MarkedItemEntityTypeDefinition( + "product", + StandardMarkedItems.Favorite + ) + ); +}); +``` + +`CmsKitMarkedItemOptions` properties: + +- `EntityTypes`: List of defined entity types (`CmsKitMarkedItemOptions`) in the marking system. + +`MarkedItemEntityTypeDefinition` properties: + +- `EntityType`: Name of the entity type. +- `IconName`: The name of the icon. + +## The Marked Item widget + +The marking system provides a toggle widget to allow users to add/remove the marks from an item. You can place the widget with the item as shown below: + +``` csharp +@await Component.InvokeAsync(typeof (MarkedItemToggleViewComponent), new +{ + entityId = "...", + entityType = "product", + needsConfirmation = true // (optional) +}) +``` +* `entityType` was explained in the previous section. +* `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. +* `needsConfirmation` An optional parameter to let the user confirm when removing the mark. + +# Filter on marked items + +Filtering on marked items enhances the user experience by making it easier to search marked items. + +![markedItemsFilter](../../images/cmskit-module-markedItemsFilter.gif) + +There is an ability to utilize the marking system to let users filter on their marked items. The code below shows how you can filter on your query filter: + +```csharp + protected async override Task> CreateFilteredQueryAsync(YourEntityPagedAndSortedResultDto input) + { + IQueryable query = await base.CreateFilteredQueryAsync(input); + + if (input.FilterOnFavorites && CurrentUser.IsAuthenticated) + { + var markedQuery = await UserMarkedItemRepository.GetQueryForUserAsync("entityType", CurrentUser.GetId()); + query = query.Where(e => markedQuery.Any(m => m.EntityId == e.Id)); + } + + // ... + + return query; + } +``` + +# Internals + +## Domain Layer + +#### Aggregates + +This module follows the [Entity Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Entities) guide. + +##### UserMarkedItem + +A user markedItem represents a user has marking on the item. + +- `UserMarkedItem` (aggregate root): Represents a marked item 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: + +- `IUserMarkedItemRepository` + + +#### Domain services + +This module follows the [Domain Services Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services) guide. + +##### Marked Item Manager + +`MarkedItemManager` is used to perform some operations for the `UserMarkedItem` aggregate root. + +### Application layer + +#### Application services + +- `MarkedItemPublicAppService` (implements `IMarkedItemPublicAppService`): Implements the use cases of marking 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 + +- CmsUserMarkedItems + +#### MongoDB + +##### Collections + +- **CmsUserMarkedItems** + diff --git a/docs/en/images/cmskit-module-markedItems.png b/docs/en/images/cmskit-module-markedItems.png new file mode 100644 index 0000000000000000000000000000000000000000..3790049314d8658aa2a82fb73b51c52aef8ba1ee GIT binary patch literal 7460 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 NP|0G)&asffQyJP9@URste>F!#(ySrBQd%pMI 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

q9tBp+>+o6Q{ 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%0A`oz!}A)gY+DFrGS!SyXe}<5|~J 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 literal 0 HcmV?d00001 diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs index c6be8a2ad2..cb515032b6 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -42,6 +42,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Volo.Abp.DependencyInjection; using Volo.CmsKit.Public.Pages; +using Volo.CmsKit.MarkedItems; #if EntityFrameworkCore @@ -234,6 +235,16 @@ public class CmsKitWebUnifiedModule : AbpModule { options.EntityTypes.Add(new RatingEntityTypeDefinition("quote")); }); + + Configure(options => + { + options.EntityTypes.Add( + new MarkedItemEntityTypeDefinition( + "product", + StandardMarkedItems.Favorite + ) + ); + }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml index 5302289fb3..9a1d1b03bf 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml @@ -8,6 +8,7 @@ @using Volo.CmsKit.GlobalFeatures @using Volo.CmsKit.Pages @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Commenting +@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.MarkedItemToggle @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Tags @@ -118,3 +119,32 @@ } + + +


+ + @for (int i = 1; i <= 4; i++) + { + var name = $"Item {i}"; + + + +
+ Item +
+
+ @await Component.InvokeAsync(typeof(MarkedItemToggleViewComponent), new + { + entityId = name, + entityType = "product", + needsConfirmation = true // (optional) + }) +
+
+ + @name + +
+
+ } +
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitUiOptions.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitUiOptions.cs index ec89d40514..637d3ef98f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitUiOptions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitUiOptions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Volo.CmsKit.Web.MarkedItems; using Volo.CmsKit.Web.Reactions; namespace Volo.CmsKit.Web; @@ -10,9 +11,12 @@ public class CmsKitUiOptions public CmsKitUiCommentOptions CommentsOptions { get; } + public MarkedItemIconDictionary MarkedItemIcons { get; } + public CmsKitUiOptions() { ReactionIcons = new ReactionIconDictionary(); CommentsOptions = new CmsKitUiCommentOptions(); + MarkedItemIcons = new MarkedItemIconDictionary(); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/IconDictionaryHelper.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/IconDictionaryHelper.cs new file mode 100644 index 0000000000..95ab56fa51 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/IconDictionaryHelper.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using Volo.Abp; + +namespace Volo.CmsKit.Web.Icons; + +public static class IconDictionaryHelper +{ + public static string GetLocalizedIcon( + Dictionary dictionary, + string name, + string cultureName = null) + { + var icon = dictionary.GetOrDefault(name); + if (icon == null) + { + throw new AbpException($"No icon defined for the item with name '{name}'"); + } + + return icon.GetLocalizedIconOrDefault(cultureName); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/LocalizableIconDictionaryBase.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/LocalizableIconDictionaryBase.cs new file mode 100644 index 0000000000..05967655f2 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Icons/LocalizableIconDictionaryBase.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using Volo.Abp; + +namespace Volo.CmsKit.Web.Icons; + +public class LocalizableIconDictionaryBase : Dictionary +{ + public string GetLocalizedIcon(string name, string cultureName = null) + { + var icon = this.GetOrDefault(name); + if (icon == null) + { + throw new AbpException($"No icon defined for the item with name '{name}'"); + } + + return icon.GetLocalizedIconOrDefault(cultureName); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/MarkedItems/MarkedItemIconDictionary.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/MarkedItems/MarkedItemIconDictionary.cs new file mode 100644 index 0000000000..719c216815 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/MarkedItems/MarkedItemIconDictionary.cs @@ -0,0 +1,7 @@ +using Volo.CmsKit.Web.Icons; + +namespace Volo.CmsKit.Web.MarkedItems; + +public class MarkedItemIconDictionary : LocalizableIconDictionaryBase +{ +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Reactions/ReactionIconDictionary.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Reactions/ReactionIconDictionary.cs index 76fc85d8d6..caffe48632 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Reactions/ReactionIconDictionary.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Reactions/ReactionIconDictionary.cs @@ -1,19 +1,7 @@ -using System.Collections.Generic; -using Volo.Abp; -using Volo.CmsKit.Web.Icons; +using Volo.CmsKit.Web.Icons; namespace Volo.CmsKit.Web.Reactions; -public class ReactionIconDictionary : Dictionary +public class ReactionIconDictionary : LocalizableIconDictionaryBase { - public string GetLocalizedIcon(string name, string cultureName = null) - { - var icon = this.GetOrDefault(name); - if (icon == null) - { - throw new AbpException($"No icon defined for the reaction with name '{name}'"); - } - - return icon.GetLocalizedIconOrDefault(cultureName); - } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs index 16e070769b..bd49a57b57 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs @@ -44,4 +44,9 @@ public static class CmsKitErrorCodes public const string InvalidName = "CmsKit:Media:0001"; public const string EntityTypeDoesntExist = "CmsKit:Media:0002"; } + + public static class MarkedItems + { + public const string EntityCannotBeMarked = "CmsKit:MarkedItem:0001"; + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatureDefinitionProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatureDefinitionProvider.cs index 914fcff166..6c638d64c1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatureDefinitionProvider.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatureDefinitionProvider.cs @@ -84,6 +84,15 @@ public class CmsKitFeatureDefinitionProvider : FeatureDefinitionProvider L("Feature:TagEnableDescription"), new ToggleStringValueType()); } + + if (GlobalFeatureManager.Instance.IsEnabled()) + { + group.AddFeature(CmsKitFeatures.MarkedItemEnable, + "true", + L("Feature:MarkedItemEnable"), + L("Feature:MarkedItemEnableDescription"), + new ToggleStringValueType()); + } } private static LocalizableString L(string name) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatures.cs index d23a998d0d..7f47781815 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatures.cs @@ -11,4 +11,5 @@ public static class CmsKitFeatures public const string RatingEnable = GroupName + ".RatingEnable"; public const string ReactionEnable = GroupName + ".ReactionEnable"; public const string TagEnable = GroupName + ".TagEnable"; + public const string MarkedItemEnable = GroupName + ".MarkedItemEnable"; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs index 6a7ca3245a..304562ac7c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs @@ -29,6 +29,8 @@ public class GlobalCmsKitFeatures : GlobalModuleFeatures public BlogPostScrollIndexFeature BlogPostScrollIndex => GetFeature(); + public MarkedItemsFeature MarkedItemsFeature => GetFeature(); + public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager) : base(featureManager) { @@ -43,5 +45,6 @@ public class GlobalCmsKitFeatures : GlobalModuleFeatures AddFeature(new MenuFeature(this)); AddFeature(new GlobalResourcesFeature(this)); AddFeature(new BlogPostScrollIndexFeature(this)); + AddFeature(new MarkedItemsFeature(this)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MarkedItemsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MarkedItemsFeature.cs new file mode 100644 index 0000000000..ec2f5b3383 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MarkedItemsFeature.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures; + +[GlobalFeatureName(Name)] +public class MarkedItemsFeature : GlobalFeature +{ + public const string Name = "CmsKit.MarkedItems"; + + internal MarkedItemsFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit) + { + } + + public override void Enable() + { + var userFeature = FeatureManager.Modules.CmsKit().User; + if (!userFeature.IsEnabled) + { + userFeature.Enable(); + } + + base.Enable(); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json index faf98ebbb6..8fa7bb1951 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json @@ -25,9 +25,15 @@ "CmsKit:Page:0001": "عنوان url المقدم ({Slug}) موجود بالفعل. يرجى المحاولة مع عنوان url مختلف.", "CmsKit:Rating:0001": "لا يمكن تصنيف الكيان {EntityType}.", "CmsKit:Reaction:0001": "لا يمكن أن يحتوي الكيان {EntityType} على ردود أفعال.", + "CmsKit:MarkedItem:0001": "لا يمكن أن تمييز الكيان {EntityType}.", "CmsKit:Tag:0002": "الكيان غير قابل للوسم!", "CommentAuthorizationExceptionMessage": "هذه التعليقات غير مسموح بها للعرض العام.", "CommentDeletionConfirmationMessage": "سيتم حذف هذا التعليق وجميع الردود!", + "CmsKit:Modals:Login": "تسجيل الدخول", + "CmsKit:Modals:LoginModalDefaultMessage": "سجل الدخول لتتمكن من اجراء هذه العملية", + "CmsKit:Modals:YouAreNotAuthenticated": "انت غير مصرح", + "CmsKit:MarkedItem:LoginMessage": "الرجاء تسجيل الدخول لتحديد هذا العنصر.", + "CmsKit:MarkedItem:ToggleConfirmation": "هل أنت متأكد أنك تريد تغيير حالة العنصر المميز؟", "Comments": "تعليقات", "Content": "المحتوى", "ContentDeletionConfirmationMessage": "هل أنت متأكد من حذف هذا المحتوى؟", @@ -212,6 +218,8 @@ "Feature:RatingEnableDescription": "نظام تصنيف CMS Kit الذي يسمح للمستخدمين بتقييم الكيانات مثل BlogPost.", "Feature:ReactionEnable": "رد فعل", "Feature:ReactionEnableDescription": "نظام التفاعل الخاص بـ CMS Kit الذي يسمح للمستخدمين بإرسال ردود أفعال إلى كيانات مثل BlogPost، والتعليقات، وما إلى ذلك.", + "Feature:MarkedItemEnable": "تمييز العنصر", + "Feature:MarkedItemEnableDescription": "نظام التفاعل الخاص بـ CMS Kit الذي يسمح للمستخدمين بتمييز الكيانات كجعلها مفضلة.", "Feature:TagEnable": "وضع العلامات", "Feature:TagEnableDescription": "نظام علامات CMS Kit الذي يسمح بوضع علامات على الكيانات مثل BlogPost.", "DeleteBlogPostMessage": "سيتم حذف المدونة. هل أنت متأكد؟", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 0f49bdbccf..be039c3810 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -1,249 +1,257 @@ { "culture": "en", - "texts": { - "AddSubMenuItem": "Add Sub Menu Item", - "AreYouSure": "Are You Sure?", - "BlogDeletionConfirmationMessage": "The blog '{0}' will be deleted. Are you sure?", - "BlogFeatureNotAvailable": "This feature is not available now. Enable with 'GlobalFeatureManager' to use it.", - "BlogId": "Blog", - "BlogPostDeletionConfirmationMessage": "The blog post '{0}' will be deleted. Are you sure?", - "BlogPosts": "Blog posts", - "Blogs": "Blogs", - "ChoosePreference": "Choose Preference...", - "Cms": "CMS", - "CmsKit.Comments": "Comments", - "CmsKit.Ratings": "Ratings", - "CmsKit.Reactions": "Reactions", - "CmsKit.Tags": "Tags", - "CmsKit:0002": "Content already exists!", - "CmsKit:0003": "The entity {0} is not taggable.", - "CmsKit:Blog:0001": "The given slug ({Slug}) already exists!", - "CmsKit:BlogPost:0001": "The given slug already exists!", - "CmsKit:Comments:0001": "The entity {EntityType} is not commentable.", - "CmsKit:Media:0001": "'{Name}' is not a valid media name.", - "CmsKit:Media:0002": "The entity can't have media.", - "CmsKit:Page:0001": "The given url ({Slug}) already exists. Please try with different url.", - "CmsKit:Rating:0001": "The entity {EntityType} can't be rated.", - "CmsKit:Reaction:0001": "The entity {EntityType} can't have reactions.", - "CmsKit:Tag:0002": "The entity is not taggable!", - "CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.", - "CommentDeletionConfirmationMessage": "This comment and all replies will be deleted!", - "Comments": "Comments", - "Content": "Content", - "ContentDeletionConfirmationMessage": "Are you sure to delete this content?", - "Contents": "Contents", - "CoverImage": "Cover image", - "CreateBlogPostPage": "New blog post", - "CreationTime": "Creation time", - "Delete": "Delete", - "Detail": "Detail", - "Details": "Details", - "DisplayName": "Display name", - "DoYouPreferAdditionalEmails": "Do you prefer additional emails?", - "Edit": "Edit", - "EndDate": "End date", - "EntityId": "Entity Id", - "EntityType": "Entity type", - "ExportCSV": "Export CSV", - "Features": "Features", - "GenericDeletionConfirmationMessage": "Are you sure to delete '{0}'?", - "IsActive": "Active", - "LastModification": "Last Modification", - "LastModificationTime": "Last Modification Time", - "LoginToAddComment": "Login to add comment", - "LoginToRate": "Login to rate", - "LoginToReact": "Login to react", - "LoginToReply": "Login to reply", - "MainMenu": "Main Menu", - "MakeMainMenu": "Make main menu", - "Menu:CMS": "CMS", - "Menus": "Menus", - "MenuDeletionConfirmationMessage": "The menu '{0}' will be deleted. Are you sure?", - "MenuItemDeletionConfirmationMessage": "Are sure to delete this menu item?", - "MenuItemMoveConfirmMessage": "Are you sure you want to move '{0}' under '{1}'?", - "MenuItems": "Menu items", - "Message": "Message", - "MessageDeletionConfirmationMessage": "This comment will be deleted completely.", - "NewBlog": "New blog", - "NewBlogPost": "New blog post", - "NewMenu": "New menu", - "NewMenuItem": "New root menu item", - "NewPage": "New page", - "NewTag": "New tag", - "NoMenuItems": "There is no menu item yet!", - "OK": "OK", - "PageDeletionConfirmationMessage": "Are you sure to delete this page?", - "PageId": "Page", - "Pages": "Pages", - "PageSlugInformation": "Slug is used on url. Your url will be '/{{slug}}'.", - "BlogSlugInformation": "Slug is used on url. Your url will be '/{0}/{{slug}}'.", - "Permission:BlogManagement": "Blog management", - "Permission:BlogManagement.Create": "Create", - "Permission:BlogManagement.Delete": "Delete", - "Permission:BlogManagement.Features": "Features", - "Permission:BlogManagement.Update": "Update", - "Permission:BlogPostManagement": "Blog post management", - "Permission:BlogPostManagement.Create": "Create", - "Permission:BlogPostManagement.Delete": "Delete", - "Permission:BlogPostManagement.Update": "Update", - "Permission:BlogPostManagement.Publish": "Publish", - "Permission:CmsKit": "CmsKit admin", - "Permission:Comments": "Comment management", - "Permission:Comments.Delete": "Delete", - "Permission:Contents": "Content management", - "Permission:Contents.Create": "Create content", - "Permission:Contents.Delete": "Delete content", - "Permission:Contents.Update": "Update content", - "Permission:MediaDescriptorManagement": "Media management", - "Permission:MediaDescriptorManagement:Create": "Create", - "Permission:MediaDescriptorManagement:Delete": "Delete", - "Permission:MenuItemManagement": "Menu item management", - "Permission:MenuItemManagement.Create": "Create", - "Permission:MenuItemManagement.Delete": "Delete", - "Permission:MenuItemManagement.Update": "Update", - "Permission:MenuManagement": "Menu management", - "Permission:MenuManagement.Create": "Create", - "Permission:MenuManagement.Delete": "Delete", - "Permission:MenuManagement.Update": "Update", - "Permission:Menus": "Menu management", - "Permission:Menus.Create": "Create", - "Permission:Menus.Delete": "Delete", - "Permission:Menus.Update": "Update", - "Permission:PageManagement": "Page management", - "Permission:PageManagement:Create": "Create", - "Permission:PageManagement:Delete": "Delete", - "Permission:PageManagement:Update": "Update", - "Permission:PageManagement:SetAsHomePage": "Set as home page", - "Permission:TagManagement": "Tag management", - "Permission:TagManagement.Create": "Create", - "Permission:TagManagement.Delete": "Delete", - "Permission:TagManagement.Update": "Update", - "Permission:GlobalResources": "Global resources", - "Permission:CmsKitPublic": "CmsKit public", - "Permission:Comments.DeleteAll": "Delete all", - "PickYourReaction": "Pick your reaction", - "Rating": "Rating", - "RatingUndoMessage": "Your rating will be undo.", - "Reactions": "Reactions", - "Read": "Read", - "RepliesToThisComment": "Replies to this comment", - "Reply": "Reply", - "ReplyTo": "Reply to", - "SamplePageMessage": "A sample page for the Pro module", - "SaveChanges": "Save changes", - "Script": "Script", - "SelectAll": "Select all", - "Send": "Send", - "SendMessage": "Send Message", - "SelectedAuthor": "Author", - "ShortDescription": "Short description", - "Slug": "Slug", - "Source": "Source", - "SourceUrl": "Source Url", - "Star": "Star", - "StartDate": "Start Date", - "Style": "Style", - "Subject": "Subject", - "SubjectPlaceholder": "Please type a subject", - "Submit": "Submit", - "Subscribe": "Subscribe", - "SavedSuccessfully": "Saved successfully!", - "TagDeletionConfirmationMessage": "Are you sure to delete '{0}' tag?", - "Tags": "Tags", - "Text": "Text", - "ThankYou": "Thank you", - "Title": "Title", - "Undo": "Undo", - "Update": "Update", - "UpdatePreferenceSuccessMessage": "Your preferences have been saved.", - "UpdateYourEmailPreferences": "Update your email preferences", - "UnMakeMainMenu": "Unmake Main Menu", - "UploadFailedMessage": "Upload failed.", - "UserId": "User Id", - "Username": "Username", - "YourComment": "Your comment", - "YourEmailAddress": "Your e-mail address", - "YourFullName": "Your full name", - "YourMessage": "Your Message", - "YourReply": "Your reply", - "MarkdownSupported": "
Markdown supported.", - "GlobalResources": "Global resources", - "CmsKit.BlogPost.Status.0": "Draft", - "CmsKit.BlogPost.Status.1": "Published", - "CmsKit.BlogPost.Status.2": "Waiting for review", - "BlogPostPublishConfirmationMessage": "Are you sure to publish the blog post \"{0}\"?", - "SuccessfullyPublished": "Successfully published!", - "Draft": "Draft", - "Publish": "Publish", - "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?", - "BlogPostSendToReviewConfirmationMessage": "Are you sure to send the blog post \"{0}\" to admin review for publishing?", - "SaveAsDraft": "Save as draft", - "SendToReview": "Send to review", - "SendToReviewToPublish": "Send to review to publish", - "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing.", - "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list.", - "SelectAStatus": "Select a status", - "Status": "Status", - "CmsKit.BlogPost.ScrollIndex": "Quick navigation bar in blog posts", - "CmsKit.BlogPost.PreventXssFeature": "Prevent XSS", - "Add": "Add", - "AddWidget": "Add Widget", - "PleaseConfigureWidgets": "Please configure widgets", - "SelectAnAuthor": "Select an Author", - "InThisDocument": "In This Document", - "GoToTop": "Go To Top", - "SetAsHomePage": "Change Home Page Status", - "CompletedSettingAsHomePage": "Set as home page", - "IsHomePage": "Is Home Page", - "RemovedSettingAsHomePage": "Removed setting the home page", - "Feature:CmsKitGroup": "Cms kit", - "Feature:BlogEnable": "Blogpost", - "Feature:BlogEnableDescription": "CMS Kit's blogpost system that allows create blogs and posts dynamically in the application.", - "Feature:CommentEnable": "Commenting", - "Feature:CommentEnableDescription": "CMS Kit's comment system allows commenting on entities such as BlogPost.", - "Feature:GlobalResourceEnable": "Global resourcing", - "Feature:GlobalResourceEnableDescription": "CMS Kit's global resoruces feature that allows managing global styles & scripts.", - "Feature:MenuEnable": "Menu", - "Feature:MenuEnableDescription": "CMS Kit's dynamic menu system that allows adding/removing application menus dynamically.", - "Feature:PageEnable": "Paging", - "Feature:PageEnableDescription": "CMS Kit's page system that allows creating static pages with specific URL.", - "Feature:RatingEnable": "Rating", - "Feature:RatingEnableDescription": "CMS Kit's rating system that allows users to rate entities such as BlogPost.", - "Feature:ReactionEnable": "Reaction", - "Feature:ReactionEnableDescription": "CMS Kit's reaction system that allows users to send reactions to entities such as BlogPost, Comments, etc.", - "Feature:TagEnable": "Taging", - "Feature:TagEnableDescription": "CMS Kit's tag system that allows tagging entities such as BlogPost.", - "DeleteBlogPostMessage": "The blog will be deleted. Are you sure?", - "CaptchaCode": "Captcha code", - "CommentTextRequired": "Comment is required", - "CaptchaCodeErrorMessage": "The answer you entered for the CAPTCHA was not correct. Please try again", - "CaptchaCodeMissingMessage": "The captcha code is missing!", - "UnAllowedExternalUrlMessage": "You included an unallowed external URL. Please try again without the external URL.", - "URL": "URL", - "PopularTags": "Popular Tags", - "RemoveCoverImageConfirmationMessage": "Are you sure you want to remove the cover image?", - "RemoveCoverImage": "Remove cover image", - "CssClass": "CSS Class", - "TagsHelpText": "Tags should be comma-separated (e.g.: tag1, tag2, tag3)", - "ThisPartOfContentCouldntBeLoaded": "This part of content couldn't be loaded.", - "DuplicateCommentAttemptMessage": "Duplicate comment post attempt detected. Your comment has already been submitted.", - "NoBlogPostYet": "No blog post yet!", - "CmsKit:Comment": "Comment", - "CmsKitCommentOptions:RequireApprovement": "Require approval for comments", - "CmsKitCommentOptions:RequireApprovementDescription": "When enabled, comments will require approval before being published.", - "CommentFilter:ApproveState":"Approve State", - "ApproveState": "Approve State", - "CommentFilter:0":"All", - "CommentFilter:1":"Approved", - "CommentFilter:2":"Disapproved", - "CommentFilter:4":"Waiting", - "ApprovedSuccessfully":"Approved Successfully", - "ApprovalRevokedSuccessfully":"Approval Revoked Successfully", - "Approve":"Approve", - "Disapproved":"Disapproved", - "CommentAlertMessage":"There are {0} comments waiting for approval", - "Settings:Menu:CmsKit":"CMS", - "CommentsAwaitingApproval":"Comments Awaiting Approval", - "CommentSubmittedForApproval": "Your comment has been submitted for approval.", - } + "texts": { + "AddSubMenuItem": "Add Sub Menu Item", + "AreYouSure": "Are You Sure?", + "BlogDeletionConfirmationMessage": "The blog '{0}' will be deleted. Are you sure?", + "BlogFeatureNotAvailable": "This feature is not available now. Enable with 'GlobalFeatureManager' to use it.", + "BlogId": "Blog", + "BlogPostDeletionConfirmationMessage": "The blog post '{0}' will be deleted. Are you sure?", + "BlogPosts": "Blog posts", + "Blogs": "Blogs", + "ChoosePreference": "Choose Preference...", + "Cms": "CMS", + "CmsKit.Comments": "Comments", + "CmsKit.Ratings": "Ratings", + "CmsKit.Reactions": "Reactions", + "CmsKit.Tags": "Tags", + "CmsKit:0002": "Content already exists!", + "CmsKit:0003": "The entity {0} is not taggable.", + "CmsKit:Blog:0001": "The given slug ({Slug}) already exists!", + "CmsKit:BlogPost:0001": "The given slug already exists!", + "CmsKit:Comments:0001": "The entity {EntityType} is not commentable.", + "CmsKit:Media:0001": "'{Name}' is not a valid media name.", + "CmsKit:Media:0002": "The entity can't have media.", + "CmsKit:Page:0001": "The given url ({Slug}) already exists. Please try with different url.", + "CmsKit:Rating:0001": "The entity {EntityType} can't be rated.", + "CmsKit:Reaction:0001": "The entity {EntityType} can't have reactions.", + "CmsKit:Tag:0002": "The entity is not taggable!", + "CmsKit:MarkedItem:ToggleConfirmation": "Are you sure you want to toggle the marked item?", + "CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.", + "CmsKit:Modals:Login": "Login", + "CmsKit:Modals:LoginModalDefaultMessage": "Please login to continue!", + "CmsKit:Modals:YouAreNotAuthenticated": "This operation is not authorized for you.", + "CommentDeletionConfirmationMessage": "This comment and all replies will be deleted!", + "CmsKit:MarkedItem:0001": "The entity {EntityType} can't be marked.", + "CmsKit:MarkedItem:LoginMessage": "Please login to mark this item.", + "Comments": "Comments", + "Content": "Content", + "ContentDeletionConfirmationMessage": "Are you sure to delete this content?", + "Contents": "Contents", + "CoverImage": "Cover image", + "CreateBlogPostPage": "New blog post", + "CreationTime": "Creation time", + "Delete": "Delete", + "Detail": "Detail", + "Details": "Details", + "DisplayName": "Display name", + "DoYouPreferAdditionalEmails": "Do you prefer additional emails?", + "Edit": "Edit", + "EndDate": "End date", + "EntityId": "Entity Id", + "EntityType": "Entity type", + "ExportCSV": "Export CSV", + "Features": "Features", + "GenericDeletionConfirmationMessage": "Are you sure to delete '{0}'?", + "IsActive": "Active", + "LastModification": "Last Modification", + "LastModificationTime": "Last Modification Time", + "LoginToAddComment": "Login to add comment", + "LoginToRate": "Login to rate", + "LoginToReact": "Login to react", + "LoginToReply": "Login to reply", + "MainMenu": "Main Menu", + "MakeMainMenu": "Make main menu", + "Menu:CMS": "CMS", + "Menus": "Menus", + "MenuDeletionConfirmationMessage": "The menu '{0}' will be deleted. Are you sure?", + "MenuItemDeletionConfirmationMessage": "Are sure to delete this menu item?", + "MenuItemMoveConfirmMessage": "Are you sure you want to move '{0}' under '{1}'?", + "MenuItems": "Menu items", + "Message": "Message", + "MessageDeletionConfirmationMessage": "This comment will be deleted completely.", + "NewBlog": "New blog", + "NewBlogPost": "New blog post", + "NewMenu": "New menu", + "NewMenuItem": "New root menu item", + "NewPage": "New page", + "NewTag": "New tag", + "NoMenuItems": "There is no menu item yet!", + "OK": "OK", + "PageDeletionConfirmationMessage": "Are you sure to delete this page?", + "PageId": "Page", + "Pages": "Pages", + "PageSlugInformation": "Slug is used on url. Your url will be '/{{slug}}'.", + "BlogSlugInformation": "Slug is used on url. Your url will be '/{0}/{{slug}}'.", + "Permission:BlogManagement": "Blog management", + "Permission:BlogManagement.Create": "Create", + "Permission:BlogManagement.Delete": "Delete", + "Permission:BlogManagement.Features": "Features", + "Permission:BlogManagement.Update": "Update", + "Permission:BlogPostManagement": "Blog post management", + "Permission:BlogPostManagement.Create": "Create", + "Permission:BlogPostManagement.Delete": "Delete", + "Permission:BlogPostManagement.Update": "Update", + "Permission:BlogPostManagement.Publish": "Publish", + "Permission:CmsKit": "CmsKit admin", + "Permission:Comments": "Comment management", + "Permission:Comments.Delete": "Delete", + "Permission:Contents": "Content management", + "Permission:Contents.Create": "Create content", + "Permission:Contents.Delete": "Delete content", + "Permission:Contents.Update": "Update content", + "Permission:MediaDescriptorManagement": "Media management", + "Permission:MediaDescriptorManagement:Create": "Create", + "Permission:MediaDescriptorManagement:Delete": "Delete", + "Permission:MenuItemManagement": "Menu item management", + "Permission:MenuItemManagement.Create": "Create", + "Permission:MenuItemManagement.Delete": "Delete", + "Permission:MenuItemManagement.Update": "Update", + "Permission:MenuManagement": "Menu management", + "Permission:MenuManagement.Create": "Create", + "Permission:MenuManagement.Delete": "Delete", + "Permission:MenuManagement.Update": "Update", + "Permission:Menus": "Menu management", + "Permission:Menus.Create": "Create", + "Permission:Menus.Delete": "Delete", + "Permission:Menus.Update": "Update", + "Permission:PageManagement": "Page management", + "Permission:PageManagement:Create": "Create", + "Permission:PageManagement:Delete": "Delete", + "Permission:PageManagement:Update": "Update", + "Permission:PageManagement:SetAsHomePage": "Set as home page", + "Permission:TagManagement": "Tag management", + "Permission:TagManagement.Create": "Create", + "Permission:TagManagement.Delete": "Delete", + "Permission:TagManagement.Update": "Update", + "Permission:GlobalResources": "Global resources", + "Permission:CmsKitPublic": "CmsKit public", + "Permission:Comments.DeleteAll": "Delete all", + "PickYourReaction": "Pick your reaction", + "Rating": "Rating", + "RatingUndoMessage": "Your rating will be undo.", + "Reactions": "Reactions", + "Read": "Read", + "RepliesToThisComment": "Replies to this comment", + "Reply": "Reply", + "ReplyTo": "Reply to", + "SamplePageMessage": "A sample page for the Pro module", + "SaveChanges": "Save changes", + "Script": "Script", + "SelectAll": "Select all", + "Send": "Send", + "SendMessage": "Send Message", + "SelectedAuthor": "Author", + "ShortDescription": "Short description", + "Slug": "Slug", + "Source": "Source", + "SourceUrl": "Source Url", + "Star": "Star", + "StartDate": "Start Date", + "Style": "Style", + "Subject": "Subject", + "SubjectPlaceholder": "Please type a subject", + "Submit": "Submit", + "Subscribe": "Subscribe", + "SavedSuccessfully": "Saved successfully!", + "TagDeletionConfirmationMessage": "Are you sure to delete '{0}' tag?", + "Tags": "Tags", + "Text": "Text", + "ThankYou": "Thank you", + "Title": "Title", + "Undo": "Undo", + "Update": "Update", + "UpdatePreferenceSuccessMessage": "Your preferences have been saved.", + "UpdateYourEmailPreferences": "Update your email preferences", + "UnMakeMainMenu": "Unmake Main Menu", + "UploadFailedMessage": "Upload failed.", + "UserId": "User Id", + "Username": "Username", + "YourComment": "Your comment", + "YourEmailAddress": "Your e-mail address", + "YourFullName": "Your full name", + "YourMessage": "Your Message", + "YourReply": "Your reply", + "MarkdownSupported": "Markdown supported.", + "GlobalResources": "Global resources", + "CmsKit.BlogPost.Status.0": "Draft", + "CmsKit.BlogPost.Status.1": "Published", + "CmsKit.BlogPost.Status.2": "Waiting for review", + "BlogPostPublishConfirmationMessage": "Are you sure to publish the blog post \"{0}\"?", + "SuccessfullyPublished": "Successfully published!", + "Draft": "Draft", + "Publish": "Publish", + "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?", + "BlogPostSendToReviewConfirmationMessage": "Are you sure to send the blog post \"{0}\" to admin review for publishing?", + "SaveAsDraft": "Save as draft", + "SendToReview": "Send to review", + "SendToReviewToPublish": "Send to review to publish", + "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing.", + "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list.", + "SelectAStatus": "Select a status", + "Status": "Status", + "CmsKit.BlogPost.ScrollIndex": "Quick navigation bar in blog posts", + "CmsKit.BlogPost.PreventXssFeature": "Prevent XSS", + "Add": "Add", + "AddWidget": "Add Widget", + "PleaseConfigureWidgets": "Please configure widgets", + "SelectAnAuthor": "Select an Author", + "InThisDocument": "In This Document", + "GoToTop": "Go To Top", + "SetAsHomePage": "Change Home Page Status", + "CompletedSettingAsHomePage": "Set as home page", + "IsHomePage": "Is Home Page", + "RemovedSettingAsHomePage": "Removed setting the home page", + "Feature:CmsKitGroup": "Cms kit", + "Feature:BlogEnable": "Blogpost", + "Feature:BlogEnableDescription": "CMS Kit's blogpost system that allows create blogs and posts dynamically in the application.", + "Feature:CommentEnable": "Commenting", + "Feature:CommentEnableDescription": "CMS Kit's comment system allows commenting on entities such as BlogPost.", + "Feature:GlobalResourceEnable": "Global resourcing", + "Feature:GlobalResourceEnableDescription": "CMS Kit's global resoruces feature that allows managing global styles & scripts.", + "Feature:MenuEnable": "Menu", + "Feature:MenuEnableDescription": "CMS Kit's dynamic menu system that allows adding/removing application menus dynamically.", + "Feature:PageEnable": "Paging", + "Feature:PageEnableDescription": "CMS Kit's page system that allows creating static pages with specific URL.", + "Feature:RatingEnable": "Rating", + "Feature:RatingEnableDescription": "CMS Kit's rating system that allows users to rate entities such as BlogPost.", + "Feature:ReactionEnable": "Reaction", + "Feature:ReactionEnableDescription": "CMS Kit's reaction system that allows users to send reactions to entities such as BlogPost, Comments, etc.", + "Feature:TagEnable": "Taging", + "Feature:TagEnableDescription": "CMS Kit's tag system that allows tagging entities such as BlogPost.", + "Feature:MarkedItemEnable": "Marked Item", + "Feature:MarkedItemEnableDescription": "The CMS Kit's marking system that allows users to mark entities as favorites.", + "DeleteBlogPostMessage": "The blog will be deleted. Are you sure?", + "CaptchaCode": "Captcha code", + "CommentTextRequired": "Comment is required", + "CaptchaCodeErrorMessage": "The answer you entered for the CAPTCHA was not correct. Please try again", + "CaptchaCodeMissingMessage": "The captcha code is missing!", + "UnAllowedExternalUrlMessage": "You included an unallowed external URL. Please try again without the external URL.", + "URL": "URL", + "PopularTags": "Popular Tags", + "RemoveCoverImageConfirmationMessage": "Are you sure you want to remove the cover image?", + "RemoveCoverImage": "Remove cover image", + "CssClass": "CSS Class", + "TagsHelpText": "Tags should be comma-separated (e.g.: tag1, tag2, tag3)", + "ThisPartOfContentCouldntBeLoaded": "This part of content couldn't be loaded.", + "DuplicateCommentAttemptMessage": "Duplicate comment post attempt detected. Your comment has already been submitted.", + "NoBlogPostYet": "No blog post yet!", + "CmsKit:Comment": "Comment", + "CmsKitCommentOptions:RequireApprovement": "Require approval for comments", + "CmsKitCommentOptions:RequireApprovementDescription": "When enabled, comments will require approval before being published.", + "CommentFilter:ApproveState": "Approve State", + "ApproveState": "Approve State", + "CommentFilter:0": "All", + "CommentFilter:1": "Approved", + "CommentFilter:2": "Disapproved", + "CommentFilter:4": "Waiting", + "ApprovedSuccessfully": "Approved Successfully", + "ApprovalRevokedSuccessfully": "Approval Revoked Successfully", + "Approve": "Approve", + "Disapproved": "Disapproved", + "CommentAlertMessage": "There are {0} comments waiting for approval", + "Settings:Menu:CmsKit": "CMS", + "CommentsAwaitingApproval": "Comments Awaiting Approval", + "CommentSubmittedForApproval": "Your comment has been submitted for approval." + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/MarkedItems/StandardMarkedItems.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/MarkedItems/StandardMarkedItems.cs new file mode 100644 index 0000000000..99f6ec59fa --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/MarkedItems/StandardMarkedItems.cs @@ -0,0 +1,9 @@ +namespace Volo.CmsKit.MarkedItems; + +public static class StandardMarkedItems +{ + public const string Favorite = "_FA"; + public const string Flagged = "_FL"; + public const string Bookmark = "_BO"; + public const string Starred = "_ST"; +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/MarkedItems/UserMarkedItemConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/MarkedItems/UserMarkedItemConsts.cs new file mode 100644 index 0000000000..6cca2ef081 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/MarkedItems/UserMarkedItemConsts.cs @@ -0,0 +1,9 @@ +using Volo.CmsKit.Entities; + +namespace Volo.CmsKit.MarkedItems; +public static class UserMarkedItemConsts +{ + public static int MaxEntityTypeLength { get; set; } = CmsEntityConsts.MaxEntityTypeLength; + + public static int MaxEntityIdLength { get; set; } = CmsEntityConsts.MaxEntityIdLength; +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/CmsKitMarkedItemOptions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/CmsKitMarkedItemOptions.cs new file mode 100644 index 0000000000..9dd228b8e4 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/CmsKitMarkedItemOptions.cs @@ -0,0 +1,10 @@ +using JetBrains.Annotations; +using System.Collections.Generic; + +namespace Volo.CmsKit.MarkedItems; + +public class CmsKitMarkedItemOptions +{ + [NotNull] + public List EntityTypes { get; } = new(); +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DefaultMarkedItemDefinitionStore.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DefaultMarkedItemDefinitionStore.cs new file mode 100644 index 0000000000..e208719740 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DefaultMarkedItemDefinitionStore.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.Extensions.Options; +using Volo.Abp; + +namespace Volo.CmsKit.MarkedItems; + +public class DefaultMarkedItemDefinitionStore : IMarkedItemDefinitionStore +{ + protected CmsKitMarkedItemOptions Options { get; } + + public DefaultMarkedItemDefinitionStore(IOptions options) + { + Options = options.Value; + } + + public virtual Task IsDefinedAsync([NotNull] string entityType) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + + var isDefined = Options.EntityTypes.Any(x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)); + + return Task.FromResult(isDefined); + } + + public virtual Task GetAsync([NotNull] string entityType) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + + var definition = Options.EntityTypes.SingleOrDefault(x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)); + + return Task.FromResult(definition); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/EntityCannotBeMarkedException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/EntityCannotBeMarkedException.cs new file mode 100644 index 0000000000..79c6f93fce --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/EntityCannotBeMarkedException.cs @@ -0,0 +1,16 @@ +using JetBrains.Annotations; +using Volo.Abp; + +namespace Volo.CmsKit.MarkedItems; + +public class EntityCannotBeMarkedException : BusinessException +{ + public EntityCannotBeMarkedException([NotNull] string entityType) + { + EntityType = Check.NotNullOrEmpty(entityType, nameof(entityType)); + Code = CmsKitErrorCodes.MarkedItems.EntityCannotBeMarked; + WithData(nameof(EntityType), EntityType); + } + + public string EntityType { get; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IMarkedItemDefinitionStore.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IMarkedItemDefinitionStore.cs new file mode 100644 index 0000000000..64282d7de4 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IMarkedItemDefinitionStore.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; +using JetBrains.Annotations; + +namespace Volo.CmsKit.MarkedItems; + +public interface IMarkedItemDefinitionStore : IEntityTypeDefinitionStore +{ +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IUserMarkedItemRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IUserMarkedItemRepository.cs new file mode 100644 index 0000000000..e0482a8e1b --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IUserMarkedItemRepository.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Domain.Repositories; + +namespace Volo.CmsKit.MarkedItems; + +public interface IUserMarkedItemRepository : IBasicRepository +{ + Task FindAsync( + Guid userId, + [NotNull] string entityType, + [NotNull] string entityId, + CancellationToken cancellationToken = default + ); + + Task> GetListForUserAsync( + Guid userId, + [NotNull] string entityType, + CancellationToken cancellationToken = default + ); + + Task> GetQueryForUserAsync( + [NotNull] string entityType, + [NotNull] Guid userId, + CancellationToken cancellationToken = default + ); +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemEntityTypeDefinition.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemEntityTypeDefinition.cs new file mode 100644 index 0000000000..c674d6d093 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemEntityTypeDefinition.cs @@ -0,0 +1,16 @@ +using JetBrains.Annotations; +using Volo.Abp; + +namespace Volo.CmsKit.MarkedItems; + +public class MarkedItemEntityTypeDefinition : EntityTypeDefinition +{ + public string IconName { get; set; } + public MarkedItemEntityTypeDefinition( + [NotNull] string entityType, + [NotNull] string iconName) : base(entityType) + { + Check.NotNull(iconName, nameof(iconName)); + IconName = iconName; + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs new file mode 100644 index 0000000000..13510be7ac --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs @@ -0,0 +1,58 @@ +using System; +using JetBrains.Annotations; +using System.Threading.Tasks; +using Volo.Abp; + +namespace Volo.CmsKit.MarkedItems; +public class MarkedItemManager : CmsKitDomainServiceBase +{ + IMarkedItemDefinitionStore MarkedItemDefinitionStore { get; set; } + IUserMarkedItemRepository UserMarkedItemRepository { get; set; } + public MarkedItemManager( + IUserMarkedItemRepository userMarkedItemRepository, + IMarkedItemDefinitionStore markedItemDefinitionStore) + { + UserMarkedItemRepository = userMarkedItemRepository; + MarkedItemDefinitionStore = markedItemDefinitionStore; + } + + public virtual async Task ToggleAsync( + Guid creatorId, + [NotNull] string entityType, + [NotNull] string entityId) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + + var markedItem = await UserMarkedItemRepository.FindAsync(creatorId, entityType, entityId); + if (markedItem != null) + { + await UserMarkedItemRepository.DeleteAsync(markedItem); + return false; + } + + if (!await MarkedItemDefinitionStore.IsDefinedAsync(entityType)) + { + throw new EntityCannotBeMarkedException(entityType); + } + + await UserMarkedItemRepository.InsertAsync( + new UserMarkedItem( + GuidGenerator.Create(), + entityType, + entityId, + creatorId, + CurrentTenant.Id + ) + ); + return true; + } + + public virtual async Task GetAsync( + [NotNull] string entityType) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + + return await MarkedItemDefinitionStore.GetAsync(entityType); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/UserMarkedItem.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/UserMarkedItem.cs new file mode 100644 index 0000000000..24fddd1382 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/UserMarkedItem.cs @@ -0,0 +1,36 @@ +using System; +using Volo.Abp; +using Volo.Abp.Auditing; +using JetBrains.Annotations; +using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; + +namespace Volo.CmsKit.MarkedItems; + +public class UserMarkedItem : BasicAggregateRoot, IHasCreationTime, IMustHaveCreator, IMultiTenant +{ + public virtual Guid? TenantId { get; protected set; } + + public virtual Guid CreatorId { get; set; } + + public virtual DateTime CreationTime { get; set; } + + public string EntityId { get; protected set; } + public string EntityType { get; protected set; } + + protected UserMarkedItem() { } + + internal UserMarkedItem( + Guid id, + [NotNull] string entityType, + [NotNull] string entityId, + Guid creatorId, + Guid? tenantId = null) + : base(id) + { + EntityType = Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + EntityId = Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + CreatorId = creatorId; + TenantId = tenantId; + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs index 265495f5bf..f5720903da 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs @@ -4,6 +4,7 @@ using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalResources; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -30,6 +31,7 @@ public class CmsKitDbContext : AbpDbContext, ICmsKitDbContext public DbSet MediaDescriptors { get; set; } public DbSet MenuItems { get; set; } public DbSet GlobalResources { get; set; } + public DbSet UserMarkedItems { get; set; } public CmsKitDbContext(DbContextOptions options) : base(options) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index b81eb4f31d..b453f52fc5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -7,6 +7,7 @@ using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalResources; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -285,6 +286,28 @@ public static class CmsKitDbContextModelCreatingExtensions builder.Ignore(); } + if (GlobalFeatureManager.Instance.IsEnabled()) + { + builder.Entity(b => + { + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "UserMarkedItems", AbpCmsKitDbProperties.DbSchema); + + b.ConfigureByConvention(); + + b.Property(x => x.EntityType).IsRequired(); + b.Property(x => x.EntityId).IsRequired(); + + b.HasIndex(x => new { x.TenantId, x.EntityType, x.EntityId }); + b.HasIndex(x => new { x.TenantId, x.CreatorId, x.EntityType, x.EntityId }); + + b.ApplyObjectExtensionMappings(); + }); + } + else + { + builder.Ignore(); + } + builder.TryConfigureObjectExtensions(); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs index 649da3c4cb..26a0a2dd7d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs @@ -11,6 +11,7 @@ using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; using Volo.CmsKit.Tags; using Volo.CmsKit.Users; +using Volo.CmsKit.MarkedItems; namespace Volo.CmsKit.EntityFrameworkCore; @@ -37,6 +38,7 @@ public class CmsKitEntityFrameworkCoreModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs index 8b6edc1cbe..6968c609e6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs @@ -4,6 +4,7 @@ using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalResources; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -30,4 +31,5 @@ public interface ICmsKitDbContext : IEfCoreDbContext DbSet MediaDescriptors { get; } DbSet MenuItems { get; } DbSet GlobalResources { get; } + DbSet UserMarkedItems { get; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs new file mode 100644 index 0000000000..66c9fc0ee3 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using Volo.Abp; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +namespace Volo.CmsKit.MarkedItems; +public class EfCoreUserMarkedItemRepository : EfCoreRepository, IUserMarkedItemRepository +{ + public EfCoreUserMarkedItemRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public async Task FindAsync(Guid userId, [NotNull] string entityType, [NotNull] string entityId, CancellationToken cancellationToken = default) + { + Check.NotNull(userId, nameof(userId)); + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNull(entityId, nameof(entityId)); + + var entity = await(await GetDbSetAsync()) + .Where(x => + x.CreatorId == userId && + x.EntityType == entityType && + x.EntityId == entityId) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + + return entity; + } + + public async Task> GetListForUserAsync(Guid userId, [NotNull] string entityType, CancellationToken cancellationToken = default) + { + Check.NotNull(userId, nameof(userId)); + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + + return await(await GetDbSetAsync()) + .Where(x => + x.CreatorId == userId && + x.EntityType == entityType) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + /// + /// Retrieves an IQueryable representing the user's marked items based on the specified entity type and user ID. + /// + /// The type of entity to filter by. + /// The ID of the user whose marked items are being retrieved. + /// Cancellation token. + /// An IQueryable representing the user's marked items filtered by the specified entity type and user ID. + public async Task> GetQueryForUserAsync([NotNull] string entityType, [NotNull] Guid userId, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNull(userId, nameof(userId)); + + var dbSet = await GetDbSetAsync(); + + var query = dbSet + .Where(x => x.EntityType == entityType && x.CreatorId == userId); + + return query; + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs index c6a97dfbef..8d594b38f3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs @@ -4,6 +4,7 @@ using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalResources; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -44,6 +45,8 @@ public class CmsKitMongoDbContext : AbpMongoDbContext, ICmsKitMongoDbContext public IMongoCollection GlobalResources => Collection(); + public IMongoCollection UserMarkedItems => Collection(); + protected override void CreateModel(IMongoModelBuilder modelBuilder) { base.CreateModel(modelBuilder); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs index b6127ab125..85a5db2aed 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs @@ -3,6 +3,7 @@ using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalResources; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -84,5 +85,10 @@ public static class CmsKitMongoDbContextExtensions { x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "GlobalResources"; }); + + builder.Entity(x => + { + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "UserMarkedItems"; + }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs index 704c61bad9..3d27912ac1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs @@ -5,11 +5,13 @@ using Volo.Abp.Users.MongoDB; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalResources; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.MongoDB.Blogs; using Volo.CmsKit.MongoDB.Comments; using Volo.CmsKit.MongoDB.GlobalResources; +using Volo.CmsKit.MongoDB.MarkedItems; using Volo.CmsKit.MongoDB.MediaDescriptors; using Volo.CmsKit.MongoDB.Menus; using Volo.CmsKit.MongoDB.Pages; @@ -48,6 +50,7 @@ public class CmsKitMongoDbModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs index e220aff46e..7b7e51deff 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs @@ -4,6 +4,7 @@ using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalResources; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -43,4 +44,6 @@ public interface ICmsKitMongoDbContext : IAbpMongoDbContext IMongoCollection MenuItems { get; } IMongoCollection GlobalResources { get; } + + IMongoCollection UserMarkedItems { get; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/MarkedItems/MongoUserMarkedItemRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/MarkedItems/MongoUserMarkedItemRepository.cs new file mode 100644 index 0000000000..9339a6cb49 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/MarkedItems/MongoUserMarkedItemRepository.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using JetBrains.Annotations; +using Volo.Abp; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; +using Volo.CmsKit.MarkedItems; + +namespace Volo.CmsKit.MongoDB.MarkedItems; +public class MongoUserMarkedItemRepository : MongoDbRepository, IUserMarkedItemRepository +{ + public MongoUserMarkedItemRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public virtual async Task FindAsync(Guid userId, [NotNull] string entityType, [NotNull] string entityId, CancellationToken cancellationToken = default) + { + Check.NotNull(userId, nameof(userId)); + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNull(entityId, nameof(entityId)); + + var entity = await (await GetMongoQueryableAsync(cancellationToken)) + .Where(x => + x.CreatorId == userId && + x.EntityType == entityType && + x.EntityId == entityId) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + + return entity; + } + + public virtual async Task> GetListForUserAsync(Guid userId, [NotNull] string entityType, CancellationToken cancellationToken = default) + { + Check.NotNull(userId, nameof(userId)); + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + + return await(await GetMongoQueryableAsync(cancellationToken)) + .Where(x => + x.CreatorId == userId && + x.EntityType == entityType) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + /// + /// Retrieves an IQueryable representing the user's marked items based on the specified entity type and user ID. + /// + /// The type of entity to filter by. + /// The ID of the user whose marked items are being retrieved. + /// Cancellation token. + /// An IQueryable representing the user's marked items filtered by the specified entity type and user ID. + public virtual async Task> GetQueryForUserAsync([NotNull] string entityType, [NotNull] Guid userId, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNull(userId, nameof(userId)); + + var queryable = await GetMongoQueryableAsync(cancellationToken); + var query = queryable + .Where(x => x.EntityType == entityType && x.CreatorId == userId); + + return query; + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs new file mode 100644 index 0000000000..491a425f15 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace Volo.CmsKit.Public.MarkedItems; + +public interface IMarkedItemPublicAppService : IApplicationService +{ + Task GetForToggleAsync(string entityType, string entityId); + Task ToggleAsync(string entityType, string entityId); +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/MarkedItemDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/MarkedItemDto.cs new file mode 100644 index 0000000000..a546641f03 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/MarkedItemDto.cs @@ -0,0 +1,11 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.CmsKit.Public.MarkedItems; + +[Serializable] +public class MarkedItemDto +{ + [NotNull] + public string IconName { get; set; } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/MarkedItemWithToggleDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/MarkedItemWithToggleDto.cs new file mode 100644 index 0000000000..e3743cbed2 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/MarkedItemWithToggleDto.cs @@ -0,0 +1,11 @@ +using System; + +namespace Volo.CmsKit.Public.MarkedItems; + +[Serializable] +public class MarkedItemWithToggleDto +{ + public MarkedItemDto MarkedItem { get; set; } + + public bool IsMarkedByCurrentUser { get; set; } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs new file mode 100644 index 0000000000..db06ff2f07 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs @@ -0,0 +1,69 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Dtos; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Users; +using Volo.CmsKit.GlobalFeatures; +using Volo.CmsKit.MarkedItems; + +namespace Volo.CmsKit.Public.MarkedItems; + +[RequiresGlobalFeature(typeof(MarkedItemsFeature))] +public class MarkedItemPublicAppService : CmsKitPublicAppServiceBase, IMarkedItemPublicAppService +{ + public IMarkedItemDefinitionStore MarkedItemDefinitionStore { get; } + + public IUserMarkedItemRepository UserMarkedItemRepository { get; } + + public MarkedItemManager MarkedItemManager { get; } + + public MarkedItemPublicAppService( + IMarkedItemDefinitionStore markedItemDefinitionStore, + IUserMarkedItemRepository userMarkedItemRepository, + MarkedItemManager markedItemManager) + { + MarkedItemDefinitionStore = markedItemDefinitionStore; + UserMarkedItemRepository = userMarkedItemRepository; + MarkedItemManager = markedItemManager; + } + + [AllowAnonymous] + public virtual async Task GetForToggleAsync(string entityType, string entityId) + { + var markedItem = await MarkedItemManager.GetAsync(entityType); + + var userMarkedItem = CurrentUser.IsAuthenticated + ? (await UserMarkedItemRepository + .FindAsync( + CurrentUser.GetId(), + entityType, + entityId + )) + : null; + + return new MarkedItemWithToggleDto + { + MarkedItem = ConvertToMarkedItemDto(markedItem), + IsMarkedByCurrentUser = userMarkedItem != null + }; + } + + [Authorize] + public virtual async Task ToggleAsync(string entityType, string entityId) + { + return await MarkedItemManager.ToggleAsync( + CurrentUser.GetId(), + entityType, + entityId + ); + } + + private MarkedItemDto ConvertToMarkedItemDto(MarkedItemEntityTypeDefinition markedItemEntityTypeDefinition) + { + return new MarkedItemDto + { + IconName = markedItemEntityTypeDefinition.IconName + }; + } + +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostFilteredPagedAndSortedResultRequestDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostFilteredPagedAndSortedResultRequestDto.cs new file mode 100644 index 0000000000..60ad724f4f --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostFilteredPagedAndSortedResultRequestDto.cs @@ -0,0 +1,15 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Blogs; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Blogs; + +public class BlogPostFilteredPagedAndSortedResultRequestDto : PagedAndSortedResultRequestDto +{ + public string Filter { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs new file mode 100644 index 0000000000..d0061a0584 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs @@ -0,0 +1,17 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Blogs; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Blogs; + +public class BlogPostGetListInput : PagedAndSortedResultRequestDto +{ + public Guid? AuthorId { get; set; } + + public Guid? TagId { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs new file mode 100644 index 0000000000..5723b82f46 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -0,0 +1,28 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Contents; +using Volo.CmsKit.Public.Blogs; +using Volo.CmsKit.Users; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Blogs; + +public interface IBlogPostPublicAppService : IApplicationService +{ + Task> GetListAsync(string blogSlug, BlogPostGetListInput input); + + Task GetAsync(string blogSlug, string blogPostSlug); + + Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input); + + Task GetAuthorHasBlogPostAsync(Guid id); + + Task DeleteAsync(Guid id); + + Task GetTagNameAsync(Guid tagId); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CmsUserDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CmsUserDto.cs new file mode 100644 index 0000000000..fa38f0a2ba --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CmsUserDto.cs @@ -0,0 +1,21 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Comments; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Comments; + +public class CmsUserDto : ExtensibleObject +{ + public Guid Id { get; set; } + + public string UserName { get; set; } + + public string Name { get; set; } + + public string Surname { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CommentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CommentDto.cs new file mode 100644 index 0000000000..7cd73197e7 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CommentDto.cs @@ -0,0 +1,33 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Comments; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Comments; + +public class CommentDto : ExtensibleObject +{ + public Guid Id { get; set; } + + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public string Text { get; set; } + + public Guid? RepliedCommentId { get; set; } + + public Guid CreatorId { get; set; } + + public DateTime CreationTime { get; set; } + + public CmsUserDto Author { get; set; } + + public string ConcurrencyStamp { get; set; } + + public string Url { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs new file mode 100644 index 0000000000..4a7d05ca49 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs @@ -0,0 +1,31 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Comments; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Comments; + +public class CommentWithDetailsDto : ExtensibleObject +{ + public Guid Id { get; set; } + + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public string Text { get; set; } + + public Guid CreatorId { get; set; } + + public DateTime CreationTime { get; set; } + + public CommentDto[] Replies { get; set; } + + public CmsUserDto Author { get; set; } + + public string ConcurrencyStamp { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CreateCommentInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CreateCommentInput.cs new file mode 100644 index 0000000000..7571a2f8fd --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/CreateCommentInput.cs @@ -0,0 +1,25 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Comments; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Comments; + +public class CreateCommentInput : ExtensibleObject +{ + public string Text { get; set; } + + public Guid? RepliedCommentId { get; set; } + + public Guid? CaptchaToken { get; set; } + + public int CaptchaAnswer { get; set; } + + public string Url { get; set; } + + public string IdempotencyToken { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs new file mode 100644 index 0000000000..beda330087 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs @@ -0,0 +1,22 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Public.Comments; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Comments; + +public interface ICommentPublicAppService : IApplicationService +{ + Task> GetListAsync(string entityType, string entityId); + + Task CreateAsync(string entityType, string entityId, CreateCommentInput input); + + Task UpdateAsync(Guid id, UpdateCommentInput input); + + Task DeleteAsync(Guid id); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs new file mode 100644 index 0000000000..f5c5d75bdf --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs @@ -0,0 +1,21 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Comments; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Comments; + +public class UpdateCommentInput : ExtensibleObject +{ + public string Text { get; set; } + + public string ConcurrencyStamp { get; set; } + + public Guid? CaptchaToken { get; set; } + + public int CaptchaAnswer { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/GlobalResources/GlobalResourceDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/GlobalResources/GlobalResourceDto.cs new file mode 100644 index 0000000000..dfc5bd86ca --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/GlobalResources/GlobalResourceDto.cs @@ -0,0 +1,17 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.GlobalResources; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.GlobalResources; + +public class GlobalResourceDto : ExtensibleAuditedEntityDto +{ + public string Name { get; set; } + + public string Value { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/GlobalResources/IGlobalResourcePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/GlobalResources/IGlobalResourcePublicAppService.cs new file mode 100644 index 0000000000..abd0e7aa1f --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/GlobalResources/IGlobalResourcePublicAppService.cs @@ -0,0 +1,18 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Public.GlobalResources; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.GlobalResources; + +public interface IGlobalResourcePublicAppService : IApplicationService +{ + Task GetGlobalScriptAsync(); + + Task GetGlobalStyleAsync(); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs new file mode 100644 index 0000000000..51bc65d58b --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs @@ -0,0 +1,18 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Public.MarkedItems; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.MarkedItems; + +public interface IMarkedItemPublicAppService : IApplicationService +{ + Task GetForToggleAsync(string entityType, string entityId); + + Task ToggleAsync(string entityType, string entityId); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemDto.cs new file mode 100644 index 0000000000..6ee899ac78 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemDto.cs @@ -0,0 +1,15 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.MarkedItems; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.MarkedItems; + +public class MarkedItemDto +{ + public string IconName { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.Generated.cs new file mode 100644 index 0000000000..31940807c7 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.Generated.cs @@ -0,0 +1,37 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.ClientProxying; +using Volo.Abp.Http.Modeling; +using Volo.CmsKit.Public.MarkedItems; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.MarkedItems; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IMarkedItemPublicAppService), typeof(MarkedItemPublicClientProxy))] +public partial class MarkedItemPublicClientProxy : ClientProxyBase, IMarkedItemPublicAppService +{ + public virtual async Task GetForToggleAsync(string entityType, string entityId) + { + return await RequestAsync(nameof(GetForToggleAsync), new ClientProxyRequestTypeValue + { + { typeof(string), entityType }, + { typeof(string), entityId } + }); + } + + public virtual async Task ToggleAsync(string entityType, string entityId) + { + return await RequestAsync(nameof(ToggleAsync), new ClientProxyRequestTypeValue + { + { typeof(string), entityType }, + { typeof(string), entityId } + }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.cs new file mode 100644 index 0000000000..570fca1b89 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.cs @@ -0,0 +1,7 @@ +// This file is part of MarkedItemPublicClientProxy, you can customize it here +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.MarkedItems; + +public partial class MarkedItemPublicClientProxy +{ +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemWithToggleDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemWithToggleDto.cs new file mode 100644 index 0000000000..100bcc800f --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemWithToggleDto.cs @@ -0,0 +1,17 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.MarkedItems; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.MarkedItems; + +public class MarkedItemWithToggleDto +{ + public MarkedItemDto MarkedItem { get; set; } + + public bool IsMarkedByCurrentUser { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Menus/IMenuItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Menus/IMenuItemPublicAppService.cs new file mode 100644 index 0000000000..e2da8ac351 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Menus/IMenuItemPublicAppService.cs @@ -0,0 +1,17 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Menus; +using Volo.CmsKit.Public.Menus; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Menus; + +public interface IMenuItemPublicAppService : IApplicationService +{ + Task> GetListAsync(); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs new file mode 100644 index 0000000000..4b8595d376 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs @@ -0,0 +1,21 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Contents; +using Volo.CmsKit.Public.Pages; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Pages; + +public interface IPagePublicAppService : IApplicationService +{ + Task FindBySlugAsync(string slug); + + Task DoesSlugExistAsync(string slug); + + Task FindDefaultHomePageAsync(); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs new file mode 100644 index 0000000000..99945667be --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs @@ -0,0 +1,15 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Ratings; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Ratings; + +public class CreateUpdateRatingInput +{ + public Int16 StarCount { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs new file mode 100644 index 0000000000..842a920d76 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs @@ -0,0 +1,20 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Public.Ratings; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Ratings; + +public interface IRatingPublicAppService : IApplicationService +{ + Task CreateAsync(string entityType, string entityId, CreateUpdateRatingInput input); + + Task DeleteAsync(string entityType, string entityId); + + Task> GetGroupedStarCountsAsync(string entityType, string entityId); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/RatingDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/RatingDto.cs new file mode 100644 index 0000000000..70d74d7691 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/RatingDto.cs @@ -0,0 +1,25 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Ratings; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Ratings; + +public class RatingDto +{ + public Guid Id { get; set; } + + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public Int16 StarCount { get; set; } + + public Guid CreatorId { get; set; } + + public DateTime CreationTime { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs new file mode 100644 index 0000000000..9608d14283 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs @@ -0,0 +1,19 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Ratings; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Ratings; + +public class RatingWithStarCountDto +{ + public Int16 StarCount { get; set; } + + public int Count { get; set; } + + public bool IsSelectedByCurrentUser { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/IReactionPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/IReactionPublicAppService.cs new file mode 100644 index 0000000000..47ba42f981 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/IReactionPublicAppService.cs @@ -0,0 +1,20 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Public.Reactions; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Reactions; + +public interface IReactionPublicAppService : IApplicationService +{ + Task> GetForSelectionAsync(string entityType, string entityId); + + Task CreateAsync(string entityType, string entityId, string reaction); + + Task DeleteAsync(string entityType, string entityId, string reaction); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/ReactionDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/ReactionDto.cs new file mode 100644 index 0000000000..ea353415e3 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/ReactionDto.cs @@ -0,0 +1,17 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Reactions; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Reactions; + +public class ReactionDto +{ + public string Name { get; set; } + + public string DisplayName { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/ReactionWithSelectionDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/ReactionWithSelectionDto.cs new file mode 100644 index 0000000000..4f2b674023 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Reactions/ReactionWithSelectionDto.cs @@ -0,0 +1,19 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Public.Reactions; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Reactions; + +public class ReactionWithSelectionDto +{ + public ReactionDto Reaction { get; set; } + + public int Count { get; set; } + + public bool IsSelectedByCurrentUser { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Tags/ITagAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Tags/ITagAppService.cs new file mode 100644 index 0000000000..6095d73ae1 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Tags/ITagAppService.cs @@ -0,0 +1,18 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.CmsKit.Tags; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.Tags; + +public interface ITagAppService : IApplicationService +{ + Task> GetAllRelatedTagsAsync(string entityType, string entityId); + + Task> GetPopularTagsAsync(string entityType, int maxCount); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index 68f721556b..6917a58fb7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -908,6 +908,188 @@ } } }, + "Volo.CmsKit.Public.MarkedItems.MarkedItemPublicController": { + "controllerName": "MarkedItemPublic", + "controllerGroupName": "MarkedItemPublic", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.CmsKit.Public.MarkedItems.MarkedItemPublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.MarkedItems.IMarkedItemPublicAppService", + "name": "IMarkedItemPublicAppService", + "methods": [ + { + "name": "GetForToggleAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto", + "typeSimple": "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto" + } + }, + { + "name": "ToggleAsync", + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + } + ] + } + ], + "actions": { + "GetForToggleAsyncByEntityTypeAndEntityId": { + "uniqueName": "GetForToggleAsyncByEntityTypeAndEntityId", + "name": "GetForToggleAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/marked-items/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto", + "typeSimple": "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.MarkedItems.IMarkedItemPublicAppService" + }, + "ToggleAsyncByEntityTypeAndEntityId": { + "uniqueName": "ToggleAsyncByEntityTypeAndEntityId", + "name": "ToggleAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-public/marked-items/{entityType}/{entityId}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "entityType", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "entityId", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "entityType", + "name": "entityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + }, + { + "nameOnMethod": "entityId", + "name": "entityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.MarkedItems.IMarkedItemPublicAppService" + } + } + }, "Volo.CmsKit.Public.Menus.MenuItemPublicController": { "controllerName": "MenuItemPublic", "controllerGroupName": "MenuItemPublic", @@ -1897,5 +2079,8659 @@ } } }, - "types": {} + "types": { + "Microsoft.AspNetCore.Mvc.IActionResult": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "System.Nullable": { + "baseType": "System.ValueType", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], + "properties": [ + { + "name": "HasValue", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "T", + "typeSimple": "T", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ChangePasswordInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CurrentPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NewPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ProfileDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasPassword", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.RegisterDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ResetPasswordDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResetToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.SendPasswordResetCodeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrlHash", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.UpdateProfileDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.VerifyPasswordResetTokenInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResetToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Result", + "jsonName": null, + "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", + "typeSimple": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Success", + "InvalidUserNameOrPassword", + "NotAllowed", + "LockedOut", + "RequiresTwoFactor" + ], + "enumValues": [ + 1, + 2, + 3, + 4, + 5 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserNameOrEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 255, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 32, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RememberMe", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.EntityDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.Application.Dtos.EntityDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TKey" + ], + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "TKey", + "typeSimple": "TKey", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "LastModificationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastModifierId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TPrimaryKey" + ], + "properties": [ + { + "name": "LastModificationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastModifierId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TPrimaryKey" + ], + "properties": [ + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleEntityDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.Application.Dtos.ExtensibleEntityDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TKey" + ], + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "TKey", + "typeSimple": "TKey", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "TPrimaryKey" + ], + "properties": [ + { + "name": "IsDeleted", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DeleterId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DeletionTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensibleLimitedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DefaultMaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxMaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "2147483647", + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ExtensiblePagedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleLimitedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SkipCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "0", + "maximum": "2147483647", + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.LimitedResultRequestDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DefaultMaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxMaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "2147483647", + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.ListResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], + "properties": [ + { + "name": "Items", + "jsonName": null, + "type": "[T]", + "typeSimple": "[T]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.PagedResultDto": { + "baseType": "Volo.Abp.Application.Dtos.ListResultDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], + "properties": [ + { + "name": "TotalCount", + "jsonName": null, + "type": "System.Int64", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Application.Dtos.PagedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.LimitedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SkipCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "0", + "maximum": "2147483647", + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "GrantedPolicies", + "jsonName": null, + "type": "{System.String:System.Boolean}", + "typeSimple": "{string:boolean}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Localization", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Auth", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Setting", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CurrentUser", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Features", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "GlobalFeatures", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MultiTenancy", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CurrentTenant", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Timing", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Clock", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ObjectExtensions", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IncludeLocalizationResources", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Values", + "jsonName": null, + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EnabledFeatures", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Values", + "jsonName": null, + "type": "{System.String:System.Collections.Generic.Dictionary}", + "typeSimple": "{string:System.Collections.Generic.Dictionary}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Resources", + "jsonName": null, + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Languages", + "jsonName": null, + "type": "[Volo.Abp.Localization.LanguageInfo]", + "typeSimple": "[Volo.Abp.Localization.LanguageInfo]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CurrentCulture", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultResourceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LanguagesMap", + "jsonName": null, + "type": "{System.String:[Volo.Abp.NameValue]}", + "typeSimple": "{string:[Volo.Abp.NameValue]}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LanguageFilesMap", + "jsonName": null, + "type": "{System.String:[Volo.Abp.NameValue]}", + "typeSimple": "{string:[Volo.Abp.NameValue]}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Resources", + "jsonName": null, + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CurrentCulture", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OnlyDynamics", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationResourceDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Texts", + "jsonName": null, + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BaseResources", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Values", + "jsonName": null, + "type": "{System.String:System.String}", + "typeSimple": "{string:string}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Kind", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnglishName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ThreeLetterIsoLanguageName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TwoLetterIsoLanguageName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRightToLeft", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NativeName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DateTimeFormat", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAuthenticated", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorUserId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorTenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorUserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorTenantName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SurName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailVerified", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberVerified", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Roles", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SessionId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CalendarAlgorithmType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DateTimeFormatLong", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDatePattern", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FullDateTimePattern", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DateSeparator", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortTimePattern", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LongTimePattern", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TimeZoneName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Properties", + "jsonName": null, + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Configuration", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Fields", + "jsonName": null, + "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]", + "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LocalizationResource", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAvailable", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "OnGet", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OnCreate", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OnUpdate", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAvailable", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsAvailable", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Config", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Api", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Ui", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Attributes", + "jsonName": null, + "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]", + "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Configuration", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultValue", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "OnTable", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OnCreateForm", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "OnEditForm", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Lookup", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsVisible", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResultListPropertyName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayPropertyName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValuePropertyName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "FilterParamName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsVisible", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Resource", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Entities", + "jsonName": null, + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Configuration", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Modules", + "jsonName": null, + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Enums", + "jsonName": null, + "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}", + "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Iana", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Windows", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TimeZone", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TimeZoneId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsAvailable", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Success", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "NormalizedName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Content.IRemoteStreamContent": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FileName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ContentType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ContentLength", + "jsonName": null, + "type": "System.Int64?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Content.RemoteStreamContent": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FileName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ContentType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ContentLength", + "jsonName": null, + "type": "System.Int64?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.FeatureDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Provider", + "jsonName": null, + "type": "Volo.Abp.FeatureManagement.FeatureProviderDto", + "typeSimple": "Volo.Abp.FeatureManagement.FeatureProviderDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ValueType", + "jsonName": null, + "type": "Volo.Abp.Validation.StringValues.IStringValueType", + "typeSimple": "Volo.Abp.Validation.StringValues.IStringValueType", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Depth", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ParentName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.FeatureGroupDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Features", + "jsonName": null, + "type": "[Volo.Abp.FeatureManagement.FeatureDto]", + "typeSimple": "[Volo.Abp.FeatureManagement.FeatureDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.FeatureProviderDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Key", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.GetFeatureListResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Groups", + "jsonName": null, + "type": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", + "typeSimple": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.UpdateFeatureDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.FeatureManagement.UpdateFeaturesDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Features", + "jsonName": null, + "type": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]", + "typeSimple": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ActionApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UniqueName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HttpMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "SupportedVersions", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ParametersOnMethod", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Parameters", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnValue", + "jsonName": null, + "type": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", + "typeSimple": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowAnonymous", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImplementFrom", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Modules", + "jsonName": null, + "type": "{System.String:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}", + "typeSimple": "{string:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Types", + "jsonName": null, + "type": "{System.String:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}", + "typeSimple": "{string:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IncludeTypes", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ControllerApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ControllerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ControllerGroupName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRemoteService", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsIntegrationService", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ApiVersion", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Interfaces", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Actions", + "jsonName": null, + "type": "{System.String:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}", + "typeSimple": "{string:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Methods", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.InterfaceMethodApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.InterfaceMethodApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.InterfaceMethodApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ParametersOnMethod", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnValue", + "jsonName": null, + "type": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", + "typeSimple": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeAsString", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsOptional", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultValue", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ModuleApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RootPath", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RemoteServiceName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Controllers", + "jsonName": null, + "type": "{System.String:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}", + "typeSimple": "{string:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ParameterApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "NameOnMethod", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "JsonName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsOptional", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DefaultValue", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConstraintTypes", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BindingSourceId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DescriptorName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.PropertyApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "JsonName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRequired", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MinLength", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxLength", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Minimum", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Maximum", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Regex", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Type", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TypeSimple", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Http.Modeling.TypeApiDescriptionModel": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BaseType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnum", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnumNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EnumValues", + "jsonName": null, + "type": "[System.Object]", + "typeSimple": "[object]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "GenericArguments", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Properties", + "jsonName": null, + "type": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]", + "typeSimple": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetIdentityRolesInput": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.GetIdentityUsersInput": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityRoleCreateDto": { + "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsDefault", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsPublic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityRoleDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsDefault", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsStatic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsPublic", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityRoleUpdateDto": { + "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserCreateDto": { + "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LockoutEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RoleNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LockoutEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AccessFailedCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LockoutEnd", + "jsonName": null, + "type": "System.DateTimeOffset?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityVersion", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastPasswordChangeTime", + "jsonName": null, + "type": "System.DateTimeOffset?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserUpdateDto": { + "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.IdentityUserUpdateRolesDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "RoleNames", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.UserLookupCountInputDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Identity.UserLookupSearchInputDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensiblePagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Localization.LanguageInfo": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UiCultureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TwoLetterISOLanguageName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.NameValue": { + "baseType": "Volo.Abp.NameValue", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [] + }, + "Volo.Abp.NameValue": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": [ + "T" + ], + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "T", + "typeSimple": "T", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.ObjectExtending.ExtensibleObject": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.GetPermissionListResultDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityDisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Groups", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.PermissionGrantInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ParentName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsGranted", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowedProviders", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "GrantedProviders", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.ProviderInfoDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.ProviderInfoDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.PermissionGroupDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayNameKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayNameResource", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Permissions", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.ProviderInfoDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ProviderName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ProviderKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.UpdatePermissionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsGranted", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.PermissionManagement.UpdatePermissionsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Permissions", + "jsonName": null, + "type": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]", + "typeSimple": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TenantManagement.GetTenantsInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TenantManagement.TenantCreateDto": { + "baseType": "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AdminEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AdminPassword", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TenantManagement.TenantDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.TenantManagement.TenantUpdateDto": { + "baseType": "Volo.Abp.TenantManagement.TenantCreateOrUpdateDtoBase", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Users.UserData": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EmailConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Validation.StringValues.IStringValueType": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Item", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Properties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Validator", + "jsonName": null, + "type": "Volo.Abp.Validation.StringValues.IValueValidator", + "typeSimple": "Volo.Abp.Validation.StringValues.IValueValidator", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Validation.StringValues.IValueValidator": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Item", + "jsonName": null, + "type": "System.Object", + "typeSimple": "object", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Properties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogFeatureInputDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FeatureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogPostDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastModificationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Blogs.BlogPostStatus", + "typeSimple": "Volo.CmsKit.Blogs.BlogPostStatus", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogPostGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AuthorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TagId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Blogs.BlogPostStatus?", + "typeSimple": "Volo.CmsKit.Blogs.BlogPostStatus?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.BlogPostListDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "BlogName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "LastModificationTime", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Status", + "jsonName": null, + "type": "Volo.CmsKit.Blogs.BlogPostStatus?", + "typeSimple": "Volo.CmsKit.Blogs.BlogPostStatus?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.CreateBlogDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.CreateBlogPostDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 2, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.UpdateBlogDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 2, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CmsUserDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CommentApprovalDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IsApproved", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CommentGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationStartDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationEndDate", + "jsonName": null, + "type": "System.DateTime?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CommentApproveState", + "jsonName": null, + "type": "Volo.CmsKit.Comments.CommentApproveState", + "typeSimple": "Volo.CmsKit.Comments.CommentApproveState", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CommentSettingsDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "CommentRequireApprovement", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Comments.CommentWithAuthorDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "Volo.CmsKit.Admin.Comments.CmsUserDto", + "typeSimple": "Volo.CmsKit.Admin.Comments.CmsUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsApproved", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StyleContent", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ScriptContent", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.GlobalResources.GlobalResourcesUpdateDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.MediaDescriptors.CreateMediaInputWithStream": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 255, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "File", + "jsonName": null, + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.MediaDescriptors.MediaDescriptorDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MimeType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Size", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.MenuItemCreateInput": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Icon", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ElementId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CssClass", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PageId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.MenuItemMoveInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "NewParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Position", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.MenuItemUpdateInput": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Icon", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ElementId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CssClass", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PageId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.MenuItemWithDetailsDto": { + "baseType": "Volo.CmsKit.Menus.MenuItemDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "PageTitle", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.PageLookupDto": { + "baseType": "Volo.Abp.Application.Dtos.EntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Menus.PageLookupInputDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Pages.CreatePageInputDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Pages.GetPagesInputDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Pages.PageDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsHomePage", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Pages.UpdatePageInputDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": 2147483647, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.EntityTagCreateDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TagName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.EntityTagRemoveDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TagId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.EntityTagSetDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Tags", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.TagCreateDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 32, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.TagDefinitionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.TagGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Admin.Tags.TagUpdateDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 32, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Blogs.BlogFeatureDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "FeatureName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsEnabled", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Blogs.BlogPostStatus": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Draft", + "Published", + "WaitingForReview" + ], + "enumValues": [ + 0, + 1, + 2 + ], + "genericArguments": null, + "properties": null + }, + "Volo.CmsKit.Comments.CommentApproveState": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "All", + "Approved", + "Disapproved", + "Waiting" + ], + "enumValues": [ + 0, + 1, + 2, + 4 + ], + "genericArguments": null, + "properties": null + }, + "Volo.CmsKit.Contents.BlogPostCommonDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "BlogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ShortDescription", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CoverImageMediaId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "Volo.CmsKit.Users.CmsUserDto", + "typeSimple": "Volo.CmsKit.Users.CmsUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Contents.PageDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Title", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Slug", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Content", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Script", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Style", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Menus.MenuItemDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "ParentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Icon", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Order", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Target", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ElementId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CssClass", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PageId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Blogs.BlogPostGetListInput": { + "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "AuthorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TagId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.CmsUserDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.CommentDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "Volo.CmsKit.Public.Comments.CmsUserDto", + "typeSimple": "Volo.CmsKit.Public.Comments.CmsUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.CommentWithDetailsDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Replies", + "jsonName": null, + "type": "[Volo.CmsKit.Public.Comments.CommentDto]", + "typeSimple": "[Volo.CmsKit.Public.Comments.CommentDto]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Author", + "jsonName": null, + "type": "Volo.CmsKit.Public.Comments.CmsUserDto", + "typeSimple": "Volo.CmsKit.Public.Comments.CmsUserDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.CreateCommentInput": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 512, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RepliedCommentId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaToken", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaAnswer", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Url", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IdempotencyToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Comments.UpdateCommentInput": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Text", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 512, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaToken", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CaptchaAnswer", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Value", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.MarkedItems.MarkedItemDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "IconName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.MarkedItems.MarkedItemWithToggleDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "MarkedItem", + "jsonName": null, + "type": "Volo.CmsKit.Public.MarkedItems.MarkedItemDto", + "typeSimple": "Volo.CmsKit.Public.MarkedItems.MarkedItemDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsMarkedByCurrentUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Ratings.CreateUpdateRatingInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StarCount", + "jsonName": null, + "type": "System.Int16", + "typeSimple": "number", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "5", + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Ratings.RatingDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "EntityId", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "StarCount", + "jsonName": null, + "type": "System.Int16", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreatorId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "CreationTime", + "jsonName": null, + "type": "System.DateTime", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Ratings.RatingWithStarCountDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "StarCount", + "jsonName": null, + "type": "System.Int16", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Count", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsSelectedByCurrentUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Reactions.ReactionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "DisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Public.Reactions.ReactionWithSelectionDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Reaction", + "jsonName": null, + "type": "Volo.CmsKit.Public.Reactions.ReactionDto", + "typeSimple": "Volo.CmsKit.Public.Reactions.ReactionDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Count", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsSelectedByCurrentUser", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Tags.PopularTagDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Count", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Tags.TagDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EntityType", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.CmsKit.Users.CmsUserDto": { + "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "TenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + } + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicController.cs new file mode 100644 index 0000000000..9f09525f65 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicController.cs @@ -0,0 +1,38 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Features; +using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; +using Volo.CmsKit.GlobalFeatures; + +namespace Volo.CmsKit.Public.MarkedItems; + +[RequiresFeature(CmsKitFeatures.MarkedItemEnable)] +[RequiresGlobalFeature(typeof(MarkedItemsFeature))] +[RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] +[Area(CmsKitPublicRemoteServiceConsts.ModuleName)] +[Route("api/cms-kit-public/marked-items")] +public class MarkedItemPublicController : CmsKitPublicControllerBase, IMarkedItemPublicAppService +{ + protected IMarkedItemPublicAppService MarkedItemPublicAppService { get; } + + public MarkedItemPublicController(IMarkedItemPublicAppService markedItemPublicAppService) + { + MarkedItemPublicAppService = markedItemPublicAppService; + } + + [HttpGet] + [Route("{entityType}/{entityId}")] + public virtual Task GetForToggleAsync(string entityType, string entityId) + { + return MarkedItemPublicAppService.GetForToggleAsync(entityType, entityId); + } + + [HttpPut] + [Route("{entityType}/{entityId}")] + public Task ToggleAsync(string entityType, string entityId) + { + return MarkedItemPublicAppService.ToggleAsync(entityType, entityId); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index c7078acd98..fd2984a3b4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -13,10 +13,12 @@ using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Localization; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.Public.Web.Menus; using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.GlobalResources.Script; using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.GlobalResources.Style; using Volo.CmsKit.Web; +using Volo.CmsKit.Web.Icons; namespace Volo.CmsKit.Public.Web; @@ -46,6 +48,14 @@ public class CmsKitPublicWebModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { + Configure(options => + { + options.MarkedItemIcons[StandardMarkedItems.Favorite] = new LocalizableIconDictionary("fa fa-heart text-danger"); + options.MarkedItemIcons[StandardMarkedItems.Flagged] = new LocalizableIconDictionary("fa fa-flag text-info"); + options.MarkedItemIcons[StandardMarkedItems.Bookmark] = new LocalizableIconDictionary("fa fa-bookmark text-primary"); + options.MarkedItemIcons[StandardMarkedItems.Starred] = new LocalizableIconDictionary("fa fa-star text-warning"); + + }); Configure(options => { options.MenuContributors.Add(new CmsKitPublicMenuContributor()); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs index 67a9d64f67..82b103dc29 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Commenting; +using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.MarkedItemToggle; using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating; using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection; @@ -23,4 +24,9 @@ public class CmsKitPublicWidgetsController : CmsKitPublicControllerBase { return Task.FromResult((IActionResult)ViewComponent(typeof(RatingViewComponent), new { entityType, entityId })); } + + public Task MarkedItem(string entityType, string entityId, bool needsConfirmation) + { + return Task.FromResult((IActionResult)ViewComponent(typeof(MarkedItemToggleViewComponent), new { entityType, entityId, needsConfirmation })); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/Default.cshtml new file mode 100644 index 0000000000..b31506aafd --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/Default.cshtml @@ -0,0 +1,14 @@ +@using Volo.Abp.Users +@inject ICurrentUser CurrentUser +@model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.MarkedItemToggle.MarkedItemToggleViewComponent.MarkedItemToggleViewModel +@{ +} + +
+ +
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleScriptBundleContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleScriptBundleContributor.cs new file mode 100644 index 0000000000..f21b4ff7c5 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleScriptBundleContributor.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.MarkedItemToggle; + +public class MarkedItemToggleScriptBundleContributor : BundleContributor +{ + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/client-proxies/cms-kit-proxy.js"); + context.Files.AddIfNotContains("/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js"); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleStyleBundleContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleStyleBundleContributor.cs new file mode 100644 index 0000000000..b9b7bb6f41 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleStyleBundleContributor.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.MarkedItemToggle; + +public class MarkedItemToggleStyleBundleContributor : BundleContributor +{ + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.css"); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleViewComponent.cs new file mode 100644 index 0000000000..471953940d --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleViewComponent.cs @@ -0,0 +1,77 @@ +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Widgets; +using Volo.CmsKit.Public.MarkedItems; +using Volo.CmsKit.Web; + +namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.MarkedItemToggle; + +[ViewComponent(Name = "CmsMarkedItemToggle")] +[Widget( + ScriptTypes = new[] { typeof(MarkedItemToggleScriptBundleContributor) }, + StyleTypes = new[] { typeof(MarkedItemToggleStyleBundleContributor) }, + RefreshUrl = "/CmsKitPublicWidgets/MarkedItem", + AutoInitialize = true +)] +public class MarkedItemToggleViewComponent : AbpViewComponent +{ + protected IMarkedItemPublicAppService MarkedItemPublicAppService { get; set; } + + protected CmsKitUiOptions Options { get; } + + + public MarkedItemToggleViewComponent( + IMarkedItemPublicAppService markedItemPublicAppService, + IOptions options) + { + MarkedItemPublicAppService = markedItemPublicAppService; + Options = options.Value; + } + + public virtual async Task InvokeAsync( + string entityType, + string entityId, + bool? needsConfirmation = false) + { + var result = await MarkedItemPublicAppService.GetForToggleAsync(entityType, entityId); + var returnUrl = HttpContext.Request.Path.ToString(); + + var viewModel = new MarkedItemToggleViewModel + { + EntityType = entityType, + EntityId = entityId, + NeedsConfirmation = needsConfirmation.GetValueOrDefault(), + MarkedItem = new MarkedItemViewModel() + { + Icon = Options.MarkedItemIcons.GetLocalizedIcon(result.MarkedItem.IconName), + IsMarkedByCurrentUser = result.IsMarkedByCurrentUser + }, + ReturnUrl = returnUrl + }; + + return View("~/Pages/CmsKit/Shared/Components/MarkedItemToggle/Default.cshtml", viewModel); + } + public class MarkedItemToggleViewModel + { + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public bool NeedsConfirmation { get; set; } + + public MarkedItemViewModel MarkedItem { get; set; } + + public string ReturnUrl { get; set; } + } + + public class MarkedItemViewModel + { + [NotNull] + public string Icon { get; set; } + + public bool IsMarkedByCurrentUser { get; set; } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.css new file mode 100644 index 0000000000..af5f994177 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.css @@ -0,0 +1,7 @@ +body { +} + +.cms-markedItem-area i { + font-size: 1.5em; + cursor: pointer; +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js new file mode 100644 index 0000000000..7c12d157e0 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js @@ -0,0 +1,92 @@ +(function ($) { + var l = abp.localization.getResource('CmsKit'); + + abp.widgets.CmsMarkedItemToggle = function ($widget) { + + let widgetManager = $widget.data('abp-widget-manager'); + let $markedItemArea = $widget.find('.cms-markedItem-area'); + let loginModal = new abp.ModalManager(abp.appPath + 'CmsKit/Shared/Modals/Login/LoginModal'); + + + function getFilters() { + return { + entityType: $markedItemArea.attr('data-entity-type'), + entityId: $markedItemArea.attr('data-entity-id'), + needsConfirmation: $markedItemArea.attr('data-needs-confirmation') + }; + } + + function setIconStyles($icon) { + var iconColor = $icon.css('color'); + $icon.css({ + '-webkit-text-stroke-color': iconColor, + '-webkit-text-stroke-width': '2px' + }); + + // Manually set the important rule for color + $icon[0].style.setProperty('color', 'transparent', 'important'); + } + + function isDoubleClicked(element) { + if (element.data("isclicked")) return true; + + element.data("isclicked", true); + setTimeout(function () { + element.removeData("isclicked"); + }, 500); + } + + function handleUnauthenticated() { + loginModal.open({ + message: l("CmsKit:MarkedItem:LoginMessage"), + returnUrl: $markedItemArea.attr('data-return-url') + }); + } + + function registerClickOfMarkedItemIcon($container) { + var $icon = $container.find('.cms-markedItem-icon'); + + if (isDoubleClicked($icon)) return; + + $icon.click(async function () { + if ($icon.attr('data-is-authenticated') === 'false') { + handleUnauthenticated(); + return; + } + + if ($icon.hasClass('confirm') && !$icon.hasClass('unmarked')) { + const confirmed = await abp.message.confirm(l('CmsKit:MarkedItem:ToggleConfirmation')); + if (confirmed) { + toggleIcon($icon); + } + return; + } + else { + toggleIcon(); + } + }); + } + + async function toggleIcon() { + await volo.cmsKit.public.markedItems.markedItemPublic.toggle( + $markedItemArea.attr('data-entity-type'), + $markedItemArea.attr('data-entity-id') + ); + widgetManager.refresh($widget); + } + + function init() { + var $unmarked = $widget.find('.unmarked'); + if ($unmarked.length === 1) { + setIconStyles($unmarked); + } + registerClickOfMarkedItemIcon($widget); + } + + return { + init: init, + getFilters: getFilters + }; + }; + +})(jQuery); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Modals/Login/LoginModal.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Modals/Login/LoginModal.cshtml new file mode 100644 index 0000000000..1472d4b227 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Modals/Login/LoginModal.cshtml @@ -0,0 +1,22 @@ +@page +@using Microsoft.Extensions.Localization +@using Volo.CmsKit.Localization +@inject IStringLocalizer L +@model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Modals.Login.LoginModalModel +@{ + Layout = null; + var message = String.IsNullOrEmpty(Model.ViewModel.Message) ? L["CmsKit:Modals:LoginModalDefaultMessage"] : Model.ViewModel.Message; +} + + + + +
+

+ @message +

+
+ @L["CmsKit:Modals:Login"] +
+
+
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Modals/Login/LoginModal.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Modals/Login/LoginModal.cshtml.cs new file mode 100644 index 0000000000..6da6838d16 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Modals/Login/LoginModal.cshtml.cs @@ -0,0 +1,32 @@ +using JetBrains.Annotations; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.UI; + +namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Modals.Login; + +public class LoginModalModel : CmsKitPublicPageModelBase +{ + public AbpMvcUiOptions AbpMvcUiOptions { get; } + + public LoginModalViewModel ViewModel { get; set; } + public LoginModalModel(IOptions abpMvcUiOptions) + { + AbpMvcUiOptions = abpMvcUiOptions.Value; + } + public void OnGet(string message, string? returnUrl = "") + { + ViewModel = new LoginModalViewModel + { + LoginUrl = $"{AbpMvcUiOptions.LoginUrl}?returnUrl={returnUrl}", + Message = message + }; + } +} + +public class LoginModalViewModel +{ + [NotNull] + public string Message { get; set; } + + public string LoginUrl { get; set; } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js index 43e8caa7b2..d1a18731cb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js @@ -117,6 +117,28 @@ })(); + // controller volo.cmsKit.public.markedItems.markedItemPublic + + (function(){ + + abp.utils.createNamespace(window, 'volo.cmsKit.public.markedItems.markedItemPublic'); + + volo.cmsKit.public.markedItems.markedItemPublic.getForToggle = function(entityType, entityId, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-public/marked-items/' + entityType + '/' + entityId + '', + type: 'GET' + }, ajaxParams)); + }; + + volo.cmsKit.public.markedItems.markedItemPublic.toggle = function(entityType, entityId, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-public/marked-items/' + entityType + '/' + entityId + '', + type: 'PUT' + }, ajaxParams)); + }; + + })(); + // controller volo.cmsKit.public.menus.menuItemPublic (function(){ diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/MarkedItems/MarkedItemPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/MarkedItems/MarkedItemPublicAppService_Tests.cs new file mode 100644 index 0000000000..e9bf6eb772 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/MarkedItems/MarkedItemPublicAppService_Tests.cs @@ -0,0 +1,65 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Shouldly; +using Volo.Abp.Users; +using Volo.CmsKit.Public.MarkedItems; +using Xunit; + +namespace Volo.CmsKit.MarkedItems; + +public class MarkedItemPublicAppService_Tests : CmsKitApplicationTestBase +{ + private readonly CmsKitTestData _cmsKitTestData; + private readonly MarkedItemPublicAppService _markedItemPublicAppService; + private ICurrentUser _currentUser; + + public MarkedItemPublicAppService_Tests() + { + _cmsKitTestData = GetRequiredService(); + _markedItemPublicAppService = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + _currentUser = Substitute.For(); + services.AddSingleton(_currentUser); + } + + [Fact] + public async Task GetForToggleAsync() + { + _currentUser.Id.Returns(_cmsKitTestData.User1Id); + _currentUser.IsAuthenticated.Returns(true); + + var firstMarkedItem = await _markedItemPublicAppService.GetForToggleAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1 + ); + var secondMarkedItem = await _markedItemPublicAppService.GetForToggleAsync( + _cmsKitTestData.EntityType2, + _cmsKitTestData.EntityId1 + ); + + firstMarkedItem.IsMarkedByCurrentUser.ShouldBeTrue(); + secondMarkedItem.IsMarkedByCurrentUser.ShouldBeFalse(); + } + + [Fact] + public async Task ToggleAsync() + { + _currentUser.Id.Returns(_cmsKitTestData.User1Id); + + var firstToggleResult = await _markedItemPublicAppService.ToggleAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1 + ); + var secondToggleResult = await _markedItemPublicAppService.ToggleAsync( + _cmsKitTestData.EntityType2, + _cmsKitTestData.EntityId1 + ); + + firstToggleResult.ShouldBeFalse(); + secondToggleResult.ShouldBeTrue(); + } +} diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/MarkedItems/MarkedItemManager_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/MarkedItems/MarkedItemManager_Tests.cs new file mode 100644 index 0000000000..8e132932df --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/MarkedItems/MarkedItemManager_Tests.cs @@ -0,0 +1,45 @@ +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.CmsKit.MarkedItems; + +public class MarkedItemManager_Tests : CmsKitDomainTestBase +{ + private readonly CmsKitTestData _cmsKitTestData; + private readonly MarkedItemManager _markedItemManager; + + public MarkedItemManager_Tests() + { + _cmsKitTestData = GetRequiredService(); + _markedItemManager = GetRequiredService(); + } + + [Fact] + public async Task ToggleAsync() + { + var firstToggleResult = await _markedItemManager.ToggleAsync( + _cmsKitTestData.User1Id, + _cmsKitTestData.EntityType2, + _cmsKitTestData.EntityId1 + ); + + var secondToggleResult = await _markedItemManager.ToggleAsync( + _cmsKitTestData.User1Id, + _cmsKitTestData.EntityType2, + _cmsKitTestData.EntityId1 + ); + + firstToggleResult.ShouldBeTrue(); + secondToggleResult.ShouldBeFalse(); + } + + [Fact] + public async Task GetAsync() + { + var markedItem = await _markedItemManager.GetAsync(_cmsKitTestData.EntityType1); + + markedItem.EntityType.ShouldBe(_cmsKitTestData.EntityType1); + markedItem.IconName.ShouldBe(StandardMarkedItems.Favorite); + } +} diff --git a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/MarkedItems/UserMarkedItemRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/MarkedItems/UserMarkedItemRepository_Tests.cs new file mode 100644 index 0000000000..23f1bc1f21 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/MarkedItems/UserMarkedItemRepository_Tests.cs @@ -0,0 +1,6 @@ +using Volo.CmsKit.MarkedItems; + +namespace Volo.CmsKit.EntityFrameworkCore.MarkedItems; +public class UserMarkedItemRepository_Tests : UserMarkedItemRepository_Tests +{ +} diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/MarkedItems/UserMarkedItemRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/MarkedItems/UserMarkedItemRepository_Tests.cs new file mode 100644 index 0000000000..f22365d33f --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/MarkedItems/UserMarkedItemRepository_Tests.cs @@ -0,0 +1,9 @@ +using Volo.CmsKit.MarkedItems; +using Xunit; + +namespace Volo.CmsKit.MongoDB.MarkedItems; + +[Collection(MongoTestCollection.Name)] +public class UserMarkedItemRepository_Tests : UserMarkedItemRepository_Tests +{ +} diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index 19b51ccf7c..d4b055af60 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -12,6 +12,7 @@ using Volo.Abp.MultiTenancy; using Volo.Abp.Users; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -49,6 +50,8 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende private readonly IOptions _commentsOptions; private readonly IOptions _ratingOptions; private readonly IMenuItemRepository _menuItemRepository; + private readonly MarkedItemManager _markedItemManager; + private readonly IOptions _markedItemOptions; public CmsKitDataSeedContributor( IGuidGenerator guidGenerator, @@ -75,7 +78,9 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende IOptions cmsMediaOptions, IOptions commentsOptions, IOptions ratingOptions, - IMenuItemRepository menuItemRepository) + IMenuItemRepository menuItemRepository, + MarkedItemManager markedItemManager, + IOptions markedItemOptions) { _guidGenerator = guidGenerator; _cmsUserRepository = cmsUserRepository; @@ -102,6 +107,8 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende _commentsOptions = commentsOptions; _ratingOptions = ratingOptions; _menuItemRepository = menuItemRepository; + _markedItemManager = markedItemManager; + _markedItemOptions = markedItemOptions; } public async Task SeedAsync(DataSeedContext context) @@ -129,6 +136,8 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende await SeedMediaAsync(); await SeedMenusAsync(); + + await SeedMarkedItemsAsync(); } } @@ -171,6 +180,9 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende _ratingOptions.Value.EntityTypes.Add(new RatingEntityTypeDefinition(_cmsKitTestData.EntityType1)); _ratingOptions.Value.EntityTypes.Add(new RatingEntityTypeDefinition(_cmsKitTestData.EntityType2)); + _markedItemOptions.Value.EntityTypes.Add(new MarkedItemEntityTypeDefinition(_cmsKitTestData.EntityType1, StandardMarkedItems.Favorite)); + _markedItemOptions.Value.EntityTypes.Add(new MarkedItemEntityTypeDefinition(_cmsKitTestData.EntityType2, StandardMarkedItems.Starred)); + return Task.CompletedTask; } @@ -442,4 +454,18 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende menuItem4 }); } + + private async Task SeedMarkedItemsAsync() + { + await _markedItemManager.ToggleAsync( + _cmsKitTestData.User1Id, + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1 + ); + await _markedItemManager.ToggleAsync( + _cmsKitTestData.User1Id, + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId2 + ); + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/MarkedItems/UserMarkedItemRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/MarkedItems/UserMarkedItemRepository_Tests.cs new file mode 100644 index 0000000000..5defd43029 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/MarkedItems/UserMarkedItemRepository_Tests.cs @@ -0,0 +1,64 @@ +using System.Linq; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.CmsKit.MarkedItems; +public abstract class UserMarkedItemRepository_Tests : CmsKitTestBase + where TStartupModule : IAbpModule +{ + private readonly CmsKitTestData _cmsKitTestData; + private readonly IUserMarkedItemRepository _userMarkedItemRepository; + + protected UserMarkedItemRepository_Tests() + { + _cmsKitTestData = GetRequiredService(); + _userMarkedItemRepository = GetRequiredService(); + } + + [Fact] + public async Task FindAsync() + { + var markedItem = await _userMarkedItemRepository.FindAsync( + _cmsKitTestData.User1Id, + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1 + ); + + markedItem.ShouldNotBeNull(); + markedItem.CreatorId.ShouldBe(_cmsKitTestData.User1Id); + markedItem.EntityId.ShouldBe(_cmsKitTestData.EntityId1); + markedItem.EntityType.ShouldBe(_cmsKitTestData.EntityType1); + } + + [Fact] + public async Task GetListForUserAsync() + { + var markedItems = await _userMarkedItemRepository.GetListForUserAsync( + _cmsKitTestData.User1Id, + _cmsKitTestData.EntityType1 + ); + + markedItems.Count.ShouldBe(2); + } + + [Fact] + public async Task GetQueryForUserAsync() + { + await WithUnitOfWorkAsync(async () => + { + var query = await _userMarkedItemRepository.GetQueryForUserAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.User1Id + ); + + + var markedItems = query.ToList(); + + markedItems.Count.ShouldBe(2); + markedItems.All(x => x.CreatorId == _cmsKitTestData.User1Id).ShouldBeTrue(); + markedItems.All(x => x.EntityType == _cmsKitTestData.EntityType1).ShouldBeTrue(); + }); + } +} From 404853ae649200f6e5ae16e3c8922077c8da119c Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 12 Jul 2024 14:51:09 +0300 Subject: [PATCH 2/9] Update MarkedItemManager.cs --- .../Volo/CmsKit/MarkedItems/MarkedItemManager.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs index 13510be7ac..8be3bfdeca 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs @@ -6,8 +6,10 @@ using Volo.Abp; namespace Volo.CmsKit.MarkedItems; public class MarkedItemManager : CmsKitDomainServiceBase { - IMarkedItemDefinitionStore MarkedItemDefinitionStore { get; set; } - IUserMarkedItemRepository UserMarkedItemRepository { get; set; } + protected IMarkedItemDefinitionStore MarkedItemDefinitionStore { get; set; } + + protected IUserMarkedItemRepository UserMarkedItemRepository { get; set; } + public MarkedItemManager( IUserMarkedItemRepository userMarkedItemRepository, IMarkedItemDefinitionStore markedItemDefinitionStore) From 413f5bc85f9da39752fd887114e6faa52b29dae9 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 12 Jul 2024 14:51:34 +0300 Subject: [PATCH 3/9] Call directly FirstOrDefaultAsync --- .../CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs index 66c9fc0ee3..642a52d145 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs @@ -24,11 +24,11 @@ public class EfCoreUserMarkedItemRepository : EfCoreRepository + .FirstOrDefaultAsync(x => x.CreatorId == userId && x.EntityType == entityType && - x.EntityId == entityId) - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + x.EntityId == entityId, + GetCancellationToken(cancellationToken)); return entity; } From 7212a79d494f1e55b273064bbd22a07c48d3a216 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 12 Jul 2024 14:52:11 +0300 Subject: [PATCH 4/9] Make injected properties protected --- .../CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs index db06ff2f07..8bd7da5aa7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs @@ -11,11 +11,11 @@ namespace Volo.CmsKit.Public.MarkedItems; [RequiresGlobalFeature(typeof(MarkedItemsFeature))] public class MarkedItemPublicAppService : CmsKitPublicAppServiceBase, IMarkedItemPublicAppService { - public IMarkedItemDefinitionStore MarkedItemDefinitionStore { get; } + protected IMarkedItemDefinitionStore MarkedItemDefinitionStore { get; } - public IUserMarkedItemRepository UserMarkedItemRepository { get; } + protected IUserMarkedItemRepository UserMarkedItemRepository { get; } - public MarkedItemManager MarkedItemManager { get; } + protected MarkedItemManager MarkedItemManager { get; } public MarkedItemPublicAppService( IMarkedItemDefinitionStore markedItemDefinitionStore, From 9091dcf575cb93fb635fb4f81425874917a85873 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 12 Jul 2024 14:52:24 +0300 Subject: [PATCH 5/9] Remove empty line --- .../Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js index 7c12d157e0..0c224542fb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/default.js @@ -7,7 +7,6 @@ let $markedItemArea = $widget.find('.cms-markedItem-area'); let loginModal = new abp.ModalManager(abp.appPath + 'CmsKit/Shared/Modals/Login/LoginModal'); - function getFilters() { return { entityType: $markedItemArea.attr('data-entity-type'), From 50da38bba911675339b5a1af6aa1857e29f18b70 Mon Sep 17 00:00:00 2001 From: Suhaib <93185683+suhaib-mousa@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:55:09 +0300 Subject: [PATCH 6/9] Update modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs Co-authored-by: Enis Necipoglu --- .../CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs index 8bd7da5aa7..1da43352c4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs @@ -7,7 +7,7 @@ using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.MarkedItems; namespace Volo.CmsKit.Public.MarkedItems; - +[RequiresFeature(CmsKitFeatures.PageEnable)] [RequiresGlobalFeature(typeof(MarkedItemsFeature))] public class MarkedItemPublicAppService : CmsKitPublicAppServiceBase, IMarkedItemPublicAppService { From d15c762191834221d6c21c8d0e4107e4fd884a42 Mon Sep 17 00:00:00 2001 From: Suhaib <93185683+suhaib-mousa@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:55:17 +0300 Subject: [PATCH 7/9] Update modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs Co-authored-by: Enis Necipoglu --- .../CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs index 1da43352c4..ea9bb5b7b4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs @@ -5,6 +5,8 @@ using Volo.Abp.GlobalFeatures; using Volo.Abp.Users; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.MarkedItems; +using Volo.CmsKit.Features; +using Volo.Abp.Features; namespace Volo.CmsKit.Public.MarkedItems; [RequiresFeature(CmsKitFeatures.PageEnable)] From 0cd0761cf53e2f2657281db24da58a22e2bc746c Mon Sep 17 00:00:00 2001 From: Suhaib Date: Fri, 12 Jul 2024 17:07:43 +0300 Subject: [PATCH 8/9] Improve MarkedItems module based on review feedback - Refactor CmsKitMarkedItemOptions to prevent duplicate entity type definitions - Enhance exception handling in DefaultMarkedItemDefinitionStore - Remove redundant GetAsync method from MarkedItemManager - Remove IQueryable exposure from IUserMarkedItemRepository - Align EntityTagRepository approach with other repositories - Rename GetForToggleAsync to GetAsync or GetForUserAsync in IMarkedItemPublicAppService These changes improve code clarity, consistency, and adherence to ABP.io best practices. --- docs/en/Modules/Cms-Kit/MarkedItems.md | 25 ------------------- .../Volo/CmsKit/CmsKitErrorCodes.cs | 2 ++ .../CmsKit/Localization/Resources/ar.json | 2 ++ .../CmsKit/Localization/Resources/en.json | 2 ++ .../DefaultMarkedItemDefinitionStore.cs | 16 ++++++++++-- .../DuplicateMarkedItemDefinitionException.cs | 16 ++++++++++++ .../MarkedItems/IUserMarkedItemRepository.cs | 5 ++-- .../MarkedItemDefinitionNotFoundException.cs | 16 ++++++++++++ .../CmsKit/MarkedItems/MarkedItemManager.cs | 10 +------- .../EfCoreUserMarkedItemRepository.cs | 23 +++++++---------- .../MongoUserMarkedItemRepository.cs | 24 ++++++++---------- .../IMarkedItemPublicAppService.cs | 2 +- .../MarkedItems/MarkedItemPublicAppService.cs | 6 ++--- .../IMarkedItemPublicAppService.cs | 2 +- .../MarkedItemPublicClientProxy.Generated.cs | 4 +-- .../ClientProxies/cms-kit-generate-proxy.json | 8 +++--- .../MarkedItems/MarkedItemPublicController.cs | 4 +-- .../MarkedItemToggleViewComponent.cs | 2 +- .../wwwroot/client-proxies/cms-kit-proxy.js | 2 +- .../MarkedItemPublicAppService_Tests.cs | 4 +-- .../MarkedItems/MarkedItemManager_Tests.cs | 13 ++-------- .../CmsKitDataSeedContributor.cs | 4 +-- .../UserMarkedItemRepository_Tests.cs | 19 +++++--------- 23 files changed, 102 insertions(+), 109 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DuplicateMarkedItemDefinitionException.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemDefinitionNotFoundException.cs diff --git a/docs/en/Modules/Cms-Kit/MarkedItems.md b/docs/en/Modules/Cms-Kit/MarkedItems.md index 198d8dae47..b7bbb77519 100644 --- a/docs/en/Modules/Cms-Kit/MarkedItems.md +++ b/docs/en/Modules/Cms-Kit/MarkedItems.md @@ -58,31 +58,6 @@ The marking system provides a toggle widget to allow users to add/remove the mar * `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. * `needsConfirmation` An optional parameter to let the user confirm when removing the mark. -# Filter on marked items - -Filtering on marked items enhances the user experience by making it easier to search marked items. - -![markedItemsFilter](../../images/cmskit-module-markedItemsFilter.gif) - -There is an ability to utilize the marking system to let users filter on their marked items. The code below shows how you can filter on your query filter: - -```csharp - protected async override Task> CreateFilteredQueryAsync(YourEntityPagedAndSortedResultDto input) - { - IQueryable query = await base.CreateFilteredQueryAsync(input); - - if (input.FilterOnFavorites && CurrentUser.IsAuthenticated) - { - var markedQuery = await UserMarkedItemRepository.GetQueryForUserAsync("entityType", CurrentUser.GetId()); - query = query.Where(e => markedQuery.Any(m => m.EntityId == e.Id)); - } - - // ... - - return query; - } -``` - # Internals ## Domain Layer diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs index bd49a57b57..9bd0ea1044 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs @@ -48,5 +48,7 @@ public static class CmsKitErrorCodes public static class MarkedItems { public const string EntityCannotBeMarked = "CmsKit:MarkedItem:0001"; + public const string MarkedItemDefinitionNotFound = "CmsKit:MarkedItem:0002"; + public const string DuplicateMarkedItem = "CmsKit:MarkedItem:0003"; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json index 8fa7bb1951..c86c314d87 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json @@ -26,6 +26,8 @@ "CmsKit:Rating:0001": "لا يمكن تصنيف الكيان {EntityType}.", "CmsKit:Reaction:0001": "لا يمكن أن يحتوي الكيان {EntityType} على ردود أفعال.", "CmsKit:MarkedItem:0001": "لا يمكن أن تمييز الكيان {EntityType}.", + "CmsKit:MarkedItem:0002": "لم يتم العثور على تعريف لنوع الكيان '{EntityType}'.", + "CmsKit:MarkedItem:0003": "يوجد بالفعل تعريف لنوع الكيان '{EntityType}'. يجب أن يكون لكل نوع كيان تعريف واحد فقط.", "CmsKit:Tag:0002": "الكيان غير قابل للوسم!", "CommentAuthorizationExceptionMessage": "هذه التعليقات غير مسموح بها للعرض العام.", "CommentDeletionConfirmationMessage": "سيتم حذف هذا التعليق وجميع الردود!", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index be039c3810..7be776daa3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -33,6 +33,8 @@ "CmsKit:Modals:YouAreNotAuthenticated": "This operation is not authorized for you.", "CommentDeletionConfirmationMessage": "This comment and all replies will be deleted!", "CmsKit:MarkedItem:0001": "The entity {EntityType} can't be marked.", + "CmsKit:MarkedItem:0002": "No definition found for entity type '{EntityType}'.", + "CmsKit:MarkedItem:0003": "A definition for entity type '{EntityType}' already exists. Each entity type should have only one definition.", "CmsKit:MarkedItem:LoginMessage": "Please login to mark this item.", "Comments": "Comments", "Content": "Content", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DefaultMarkedItemDefinitionStore.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DefaultMarkedItemDefinitionStore.cs index e208719740..20f23784b6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DefaultMarkedItemDefinitionStore.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DefaultMarkedItemDefinitionStore.cs @@ -29,8 +29,20 @@ public class DefaultMarkedItemDefinitionStore : IMarkedItemDefinitionStore { Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); - var definition = Options.EntityTypes.SingleOrDefault(x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)); + var definitions = Options.EntityTypes + .Where(x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)) + .ToList(); - return Task.FromResult(definition); + if (definitions.Count == 0) + { + throw new MarkedItemDefinitionNotFoundException(entityType); + } + + if (definitions.Count > 1) + { + throw new DuplicateMarkedItemDefinitionException(entityType); + } + + return Task.FromResult(definitions.Single()); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DuplicateMarkedItemDefinitionException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DuplicateMarkedItemDefinitionException.cs new file mode 100644 index 0000000000..0d8e4c6a83 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/DuplicateMarkedItemDefinitionException.cs @@ -0,0 +1,16 @@ +using JetBrains.Annotations; +using Volo.Abp; + +namespace Volo.CmsKit.MarkedItems; + +public class DuplicateMarkedItemDefinitionException : BusinessException +{ + public DuplicateMarkedItemDefinitionException([NotNull] string entityType) + { + EntityType = Check.NotNullOrEmpty(entityType, nameof(entityType)); + Code = CmsKitErrorCodes.MarkedItems.DuplicateMarkedItem; + WithData(nameof(EntityType), EntityType); + } + + public string EntityType { get; } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IUserMarkedItemRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IUserMarkedItemRepository.cs index e0482a8e1b..38bd2ff2e8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IUserMarkedItemRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/IUserMarkedItemRepository.cs @@ -23,9 +23,10 @@ public interface IUserMarkedItemRepository : IBasicRepository> GetQueryForUserAsync( - [NotNull] string entityType, + Task> GetEntityIdsFilteredByUserAsync( [NotNull] Guid userId, + [NotNull] string entityType, + [CanBeNull] Guid? tenantId = null, CancellationToken cancellationToken = default ); } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemDefinitionNotFoundException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemDefinitionNotFoundException.cs new file mode 100644 index 0000000000..89545fb3a4 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemDefinitionNotFoundException.cs @@ -0,0 +1,16 @@ +using JetBrains.Annotations; +using Volo.Abp; + +namespace Volo.CmsKit.MarkedItems; + +public class MarkedItemDefinitionNotFoundException : BusinessException +{ + public MarkedItemDefinitionNotFoundException([NotNull] string entityType) + { + EntityType = Check.NotNullOrEmpty(entityType, nameof(entityType)); + Code = CmsKitErrorCodes.MarkedItems.MarkedItemDefinitionNotFound; + WithData(nameof(EntityType), EntityType); + } + + public string EntityType { get; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs index 8be3bfdeca..15c858f5c4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs @@ -18,7 +18,7 @@ public class MarkedItemManager : CmsKitDomainServiceBase MarkedItemDefinitionStore = markedItemDefinitionStore; } - public virtual async Task ToggleAsync( + public virtual async Task ToggleUserMarkedItemAsync( Guid creatorId, [NotNull] string entityType, [NotNull] string entityId) @@ -49,12 +49,4 @@ public class MarkedItemManager : CmsKitDomainServiceBase ); return true; } - - public virtual async Task GetAsync( - [NotNull] string entityType) - { - Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); - - return await MarkedItemDefinitionStore.GetAsync(entityType); - } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs index 642a52d145..8f1214ffca 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/MarkedItems/EfCoreUserMarkedItemRepository.cs @@ -45,23 +45,18 @@ public class EfCoreUserMarkedItemRepository : EfCoreRepository - /// Retrieves an IQueryable representing the user's marked items based on the specified entity type and user ID. - /// - /// The type of entity to filter by. - /// The ID of the user whose marked items are being retrieved. - /// Cancellation token. - /// An IQueryable representing the user's marked items filtered by the specified entity type and user ID. - public async Task> GetQueryForUserAsync([NotNull] string entityType, [NotNull] Guid userId, CancellationToken cancellationToken = default) + public async Task> GetEntityIdsFilteredByUserAsync([NotNull] Guid userId, [NotNull] string entityType, [CanBeNull] Guid? tenantId = null, CancellationToken cancellationToken = default) { - Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); Check.NotNull(userId, nameof(userId)); + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); - var dbSet = await GetDbSetAsync(); - - var query = dbSet - .Where(x => x.EntityType == entityType && x.CreatorId == userId); + var dbContext = await GetDbContextAsync(); + var result = from umi in dbContext.Set() + where umi.CreatorId == userId + && umi.EntityType == entityType + && umi.TenantId == tenantId + select umi.EntityId; - return query; + return await result.ToListAsync(cancellationToken: GetCancellationToken(cancellationToken)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/MarkedItems/MongoUserMarkedItemRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/MarkedItems/MongoUserMarkedItemRepository.cs index 9339a6cb49..91fbbf996e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/MarkedItems/MongoUserMarkedItemRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/MarkedItems/MongoUserMarkedItemRepository.cs @@ -46,22 +46,18 @@ public class MongoUserMarkedItemRepository : MongoDbRepository - /// Retrieves an IQueryable representing the user's marked items based on the specified entity type and user ID. - /// - /// The type of entity to filter by. - /// The ID of the user whose marked items are being retrieved. - /// Cancellation token. - /// An IQueryable representing the user's marked items filtered by the specified entity type and user ID. - public virtual async Task> GetQueryForUserAsync([NotNull] string entityType, [NotNull] Guid userId, CancellationToken cancellationToken = default) + public virtual async Task> GetEntityIdsFilteredByUserAsync([NotNull] Guid userId, [NotNull] string entityType, [CanBeNull] Guid? tenantId = null, CancellationToken cancellationToken = default) { - Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); - Check.NotNull(userId, nameof(userId)); + var dbContext = await GetDbContextAsync(); + var userMarkedItemQueryable = await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)); - var queryable = await GetMongoQueryableAsync(cancellationToken); - var query = queryable - .Where(x => x.EntityType == entityType && x.CreatorId == userId); + var resultQueryable = userMarkedItemQueryable + .Where(x => x.CreatorId == userId + && x.EntityType == entityType + && x.TenantId == tenantId + ) + .Select(s => s.EntityId); - return query; + return await AsyncExecuter.ToListAsync(resultQueryable, GetCancellationToken(cancellationToken)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs index 491a425f15..03691c4391 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs @@ -5,6 +5,6 @@ namespace Volo.CmsKit.Public.MarkedItems; public interface IMarkedItemPublicAppService : IApplicationService { - Task GetForToggleAsync(string entityType, string entityId); + Task GetForUserAsync(string entityType, string entityId); Task ToggleAsync(string entityType, string entityId); } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs index ea9bb5b7b4..72af653167 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs @@ -30,9 +30,9 @@ public class MarkedItemPublicAppService : CmsKitPublicAppServiceBase, IMarkedIte } [AllowAnonymous] - public virtual async Task GetForToggleAsync(string entityType, string entityId) + public virtual async Task GetForUserAsync(string entityType, string entityId) { - var markedItem = await MarkedItemManager.GetAsync(entityType); + var markedItem = await MarkedItemDefinitionStore.GetAsync(entityType); var userMarkedItem = CurrentUser.IsAuthenticated ? (await UserMarkedItemRepository @@ -53,7 +53,7 @@ public class MarkedItemPublicAppService : CmsKitPublicAppServiceBase, IMarkedIte [Authorize] public virtual async Task ToggleAsync(string entityType, string entityId) { - return await MarkedItemManager.ToggleAsync( + return await MarkedItemManager.ToggleUserMarkedItemAsync( CurrentUser.GetId(), entityType, entityId diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs index 51bc65d58b..5387fae58b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/IMarkedItemPublicAppService.cs @@ -12,7 +12,7 @@ namespace Volo.CmsKit.Public.MarkedItems; public interface IMarkedItemPublicAppService : IApplicationService { - Task GetForToggleAsync(string entityType, string entityId); + Task GetForUserAsync(string entityType, string entityId); Task ToggleAsync(string entityType, string entityId); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.Generated.cs index 31940807c7..f46c59ce6a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicClientProxy.Generated.cs @@ -17,9 +17,9 @@ namespace Volo.CmsKit.Public.MarkedItems; [ExposeServices(typeof(IMarkedItemPublicAppService), typeof(MarkedItemPublicClientProxy))] public partial class MarkedItemPublicClientProxy : ClientProxyBase, IMarkedItemPublicAppService { - public virtual async Task GetForToggleAsync(string entityType, string entityId) + public virtual async Task GetForUserAsync(string entityType, string entityId) { - return await RequestAsync(nameof(GetForToggleAsync), new ClientProxyRequestTypeValue + return await RequestAsync(nameof(GetForUserAsync), new ClientProxyRequestTypeValue { { typeof(string), entityType }, { typeof(string), entityId } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index 6917a58fb7..b51fb76677 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -921,7 +921,7 @@ "name": "IMarkedItemPublicAppService", "methods": [ { - "name": "GetForToggleAsync", + "name": "GetForUserAsync", "parametersOnMethod": [ { "name": "entityType", @@ -974,9 +974,9 @@ } ], "actions": { - "GetForToggleAsyncByEntityTypeAndEntityId": { - "uniqueName": "GetForToggleAsyncByEntityTypeAndEntityId", - "name": "GetForToggleAsync", + "GetForUserAsyncByEntityTypeAndEntityId": { + "uniqueName": "GetForUserAsyncByEntityTypeAndEntityId", + "name": "GetForUserAsync", "httpMethod": "GET", "url": "api/cms-kit-public/marked-items/{entityType}/{entityId}", "supportedVersions": [], diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicController.cs index 9f09525f65..e000ae9ba1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicController.cs @@ -24,9 +24,9 @@ public class MarkedItemPublicController : CmsKitPublicControllerBase, IMarkedIte [HttpGet] [Route("{entityType}/{entityId}")] - public virtual Task GetForToggleAsync(string entityType, string entityId) + public virtual Task GetForUserAsync(string entityType, string entityId) { - return MarkedItemPublicAppService.GetForToggleAsync(entityType, entityId); + return MarkedItemPublicAppService.GetForUserAsync(entityType, entityId); } [HttpPut] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleViewComponent.cs index 471953940d..7910d37ed2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/MarkedItemToggle/MarkedItemToggleViewComponent.cs @@ -36,7 +36,7 @@ public class MarkedItemToggleViewComponent : AbpViewComponent string entityId, bool? needsConfirmation = false) { - var result = await MarkedItemPublicAppService.GetForToggleAsync(entityType, entityId); + var result = await MarkedItemPublicAppService.GetForUserAsync(entityType, entityId); var returnUrl = HttpContext.Request.Path.ToString(); var viewModel = new MarkedItemToggleViewModel diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js index d1a18731cb..5f5ea08ffa 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js @@ -123,7 +123,7 @@ abp.utils.createNamespace(window, 'volo.cmsKit.public.markedItems.markedItemPublic'); - volo.cmsKit.public.markedItems.markedItemPublic.getForToggle = function(entityType, entityId, ajaxParams) { + volo.cmsKit.public.markedItems.markedItemPublic.getForUser = function(entityType, entityId, ajaxParams) { return abp.ajax($.extend(true, { url: abp.appPath + 'api/cms-kit-public/marked-items/' + entityType + '/' + entityId + '', type: 'GET' diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/MarkedItems/MarkedItemPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/MarkedItems/MarkedItemPublicAppService_Tests.cs index e9bf6eb772..9129414023 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/MarkedItems/MarkedItemPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/MarkedItems/MarkedItemPublicAppService_Tests.cs @@ -32,11 +32,11 @@ public class MarkedItemPublicAppService_Tests : CmsKitApplicationTestBase _currentUser.Id.Returns(_cmsKitTestData.User1Id); _currentUser.IsAuthenticated.Returns(true); - var firstMarkedItem = await _markedItemPublicAppService.GetForToggleAsync( + var firstMarkedItem = await _markedItemPublicAppService.GetForUserAsync( _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1 ); - var secondMarkedItem = await _markedItemPublicAppService.GetForToggleAsync( + var secondMarkedItem = await _markedItemPublicAppService.GetForUserAsync( _cmsKitTestData.EntityType2, _cmsKitTestData.EntityId1 ); diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/MarkedItems/MarkedItemManager_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/MarkedItems/MarkedItemManager_Tests.cs index 8e132932df..0d78fd8457 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/MarkedItems/MarkedItemManager_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/MarkedItems/MarkedItemManager_Tests.cs @@ -18,13 +18,13 @@ public class MarkedItemManager_Tests : CmsKitDomainTestBase [Fact] public async Task ToggleAsync() { - var firstToggleResult = await _markedItemManager.ToggleAsync( + var firstToggleResult = await _markedItemManager.ToggleUserMarkedItemAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType2, _cmsKitTestData.EntityId1 ); - var secondToggleResult = await _markedItemManager.ToggleAsync( + var secondToggleResult = await _markedItemManager.ToggleUserMarkedItemAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType2, _cmsKitTestData.EntityId1 @@ -33,13 +33,4 @@ public class MarkedItemManager_Tests : CmsKitDomainTestBase firstToggleResult.ShouldBeTrue(); secondToggleResult.ShouldBeFalse(); } - - [Fact] - public async Task GetAsync() - { - var markedItem = await _markedItemManager.GetAsync(_cmsKitTestData.EntityType1); - - markedItem.EntityType.ShouldBe(_cmsKitTestData.EntityType1); - markedItem.IconName.ShouldBe(StandardMarkedItems.Favorite); - } } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index d4b055af60..b516c680a1 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -457,12 +457,12 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende private async Task SeedMarkedItemsAsync() { - await _markedItemManager.ToggleAsync( + await _markedItemManager.ToggleUserMarkedItemAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1 ); - await _markedItemManager.ToggleAsync( + await _markedItemManager.ToggleUserMarkedItemAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId2 diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/MarkedItems/UserMarkedItemRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/MarkedItems/UserMarkedItemRepository_Tests.cs index 5defd43029..f7af57f725 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/MarkedItems/UserMarkedItemRepository_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/MarkedItems/UserMarkedItemRepository_Tests.cs @@ -43,22 +43,15 @@ public abstract class UserMarkedItemRepository_Tests : CmsKitTes markedItems.Count.ShouldBe(2); } + [Fact] - public async Task GetQueryForUserAsync() + public async Task GetEntityIdsFilteredByUserAsync() { - await WithUnitOfWorkAsync(async () => - { - var query = await _userMarkedItemRepository.GetQueryForUserAsync( - _cmsKitTestData.EntityType1, - _cmsKitTestData.User1Id - ); - + var entityIds = await _userMarkedItemRepository.GetEntityIdsFilteredByUserAsync(_cmsKitTestData.User1Id, _cmsKitTestData.EntityType1); - var markedItems = query.ToList(); + entityIds.ShouldNotBeNull(); + entityIds.ShouldNotBeEmpty(); - markedItems.Count.ShouldBe(2); - markedItems.All(x => x.CreatorId == _cmsKitTestData.User1Id).ShouldBeTrue(); - markedItems.All(x => x.EntityType == _cmsKitTestData.EntityType1).ShouldBeTrue(); - }); + entityIds.Count.ShouldBe(2); } } From 1cea4716ddbbca278da3415aee4c1b613bc8e609 Mon Sep 17 00:00:00 2001 From: Suhaib Date: Fri, 12 Jul 2024 18:51:25 +0300 Subject: [PATCH 9/9] resolve the feature checking to check on markedItem feature --- .../CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs index 72af653167..8b1cc96854 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/MarkedItems/MarkedItemPublicAppService.cs @@ -9,7 +9,7 @@ using Volo.CmsKit.Features; using Volo.Abp.Features; namespace Volo.CmsKit.Public.MarkedItems; -[RequiresFeature(CmsKitFeatures.PageEnable)] +[RequiresFeature(CmsKitFeatures.MarkedItemEnable)] [RequiresGlobalFeature(typeof(MarkedItemsFeature))] public class MarkedItemPublicAppService : CmsKitPublicAppServiceBase, IMarkedItemPublicAppService {