mirror of https://github.com/abpframework/abp.git
14 changed files with 277 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,42 @@ |
|||
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)); |
|||
|
|||
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,26 @@ |
|||
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 |
|||
{ |
|||
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