mirror of https://github.com/abpframework/abp.git
committed by
GitHub
14 changed files with 284 additions and 32 deletions
@ -0,0 +1,11 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace Volo.CmsKit.Comments |
||||
|
{ |
||||
|
public class CmsKitCommentOptions |
||||
|
{ |
||||
|
[NotNull] |
||||
|
public List<CommentEntityTypeDefinition> EntityTypes { get; } = new List<CommentEntityTypeDefinition>(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using System; |
||||
|
using Volo.Abp; |
||||
|
|
||||
|
namespace Volo.CmsKit.Comments |
||||
|
{ |
||||
|
public class CommentEntityTypeDefinition : IEquatable<CommentEntityTypeDefinition> |
||||
|
{ |
||||
|
public CommentEntityTypeDefinition([NotNull] string entityType) |
||||
|
{ |
||||
|
EntityType = Check.NotNullOrEmpty(entityType, nameof(entityType)); |
||||
|
} |
||||
|
|
||||
|
public string EntityType { get; } |
||||
|
|
||||
|
public bool Equals(CommentEntityTypeDefinition other) |
||||
|
{ |
||||
|
return EntityType == other?.EntityType; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
|
||||
|
using JetBrains.Annotations; |
||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.Domain.Services; |
||||
|
using Volo.CmsKit.Users; |
||||
|
|
||||
|
namespace Volo.CmsKit.Comments |
||||
|
{ |
||||
|
public class CommentManager : DomainService |
||||
|
{ |
||||
|
protected ICommentEntityTypeDefinitionStore DefinitionStore { get; } |
||||
|
|
||||
|
public CommentManager(ICommentEntityTypeDefinitionStore definitionStore) |
||||
|
{ |
||||
|
DefinitionStore = definitionStore; |
||||
|
} |
||||
|
|
||||
|
public virtual async Task<Comment> CreateAsync([NotNull] CmsUser creator, |
||||
|
[NotNull] string entityType, |
||||
|
[NotNull] string entityId, |
||||
|
[NotNull] string text, |
||||
|
[CanBeNull] Guid? repliedCommentId = null) |
||||
|
{ |
||||
|
Check.NotNull(creator, nameof(creator)); |
||||
|
Check.NotNullOrWhiteSpace(entityType, nameof(entityType), CommentConsts.MaxEntityTypeLength); |
||||
|
Check.NotNullOrWhiteSpace(entityId, nameof(entityId), CommentConsts.MaxEntityIdLength); |
||||
|
Check.NotNullOrWhiteSpace(text, nameof(text), CommentConsts.MaxTextLength); |
||||
|
|
||||
|
if (!await DefinitionStore.IsDefinedAsync(entityType)) |
||||
|
{ |
||||
|
throw new EntityNotCommentableException(entityType); |
||||
|
} |
||||
|
|
||||
|
return new Comment( |
||||
|
GuidGenerator.Create(), |
||||
|
entityType, |
||||
|
entityId, |
||||
|
text, |
||||
|
repliedCommentId, |
||||
|
creator.Id, |
||||
|
CurrentTenant.Id); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,41 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace Volo.CmsKit.Comments |
||||
|
{ |
||||
|
public class DefaultCommentEntityTypeDefinitionStore : ICommentEntityTypeDefinitionStore, ITransientDependency |
||||
|
{ |
||||
|
protected CmsKitCommentOptions Options { get; } |
||||
|
|
||||
|
public DefaultCommentEntityTypeDefinitionStore(IOptions<CmsKitCommentOptions> options) |
||||
|
{ |
||||
|
Options = options.Value; |
||||
|
} |
||||
|
|
||||
|
public virtual Task<CommentEntityTypeDefinition> GetDefinitionAsync([NotNull] string entityType) |
||||
|
{ |
||||
|
Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); |
||||
|
|
||||
|
var result = Options.EntityTypes.SingleOrDefault(x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)) ?? |
||||
|
throw new EntityNotCommentableException(entityType); |
||||
|
|
||||
|
return Task.FromResult(result); |
||||
|
} |
||||
|
|
||||
|
public virtual Task<bool> IsDefinedAsync([NotNull] string entityType) |
||||
|
{ |
||||
|
Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); |
||||
|
|
||||
|
var isDefined = Options.EntityTypes.Any(x => x.EntityType == entityType); |
||||
|
|
||||
|
return Task.FromResult(isDefined); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.Serialization; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp; |
||||
|
|
||||
|
namespace Volo.CmsKit.Comments |
||||
|
{ |
||||
|
[Serializable] |
||||
|
public class EntityNotCommentableException : BusinessException |
||||
|
{ |
||||
|
public EntityNotCommentableException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public EntityNotCommentableException(string entityType) |
||||
|
{ |
||||
|
Code = CmsKitErrorCodes.Comments.EntityNotCommentable; |
||||
|
EntityType = entityType; |
||||
|
WithData(nameof(EntityType), EntityType); |
||||
|
} |
||||
|
|
||||
|
public string EntityType { get; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.CmsKit.Comments; |
||||
|
|
||||
|
namespace Volo.CmsKit.Comments |
||||
|
{ |
||||
|
public interface ICommentEntityTypeDefinitionStore |
||||
|
{ |
||||
|
Task<CommentEntityTypeDefinition> GetDefinitionAsync([NotNull] string entityType); |
||||
|
|
||||
|
Task<bool> IsDefinedAsync([NotNull] string entityType); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,59 @@ |
|||||
|
using Shouldly; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.CmsKit.Users; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.CmsKit.Comments |
||||
|
{ |
||||
|
public class CommentManager_Test : CmsKitDomainTestBase |
||||
|
{ |
||||
|
private readonly CommentManager commentManager; |
||||
|
private readonly CmsKitTestData testData; |
||||
|
private readonly ICmsUserRepository userRepository; |
||||
|
|
||||
|
public CommentManager_Test() |
||||
|
{ |
||||
|
commentManager = GetRequiredService<CommentManager>(); |
||||
|
testData = GetRequiredService<CmsKitTestData>(); |
||||
|
userRepository = GetRequiredService<ICmsUserRepository>(); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task CreateAsync_ShouldWorkProperly_WithCorrectData() |
||||
|
{ |
||||
|
var creator = await userRepository.GetAsync(testData.User1Id); |
||||
|
|
||||
|
var text = "Thank you for the article. It's awesome"; |
||||
|
|
||||
|
var comment = await commentManager.CreateAsync(creator, testData.EntityType1, testData.EntityId1, text); |
||||
|
|
||||
|
comment.Id.ShouldNotBe(Guid.Empty); |
||||
|
comment.CreatorId.ShouldBe(creator.Id); |
||||
|
comment.EntityType.ShouldBe(testData.EntityType1); |
||||
|
comment.EntityId.ShouldBe(testData.EntityId1); |
||||
|
comment.Text.ShouldBe(text); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task CreateAsync_ShouldThrowException_WithNotConfiguredEntityType() |
||||
|
{ |
||||
|
var creator = await userRepository.GetAsync(testData.User1Id); |
||||
|
var notConfiguredEntityType = "Some.New.Entity"; |
||||
|
var text = "Thank you for the article. It's awesome"; |
||||
|
|
||||
|
var exception = await Should.ThrowAsync<EntityNotCommentableException>(async () => |
||||
|
await commentManager.CreateAsync( |
||||
|
creator, |
||||
|
notConfiguredEntityType, |
||||
|
testData.EntityId1, |
||||
|
text)); |
||||
|
|
||||
|
exception.ShouldNotBeNull(); |
||||
|
exception.EntityType.ShouldBe(notConfiguredEntityType); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue