mirror of https://github.com/Squidex/squidex.git
committed by
GitHub
3 changed files with 138 additions and 0 deletions
@ -0,0 +1,32 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using Squidex.Domain.Apps.Core.HandleRules; |
||||
|
using Squidex.Domain.Apps.Core.Rules; |
||||
|
|
||||
|
namespace Squidex.Extensions.Actions.Comment |
||||
|
{ |
||||
|
[RuleAction( |
||||
|
Title = "Comment", |
||||
|
IconImage = "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M20.016 15.984v-12h-16.031v14.016l2.016-2.016h14.016zM20.016 2.016c1.078 0 1.969 0.891 1.969 1.969v12c0 1.078-0.891 2.016-1.969 2.016h-14.016l-3.984 3.984v-18c0-1.078 0.891-1.969 1.969-1.969h16.031z'></path></svg>", |
||||
|
IconColor = "#3389ff", |
||||
|
Display = "Create comment", |
||||
|
Description = "Create a comment for a content event.")] |
||||
|
public sealed class CommentAction : RuleAction |
||||
|
{ |
||||
|
[Required] |
||||
|
[Display(Name = "Text", Description = "The comment text.")] |
||||
|
[DataType(DataType.MultilineText)] |
||||
|
[Formattable] |
||||
|
public string Text { get; set; } |
||||
|
|
||||
|
[Display(Name = "Client", Description = "An optional client name.")] |
||||
|
[DataType(DataType.Text)] |
||||
|
public string Client { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,85 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using System; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Squidex.Domain.Apps.Core.HandleRules; |
||||
|
using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; |
||||
|
using Squidex.Domain.Apps.Entities.Comments.Commands; |
||||
|
using Squidex.Infrastructure; |
||||
|
using Squidex.Infrastructure.Commands; |
||||
|
using Squidex.Infrastructure.Reflection; |
||||
|
|
||||
|
namespace Squidex.Extensions.Actions.Comment |
||||
|
{ |
||||
|
public sealed class CommentActionHandler : RuleActionHandler<CommentAction, CommentJob> |
||||
|
{ |
||||
|
private const string Description = "Send a Comment"; |
||||
|
private readonly ICommandBus commandBus; |
||||
|
|
||||
|
public CommentActionHandler(RuleEventFormatter formatter, ICommandBus commandBus) |
||||
|
: base(formatter) |
||||
|
{ |
||||
|
Guard.NotNull(commandBus); |
||||
|
|
||||
|
this.commandBus = commandBus; |
||||
|
} |
||||
|
|
||||
|
protected override (string Description, CommentJob Data) CreateJob(EnrichedEvent @event, CommentAction action) |
||||
|
{ |
||||
|
if (@event is EnrichedContentEvent contentEvent) |
||||
|
{ |
||||
|
var text = Format(action.Text, @event); |
||||
|
|
||||
|
var actor = contentEvent.Actor; |
||||
|
|
||||
|
if (!string.IsNullOrEmpty(action.Client)) |
||||
|
{ |
||||
|
actor = new RefToken(RefTokenType.Client, action.Client); |
||||
|
} |
||||
|
|
||||
|
var ruleJob = new CommentJob |
||||
|
{ |
||||
|
AppId = contentEvent.AppId, |
||||
|
Actor = actor, |
||||
|
CommentsId = contentEvent.Id, |
||||
|
Text = text |
||||
|
}; |
||||
|
|
||||
|
return (Description, ruleJob); |
||||
|
} |
||||
|
|
||||
|
return ("Ignore", new CommentJob()); |
||||
|
} |
||||
|
|
||||
|
protected override async Task<Result> ExecuteJobAsync(CommentJob job, CancellationToken ct = default) |
||||
|
{ |
||||
|
if (job.CommentsId == Guid.Empty) |
||||
|
{ |
||||
|
return Result.Ignored(); |
||||
|
} |
||||
|
|
||||
|
var command = SimpleMapper.Map(job, new CreateComment()); |
||||
|
|
||||
|
await commandBus.PublishAsync(command); |
||||
|
|
||||
|
return Result.Success($"Commented: {job.Text}"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public sealed class CommentJob |
||||
|
{ |
||||
|
public NamedId<Guid> AppId { get; set; } |
||||
|
|
||||
|
public RefToken Actor { get; set; } |
||||
|
|
||||
|
public Guid CommentsId { get; set; } |
||||
|
|
||||
|
public string Text { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using Microsoft.Extensions.Configuration; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Squidex.Infrastructure.Plugins; |
||||
|
|
||||
|
namespace Squidex.Extensions.Actions.Comment |
||||
|
{ |
||||
|
public sealed class CommentPlugin : IPlugin |
||||
|
{ |
||||
|
public void ConfigureServices(IServiceCollection services, IConfiguration config) |
||||
|
{ |
||||
|
services.AddRuleAction<CommentAction, CommentActionHandler>(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue