diff --git a/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs new file mode 100644 index 000000000..68c03d9fc --- /dev/null +++ b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs @@ -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 = "", + 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; } + } +} diff --git a/backend/extensions/Squidex.Extensions/Actions/Comment/CommentActionHandler.cs b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentActionHandler.cs new file mode 100644 index 000000000..844aca37b --- /dev/null +++ b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentActionHandler.cs @@ -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 + { + 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 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 AppId { get; set; } + + public RefToken Actor { get; set; } + + public Guid CommentsId { get; set; } + + public string Text { get; set; } + } +} diff --git a/backend/extensions/Squidex.Extensions/Actions/Comment/CommentPlugin.cs b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentPlugin.cs new file mode 100644 index 000000000..013cbc42d --- /dev/null +++ b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentPlugin.cs @@ -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(); + } + } +}