From e6ba0af734b0ba128956f424bbc6c9e1084d076c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 19 Jul 2020 23:28:56 +0300 Subject: [PATCH] Refactor the ReactionManager. --- .../DefaultReactionDefinitionStore.cs | 4 +- .../Reactions/IReactionDefinitionStore.cs | 7 +- .../Volo/CmsKit/Reactions/ReactionManager.cs | 81 +++++-------------- .../Reactions/ReactionPublicAppService.cs | 34 ++++---- 4 files changed, 39 insertions(+), 87 deletions(-) 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 cc0daa3b65..4c7d4e095c 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 @@ -15,12 +15,12 @@ namespace Volo.CmsKit.Reactions Options = options.Value; } - public virtual Task> GetAvailableReactionsAsync(string entityType) + public virtual Task> GetReactionsAsync(string entityType = null) { return Task.FromResult(Options.Reactions.Values.ToList()); } - public Task GetReactionOrNullAsync(string reactionName, string entityType) + public Task GetReactionOrNullAsync(string reactionName, string entityType = null) { return Task.FromResult(Options.Reactions.GetOrDefault(reactionName)); } 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 fa3cad8076..3c2dee7008 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 @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading.Tasks; using JetBrains.Annotations; @@ -7,8 +6,8 @@ namespace Volo.CmsKit.Reactions { public interface IReactionDefinitionStore { - Task> GetAvailableReactionsAsync([CanBeNull] string entityType); + Task> GetReactionsAsync([CanBeNull] string entityType = null); - Task GetReactionOrNullAsync([NotNull] string reactionName, [CanBeNull] string entityType); + Task GetReactionOrNullAsync([NotNull] string reactionName, [CanBeNull] string entityType = null); } } 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 01c83071cc..f3e7b70216 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 @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using JetBrains.Annotations; using Volo.Abp; @@ -19,80 +20,34 @@ namespace Volo.CmsKit.Reactions ReactionDefinitionStore = reactionDefinitionStore; } - public virtual async Task> GetAvailableReactionsAsync( + public virtual async Task> GetReactionsAsync( [CanBeNull] string entityType = null) { - return await ReactionDefinitionStore.GetAvailableReactionsAsync(entityType); + return await ReactionDefinitionStore.GetReactionsAsync(entityType); } public virtual async Task> GetSummariesAsync( [NotNull] string entityType, [NotNull] string entityId) { - var queryResultItems = await UserReactionRepository.GetSummariesAsync(entityType, entityId); - - var summaryDtos = new List(); - - foreach (var queryResultItem in queryResultItems) - { - var summary = new ReactionSummary - { - Count = queryResultItem.Count - }; - - //TODO: Get all definitions then filter here? - var reactionDefinition = await ReactionDefinitionStore - .GetReactionOrNullAsync( - queryResultItem.ReactionName, - entityType - ); - - if (reactionDefinition == null) - { - continue; - } - - summary.Reaction = reactionDefinition; + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); - summaryDtos.Add(summary); - } + var userReactionCounts = (await UserReactionRepository.GetSummariesAsync(entityType, entityId)) + .ToDictionary(x => x.ReactionName, x => x.Count); - return summaryDtos; - } - - public virtual async Task> GetUserReactionsAsync( - Guid userId, - [NotNull] string entityType, - [NotNull] string entityId) - { - var userReactions = await UserReactionRepository - .GetListForUserAsync( - userId, - entityType, - entityId + var reactions = await ReactionDefinitionStore + .GetReactionsAsync( + entityType ); - var reactionDtos = new List(); - - foreach (var userReaction in userReactions) - { - //TODO: Get all definitions then filter here? - var reactionDefinition = await ReactionDefinitionStore - .GetReactionOrNullAsync( - userReaction.ReactionName, - userReaction.EntityType - ); - - if (reactionDefinition == null) + return reactions + .Select(reaction => new ReactionSummary { - await UserReactionRepository.DeleteAsync(userReaction); - continue; - } - - reactionDtos.Add(reactionDefinition); - } - - return reactionDtos; + Reaction = reaction, + Count = userReactionCounts.GetOrDefault(reaction.Name) + }) + .ToList(); } public virtual async Task CreateAsync( @@ -129,6 +84,10 @@ namespace Volo.CmsKit.Reactions [NotNull] string entityId, [NotNull] string reactionName) { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + Check.NotNullOrWhiteSpace(reactionName, nameof(reactionName)); + var existingReaction = await UserReactionRepository.FindAsync(userId, entityType, entityId, reactionName); if (existingReaction == null) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Reactions/ReactionPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Reactions/ReactionPublicAppService.cs index ab92d6b767..f1b2aff260 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Reactions/ReactionPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Reactions/ReactionPublicAppService.cs @@ -27,36 +27,30 @@ namespace Volo.CmsKit.Reactions public virtual async Task> GetForSelectionAsync(string entityType, string entityId) { - var reactionDefinitions = await ReactionManager - .GetAvailableReactionsAsync( - entityType - ); - - var summaries = - (await ReactionManager.GetSummariesAsync(entityType, entityId)) - .ToDictionary(x => x.Reaction.Name, x => x.Count); + var summaries = await ReactionManager.GetSummariesAsync(entityType, entityId); - var userReactions = await ReactionManager.GetUserReactionsAsync( - CurrentUser.GetId(), - entityType, - entityId - ); + var userReactions = (await UserReactionRepository + .GetListForUserAsync( + CurrentUser.GetId(), + entityType, + entityId + )).ToDictionary(x => x.ReactionName, x => x); - var reactionDtos = new List(); + var reactionWithSelectionDtos = new List(); - foreach (var reactionDefinition in reactionDefinitions) + foreach (var summary in summaries) { - reactionDtos.Add( + reactionWithSelectionDtos.Add( new ReactionWithSelectionDto { - Reaction = ConvertToReactionDto(reactionDefinition), - Count = summaries.GetOrDefault(reactionDefinition.Name), - IsSelectedByCurrentUser = userReactions.Any(x => x.Name == reactionDefinition.Name) + Reaction = ConvertToReactionDto(summary.Reaction), + Count = summary.Count, + IsSelectedByCurrentUser = userReactions.ContainsKey(summary.Reaction.Name) } ); } - return new ListResultDto(reactionDtos); + return new ListResultDto(reactionWithSelectionDtos); } public virtual async Task CreateAsync(CreateReactionDto input)