mirror of https://github.com/Squidex/squidex.git
committed by
GitHub
15 changed files with 254 additions and 48 deletions
@ -0,0 +1,42 @@ |
|||||
|
// ==========================================================================
|
||||
|
// 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; |
||||
|
using Squidex.Infrastructure.Validation; |
||||
|
|
||||
|
namespace Squidex.Extensions.Actions.CreateContent |
||||
|
{ |
||||
|
[RuleAction( |
||||
|
Title = "CreateContent", |
||||
|
IconImage = "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 28 28'><path d='M21.875 28H6.125A6.087 6.087 0 010 21.875V6.125A6.087 6.087 0 016.125 0h15.75A6.087 6.087 0 0128 6.125v15.75A6.088 6.088 0 0121.875 28zM6.125 1.75A4.333 4.333 0 001.75 6.125v15.75a4.333 4.333 0 004.375 4.375h15.75a4.333 4.333 0 004.375-4.375V6.125a4.333 4.333 0 00-4.375-4.375H6.125z'/><path d='M13.125 12.25H7.35c-1.575 0-2.888-1.313-2.888-2.888V7.349c0-1.575 1.313-2.888 2.888-2.888h5.775c1.575 0 2.887 1.313 2.887 2.888v2.013c0 1.575-1.312 2.888-2.887 2.888zM7.35 6.212c-.613 0-1.138.525-1.138 1.138v2.012A1.16 1.16 0 007.35 10.5h5.775a1.16 1.16 0 001.138-1.138V7.349a1.16 1.16 0 00-1.138-1.138H7.35zM22.662 16.713H5.337c-.525 0-.875-.35-.875-.875s.35-.875.875-.875h17.237c.525 0 .875.35.875.875s-.35.875-.787.875zM15.138 21.262h-9.8c-.525 0-.875-.35-.875-.875s.35-.875.875-.875h9.713c.525 0 .875.35.875.875s-.35.875-.787.875z'/></svg>", |
||||
|
IconColor = "#3389ff", |
||||
|
Display = "Create content", |
||||
|
Description = "Create a a new content item for any schema.")] |
||||
|
public sealed class CreateContentAction : RuleAction |
||||
|
{ |
||||
|
[LocalizedRequired] |
||||
|
[Display(Name = "Data", Description = "The content data.")] |
||||
|
[DataType(DataType.MultilineText)] |
||||
|
[Formattable] |
||||
|
public string Data { get; set; } |
||||
|
|
||||
|
[LocalizedRequired] |
||||
|
[Display(Name = "Schema", Description = "The name of the schema.")] |
||||
|
[DataType(DataType.Text)] |
||||
|
public string Schema { get; set; } |
||||
|
|
||||
|
[Display(Name = "Client", Description = "An optional client name.")] |
||||
|
[DataType(DataType.Text)] |
||||
|
public string Client { get; set; } |
||||
|
|
||||
|
[Display(Name = "Publish", Description = "Publish the content.")] |
||||
|
[DataType(DataType.Text)] |
||||
|
public bool Publish { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,87 @@ |
|||||
|
// ==========================================================================
|
||||
|
// 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.Contents; |
||||
|
using Squidex.Domain.Apps.Core.HandleRules; |
||||
|
using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; |
||||
|
using Squidex.Domain.Apps.Entities; |
||||
|
using Squidex.Domain.Apps.Entities.Schemas; |
||||
|
using Squidex.Infrastructure; |
||||
|
using Squidex.Infrastructure.Commands; |
||||
|
using Squidex.Infrastructure.Json; |
||||
|
using Command = Squidex.Domain.Apps.Entities.Contents.Commands.CreateContent; |
||||
|
|
||||
|
namespace Squidex.Extensions.Actions.CreateContent |
||||
|
{ |
||||
|
public sealed class CreateContentActionHandler : RuleActionHandler<CreateContentAction, Command> |
||||
|
{ |
||||
|
private const string Description = "Create a content"; |
||||
|
private readonly ICommandBus commandBus; |
||||
|
private readonly IAppProvider appProvider; |
||||
|
private readonly IJsonSerializer jsonSerializer; |
||||
|
|
||||
|
public CreateContentActionHandler(RuleEventFormatter formatter, IAppProvider appProvider, ICommandBus commandBus, IJsonSerializer jsonSerializer) |
||||
|
: base(formatter) |
||||
|
{ |
||||
|
Guard.NotNull(appProvider, nameof(appProvider)); |
||||
|
Guard.NotNull(commandBus, nameof(commandBus)); |
||||
|
Guard.NotNull(jsonSerializer, nameof(jsonSerializer)); |
||||
|
|
||||
|
this.appProvider = appProvider; |
||||
|
this.commandBus = commandBus; |
||||
|
this.jsonSerializer = jsonSerializer; |
||||
|
} |
||||
|
|
||||
|
protected override async Task<(string Description, Command Data)> CreateJobAsync(EnrichedEvent @event, CreateContentAction action) |
||||
|
{ |
||||
|
var ruleJob = new Command |
||||
|
{ |
||||
|
AppId = @event.AppId, |
||||
|
}; |
||||
|
|
||||
|
var schema = await appProvider.GetSchemaAsync(@event.AppId.Id, action.Schema, true); |
||||
|
|
||||
|
if (schema == null) |
||||
|
{ |
||||
|
throw new InvalidOperationException($"Cannot find schema '{action.Schema}'"); |
||||
|
} |
||||
|
|
||||
|
ruleJob.SchemaId = schema.NamedId(); |
||||
|
|
||||
|
var json = await FormatAsync(action.Data, @event); |
||||
|
|
||||
|
ruleJob.Data = jsonSerializer.Deserialize<NamedContentData>(json); |
||||
|
|
||||
|
if (!string.IsNullOrEmpty(action.Client)) |
||||
|
{ |
||||
|
ruleJob.Actor = new RefToken(RefTokenType.Client, action.Client); |
||||
|
} |
||||
|
else if (@event is EnrichedUserEventBase userEvent) |
||||
|
{ |
||||
|
ruleJob.Actor = userEvent.Actor; |
||||
|
} |
||||
|
|
||||
|
ruleJob.Publish = action.Publish; |
||||
|
|
||||
|
return (Description, ruleJob); |
||||
|
} |
||||
|
|
||||
|
protected override async Task<Result> ExecuteJobAsync(Command job, CancellationToken ct = default) |
||||
|
{ |
||||
|
var command = job; |
||||
|
|
||||
|
command.FromRule = true; |
||||
|
|
||||
|
await commandBus.PublishAsync(command); |
||||
|
|
||||
|
return Result.Success($"Created to: {job.SchemaId.Name}"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -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.CreateContent |
||||
|
{ |
||||
|
public sealed class CreateContentPlugin : IPlugin |
||||
|
{ |
||||
|
public void ConfigureServices(IServiceCollection services, IConfiguration config) |
||||
|
{ |
||||
|
services.AddRuleAction<CreateContentAction, CreateContentActionHandler>(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue