From 2d6c822218acb8522c23f939d5e29450d9de0f92 Mon Sep 17 00:00:00 2001 From: enisn Date: Thu, 28 Jan 2021 15:59:23 +0300 Subject: [PATCH 1/4] CmsKit - Refactor Reactions Definitions Configuration --- .../Volo/CmsKit/CmsKitDomainModule.cs | 28 ++++++++++--------- .../CmsKitReactionOptions.cs} | 6 ++-- .../DefaultReactionDefinitionStore.cs | 8 +++--- .../CmsKit/Reactions/ReactionDefinition.cs | 1 + .../Reactions/ReactionDefinitionDictionary.cs | 6 +--- .../Comments/CommentPublicAppService.cs | 5 +--- .../CmsKitDataSeedContributor.cs | 6 ++-- 7 files changed, 27 insertions(+), 33 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/{CmsKitOptions.cs => Reactions/CmsKitReactionOptions.cs} (61%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs index a60cb0d521..d553a2cd2b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs @@ -1,4 +1,6 @@ using Microsoft.Extensions.Options; +using System.Collections.Generic; +using Volo.Abp; using Volo.Abp.Domain; using Volo.Abp.GlobalFeatures; using Volo.Abp.Localization; @@ -21,20 +23,20 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => + Configure(options => { - options.Reactions.AddOrReplace(StandardReactions.ThumbsUp); - options.Reactions.AddOrReplace(StandardReactions.ThumbsDown); - options.Reactions.AddOrReplace(StandardReactions.Smile); - options.Reactions.AddOrReplace(StandardReactions.Wink); - options.Reactions.AddOrReplace(StandardReactions.Confused); - options.Reactions.AddOrReplace(StandardReactions.Victory); - options.Reactions.AddOrReplace(StandardReactions.Rock); - options.Reactions.AddOrReplace(StandardReactions.Eyes); - options.Reactions.AddOrReplace(StandardReactions.Heart); - options.Reactions.AddOrReplace(StandardReactions.HeartBroken); - options.Reactions.AddOrReplace(StandardReactions.Rocket); - options.Reactions.AddOrReplace(StandardReactions.Pray); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.ThumbsUp)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.ThumbsDown)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Smile)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Wink)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Confused)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Victory)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Rock)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Eyes)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Heart)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.HeartBroken)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Rocket)); + options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Pray)); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitOptions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/CmsKitReactionOptions.cs similarity index 61% rename from modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitOptions.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/CmsKitReactionOptions.cs index 8075895184..065c4c5ee7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitOptions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/CmsKitReactionOptions.cs @@ -1,10 +1,8 @@ using JetBrains.Annotations; -using Volo.CmsKit.Reactions; -using Volo.CmsKit.Tags; -namespace Volo.CmsKit +namespace Volo.CmsKit.Reactions { - public class CmsKitOptions + public class CmsKitReactionOptions { [NotNull] public ReactionDefinitionDictionary Reactions { get; } = new ReactionDefinitionDictionary(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs index 84cb15471d..e0211faea9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs @@ -8,21 +8,21 @@ namespace Volo.CmsKit.Reactions { public class DefaultReactionDefinitionStore : IReactionDefinitionStore, ITransientDependency { - protected CmsKitOptions Options { get; } + protected CmsKitReactionOptions Options { get; } - public DefaultReactionDefinitionStore(IOptions options) + public DefaultReactionDefinitionStore(IOptions options) { Options = options.Value; } public virtual Task> GetReactionsAsync(string entityType = null) { - return Task.FromResult(Options.Reactions.Values.ToList()); + return Task.FromResult(Options.Reactions.ToList()); } public virtual Task GetReactionOrNullAsync(string reactionName, string entityType = null) { - return Task.FromResult(Options.Reactions.GetOrDefault(reactionName)); + return Task.FromResult(Options.Reactions.SingleOrDefault(x => x.Name == reactionName)); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinition.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinition.cs index 01d96617ea..463abc172d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinition.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinition.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using System; using Volo.Abp; using Volo.Abp.Localization; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinitionDictionary.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinitionDictionary.cs index 94ff90fa45..2f72bcc40e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinitionDictionary.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinitionDictionary.cs @@ -4,11 +4,7 @@ using Volo.Abp.Localization; namespace Volo.CmsKit.Reactions { - public class ReactionDefinitionDictionary : Dictionary + public class ReactionDefinitionDictionary : List { - public void AddOrReplace([NotNull] string name, ILocalizableString displayName = null) - { - this[name] = new ReactionDefinition(name, displayName); - } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index a4ce4a2b46..4e390e4ec1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -17,7 +17,6 @@ namespace Volo.CmsKit.Public.Comments { public class CommentPublicAppService : ApplicationService, ICommentPublicAppService { - protected CmsKitOptions CmsKitOptions { get; } protected ICommentRepository CommentRepository { get; } protected ICmsUserLookupService CmsUserLookupService { get; } public IDistributedEventBus DistributedEventBus { get; } @@ -27,10 +26,8 @@ namespace Volo.CmsKit.Public.Comments ICommentRepository commentRepository, ICmsUserLookupService cmsUserLookupService, IDistributedEventBus distributedEventBus, - IUnitOfWorkManager unitOfWorkManager, - IOptions cmsKitOptions) + IUnitOfWorkManager unitOfWorkManager) { - CmsKitOptions = cmsKitOptions.Value; CommentRepository = commentRepository; CmsUserLookupService = cmsUserLookupService; DistributedEventBus = distributedEventBus; diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index 3dc77fe1fc..2f67a65a50 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -30,7 +30,7 @@ namespace Volo.CmsKit private readonly IEntityTagManager _entityTagManager; private readonly ITagManager _tagManager; private readonly IPageRepository _pageRepository; - private readonly IOptions _options; + private readonly IOptions _reactionOptions; private readonly IOptions _tagOptions; public CmsKitDataSeedContributor( @@ -45,7 +45,7 @@ namespace Volo.CmsKit ITagManager tagManager, IEntityTagManager entityTagManager, IPageRepository pageRepository, - IOptions options, + IOptions reactiOnptions, IOptions tagOptions) { _guidGenerator = guidGenerator; @@ -59,7 +59,7 @@ namespace Volo.CmsKit _tagManager = tagManager; _entityTagManager = entityTagManager; _pageRepository = pageRepository; - _options = options; + _reactionOptions = reactiOnptions; _tagOptions = tagOptions; } From 55b62d1b86a69db69813fc2d36dc604645ef50bc Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 19 Feb 2021 14:44:45 +0300 Subject: [PATCH 2/4] CmsKit - Merge from dev - conflict fix --- .../test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index bf85f7209a..607399dd39 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -54,9 +54,13 @@ namespace Volo.CmsKit IRatingRepository ratingRepository, ICurrentTenant currentTenant, IContentRepository contentRepository, + IEntityTagManager entityTagManager, ITagManager tagManager, IEntityTagRepository entityTagRepository, IPageRepository pageRepository, + IBlogRepository blogRepository, + IBlogPostRepository blogPostRepository, + IOptions reactionOptions, IOptions tagOptions, IMediaDescriptorRepository mediaDescriptorRepository, IBlobContainer mediaBlobContainer) @@ -75,8 +79,7 @@ namespace Volo.CmsKit _pageRepository = pageRepository; _blogRepository = blogRepository; _blogPostRepository = blogPostRepository; - _options = options; - _reactionOptions = reactiOnptions; + _reactionOptions = reactionOptions; _tagOptions = tagOptions; _mediaDescriptorRepository = mediaDescriptorRepository; _mediaBlobContainer = mediaBlobContainer; From e046e2ae70e7694b43dbab041718c0ea9b85b168 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 5 Mar 2021 11:43:03 +0300 Subject: [PATCH 3/4] CmsKit - Fix merge conflict --- .../Volo/CmsKit/Public/Comments/CommentPublicAppService.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index a023f05e76..ff5975fadf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -26,7 +26,6 @@ namespace Volo.CmsKit.Public.Comments ICommentRepository commentRepository, ICmsUserLookupService cmsUserLookupService, IDistributedEventBus distributedEventBus, - IOptions cmsKitOptions, CommentManager commentManager) { CommentRepository = commentRepository; From 0d2d29d344715cf47a8d55b2bef8b5554bacd9da Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 10 Mar 2021 13:35:38 +0300 Subject: [PATCH 4/4] CmsKit - Add EntityTypeDefinition to Reactions --- .../CmsKitWebUnifiedModule.cs | 18 +++++++ .../Volo/CmsKit/CmsKitErrorCodes.cs | 5 ++ .../Volo/CmsKit/Comments/CommentConsts.cs | 1 + .../CmsKit/Localization/Resources/en.json | 3 +- .../CmsKit/Localization/Resources/tr.json | 1 + .../Volo/CmsKit/CmsKitDomainModule.cs | 53 ++++++++++++++----- .../CmsKit/Reactions/CmsKitReactionOptions.cs | 3 +- .../DefaultReactionDefinitionStore.cs | 41 ++++++++++++-- .../EntityCantHaveReactionException.cs | 23 ++++++++ .../Reactions/IReactionDefinitionStore.cs | 8 ++- .../Reactions/ReactionDefinitionDictionary.cs | 10 ---- .../Reactions/ReactionEntityTypeDefinition.cs | 26 +++++++++ .../Volo/CmsKit/Reactions/ReactionManager.cs | 11 +++- .../Reactions/ReactionPublicAppService.cs | 2 +- .../Reactions/ReactionManager_Tests.cs | 4 +- .../CmsKitDataSeedContributor.cs | 31 +++++++++-- 16 files changed, 197 insertions(+), 43 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/EntityCantHaveReactionException.cs delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinitionDictionary.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionEntityTypeDefinition.cs 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 3f36f7343e..a7a87bb1d6 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -39,6 +39,8 @@ using Volo.Abp.Threading; using Volo.Abp.VirtualFileSystem; using Volo.CmsKit.Admin.Web; using Volo.CmsKit.Public.Web; +using System; +using Volo.CmsKit.Reactions; namespace Volo.CmsKit { @@ -81,6 +83,8 @@ namespace Volo.CmsKit var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + ConfigureCmsKit(context); + Configure(options => { options.UseSqlServer(); @@ -131,6 +135,20 @@ namespace Volo.CmsKit }); } + private void ConfigureCmsKit(ServiceConfigurationContext context) + { + Configure(options => + { + options.EntityTypes.Add( + new ReactionEntityTypeDefinition("quote", + reactions: new[] + { + new ReactionDefinition(StandardReactions.ThumbsUp), + new ReactionDefinition(StandardReactions.ThumbsDown), + })); + }); + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); 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 064c504fb4..013ef3318f 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 @@ -15,6 +15,11 @@ public const string SlugAlreadyExist = "CmsKit:Page:0001"; } + public static class Reactions + { + public const string EntityCantHaveReaction = "CmsKit:Reaction:0001"; + } + public static class Blogs { public const string SlugAlreadyExists = "CmsKit:Blog:0001"; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs index 68091c7f2d..27298e3acf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs @@ -4,6 +4,7 @@ namespace Volo.CmsKit.Comments { public static class CommentConsts { + public const string EntityType = "Comment"; 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.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 5ae38566af..5638d92fa8 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 @@ -17,10 +17,11 @@ "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 {0} is not commentable.", + "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 ({0}) already exists.", + "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!", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 2571d7ad96..73c02088ea 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -18,6 +18,7 @@ "CmsKit:0003": "{0} ögesi etiketlenebilir değil.", "CmsKit:BlogPost:0001": "Aynı url etiketi zaten mevcut.", "CmsKit:Media:0002": "Bu öge için medya eklenemez.", + "CmsKit:Reaction:0001": "Bu ögeye tepki verilemez.", "CmsKit:Page:0001": "Girilen url ({0}) kullanımdadır.", "CmsKit:Tag:0002": "Bu öge etiketlenebilir değil.", "CommentAuthorizationExceptionMessage": "Bu yorumları görebilmek için yetki gerekir.", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs index 47a2502095..e8010d1b3b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs @@ -12,6 +12,8 @@ using Volo.CmsKit.Localization; using Volo.CmsKit.Pages; using Volo.CmsKit.Reactions; using Volo.CmsKit.Tags; +using Volo.CmsKit.Blogs; +using Volo.CmsKit.Comments; namespace Volo.CmsKit { @@ -25,22 +27,45 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => + if (GlobalFeatureManager.Instance.IsEnabled()) { - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.ThumbsUp)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.ThumbsDown)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Smile)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Wink)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Confused)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Victory)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Rock)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Eyes)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Heart)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.HeartBroken)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Rocket)); - options.Reactions.AddIfNotContains(new ReactionDefinition(StandardReactions.Pray)); + Configure(options => + { + if (GlobalFeatureManager.Instance.IsEnabled()) + { + options.EntityTypes.Add( + new ReactionEntityTypeDefinition( + BlogPostConsts.EntityType, + reactions: new[] + { + new ReactionDefinition(StandardReactions.Smile), + new ReactionDefinition(StandardReactions.ThumbsUp), + new ReactionDefinition(StandardReactions.ThumbsDown), + new ReactionDefinition(StandardReactions.Confused), + new ReactionDefinition(StandardReactions.Eyes), + new ReactionDefinition(StandardReactions.Heart), + new ReactionDefinition(StandardReactions.HeartBroken), + new ReactionDefinition(StandardReactions.Wink), + new ReactionDefinition(StandardReactions.Pray), + new ReactionDefinition(StandardReactions.Rocket), + new ReactionDefinition(StandardReactions.Victory), + new ReactionDefinition(StandardReactions.Rock), + })); + } - }); + if (GlobalFeatureManager.Instance.IsEnabled()) + { + options.EntityTypes.Add( + new ReactionEntityTypeDefinition( + CommentConsts.EntityType, + reactions: new[] + { + new ReactionDefinition(StandardReactions.ThumbsUp), + new ReactionDefinition(StandardReactions.ThumbsDown), + })); + } + }); + } if (GlobalFeatureManager.Instance.IsEnabled()) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/CmsKitReactionOptions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/CmsKitReactionOptions.cs index 065c4c5ee7..90c49cc4cf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/CmsKitReactionOptions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/CmsKitReactionOptions.cs @@ -1,10 +1,11 @@ using JetBrains.Annotations; +using System.Collections.Generic; namespace Volo.CmsKit.Reactions { public class CmsKitReactionOptions { [NotNull] - public ReactionDefinitionDictionary Reactions { get; } = new ReactionDefinitionDictionary(); + public List EntityTypes { get; } = new (); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs index e0211faea9..8af09e8946 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/DefaultReactionDefinitionStore.cs @@ -1,7 +1,10 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.Extensions.Options; +using Volo.Abp; using Volo.Abp.DependencyInjection; namespace Volo.CmsKit.Reactions @@ -15,14 +18,42 @@ namespace Volo.CmsKit.Reactions Options = options.Value; } - public virtual Task> GetReactionsAsync(string entityType = null) + public virtual async Task> GetReactionsAsync([NotNull] string entityType) { - return Task.FromResult(Options.Reactions.ToList()); + Check.NotNullOrEmpty(entityType, nameof(entityType)); + + var definition = await GetAsync(entityType); + + return definition.Reactions; + } + + public virtual async Task GetReactionOrNullAsync([NotNull] string reactionName, [NotNull] string entityType) + { + Check.NotNullOrEmpty(entityType, nameof(entityType)); + Check.NotNullOrEmpty(reactionName, nameof(reactionName)); + + var definition = await GetAsync(entityType); + + return definition.Reactions.SingleOrDefault(x => x.Name == reactionName); } - public virtual Task GetReactionOrNullAsync(string reactionName, string entityType = null) + public virtual Task IsDefinedAsync([NotNull] string entityType) { - return Task.FromResult(Options.Reactions.SingleOrDefault(x => x.Name == reactionName)); + 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)) ?? + throw new EntityCantHaveReactionException(entityType); + + return Task.FromResult(definition); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/EntityCantHaveReactionException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/EntityCantHaveReactionException.cs new file mode 100644 index 0000000000..0cf54bb6f9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/EntityCantHaveReactionException.cs @@ -0,0 +1,23 @@ + +using JetBrains.Annotations; +using System.Runtime.Serialization; +using Volo.Abp; + +namespace Volo.CmsKit.Reactions +{ + public class EntityCantHaveReactionException : BusinessException + { + public EntityCantHaveReactionException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) + { + } + + public EntityCantHaveReactionException([NotNull] string entityType) + { + EntityType = Check.NotNullOrEmpty(entityType, nameof(entityType)); + Code = CmsKitErrorCodes.Reactions.EntityCantHaveReaction; + WithData(nameof(EntityType), EntityType); + } + + public string EntityType { get; } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/IReactionDefinitionStore.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/IReactionDefinitionStore.cs index 3c2dee7008..23c6d23ee7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/IReactionDefinitionStore.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/IReactionDefinitionStore.cs @@ -6,8 +6,12 @@ namespace Volo.CmsKit.Reactions { public interface IReactionDefinitionStore { - Task> GetReactionsAsync([CanBeNull] string entityType = null); + Task IsDefinedAsync([NotNull]string entityType); - Task GetReactionOrNullAsync([NotNull] string reactionName, [CanBeNull] string entityType = null); + Task GetAsync([NotNull] string entityType); + + Task> GetReactionsAsync([NotNull] string entityType); + + Task GetReactionOrNullAsync([NotNull] string reactionName, [NotNull] string entityType); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinitionDictionary.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinitionDictionary.cs deleted file mode 100644 index 2f72bcc40e..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionDefinitionDictionary.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; -using JetBrains.Annotations; -using Volo.Abp.Localization; - -namespace Volo.CmsKit.Reactions -{ - public class ReactionDefinitionDictionary : List - { - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionEntityTypeDefinition.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionEntityTypeDefinition.cs new file mode 100644 index 0000000000..d1036e1cd1 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionEntityTypeDefinition.cs @@ -0,0 +1,26 @@ +using JetBrains.Annotations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; + +namespace Volo.CmsKit.Reactions +{ + public class ReactionEntityTypeDefinition : PolicySpecifiedDefinition + { + [NotNull] + public List Reactions { get; } = new(); + + public ReactionEntityTypeDefinition( + [NotNull] string entityType, + [NotNull] IEnumerable reactions, + IEnumerable createPolicies = null, + IEnumerable updatePolicies = null, + IEnumerable deletePolicies = null) : base(entityType, createPolicies, updatePolicies, deletePolicies) + { + Reactions = Check.NotNull(reactions, nameof(reactions)).ToList(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionManager.cs index 894ed10a47..d43fbe48d4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Reactions/ReactionManager.cs @@ -22,8 +22,10 @@ namespace Volo.CmsKit.Reactions } public virtual async Task> GetReactionsAsync( - [CanBeNull] string entityType = null) + [NotNull] string entityType) { + Check.NotNullOrEmpty(entityType, nameof(entityType)); + return await ReactionDefinitionStore.GetReactionsAsync(entityType); } @@ -51,7 +53,7 @@ namespace Volo.CmsKit.Reactions .ToList(); } - public virtual async Task CreateAsync( + public virtual async Task GetOrCreateAsync( Guid creatorId, [NotNull] string entityType, [NotNull] string entityId, @@ -67,6 +69,11 @@ namespace Volo.CmsKit.Reactions return existingReaction; } + if (!await ReactionDefinitionStore.IsDefinedAsync(entityType)) + { + throw new EntityCantHaveReactionException(entityType); + } + return await UserReactionRepository.InsertAsync( new UserReaction( GuidGenerator.Create(), diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Reactions/ReactionPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Reactions/ReactionPublicAppService.cs index 44135d867e..ae8e725655 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Reactions/ReactionPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Reactions/ReactionPublicAppService.cs @@ -59,7 +59,7 @@ namespace Volo.CmsKit.Public.Reactions [Authorize] public virtual async Task CreateAsync(string entityType, string entityId, string reaction) { - await ReactionManager.CreateAsync( + await ReactionManager.GetOrCreateAsync( CurrentUser.GetId(), entityType, entityId, diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Reactions/ReactionManager_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Reactions/ReactionManager_Tests.cs index 9e4a903577..e9af4c3e7e 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Reactions/ReactionManager_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Reactions/ReactionManager_Tests.cs @@ -19,7 +19,7 @@ namespace Volo.CmsKit.Reactions [Fact] public async Task GetReactionsAsync() { - var reactions = await _reactionManager.GetReactionsAsync(); + var reactions = await _reactionManager.GetReactionsAsync(_cmsKitTestData.EntityType1); reactions.Count.ShouldBe(12); @@ -44,7 +44,7 @@ namespace Volo.CmsKit.Reactions [Fact] public async Task CreateAsync() { - var reaction = await _reactionManager.CreateAsync( + var reaction = await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User2Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId2, diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index 91072e0c7d..7971972227 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -64,6 +64,7 @@ namespace Volo.CmsKit BlogPostManager blogPostmanager, IBlogFeatureRepository blogFeatureRepository, EntityTagManager entityTagManager, + IOptions reactionOptions, IOptions tagOptions, IMediaDescriptorRepository mediaDescriptorRepository, IBlobContainer mediaBlobContainer, @@ -87,6 +88,7 @@ namespace Volo.CmsKit _blogPostRepository = blogPostRepository; _blogPostManager = blogPostmanager; _blogFeatureRepository = blogFeatureRepository; + _reactionOptions = reactionOptions; _tagOptions = tagOptions; _mediaDescriptorRepository = mediaDescriptorRepository; _mediaBlobContainer = mediaBlobContainer; @@ -138,6 +140,25 @@ namespace Volo.CmsKit _commentsOptions.Value.EntityTypes.Add( new CommentEntityTypeDefinition(_cmsKitTestData.EntityType1)); + List reactions = new() + { + new ReactionDefinition(StandardReactions.Smile), + new ReactionDefinition(StandardReactions.ThumbsUp), + new ReactionDefinition(StandardReactions.ThumbsDown), + new ReactionDefinition(StandardReactions.Confused), + new ReactionDefinition(StandardReactions.Eyes), + new ReactionDefinition(StandardReactions.Heart), + new ReactionDefinition(StandardReactions.HeartBroken), + new ReactionDefinition(StandardReactions.Wink), + new ReactionDefinition(StandardReactions.Pray), + new ReactionDefinition(StandardReactions.Rocket), + new ReactionDefinition(StandardReactions.Victory), + new ReactionDefinition(StandardReactions.Rock), + }; + + _reactionOptions.Value.EntityTypes.Add(new ReactionEntityTypeDefinition(_cmsKitTestData.EntityType1, reactions)); + _reactionOptions.Value.EntityTypes.Add(new ReactionEntityTypeDefinition(_cmsKitTestData.EntityType2, reactions)); + return Task.CompletedTask; } @@ -207,31 +228,31 @@ namespace Volo.CmsKit private async Task SeedReactionsAsync() { - await _reactionManager.CreateAsync( + await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, StandardReactions.Confused); - await _reactionManager.CreateAsync( + await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, StandardReactions.ThumbsUp); - await _reactionManager.CreateAsync( + await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId2, StandardReactions.Heart); - await _reactionManager.CreateAsync( + await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType2, _cmsKitTestData.EntityId1, StandardReactions.Rocket); - await _reactionManager.CreateAsync( + await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User2Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1,