diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs b/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs index 3fae399d5..564e7a5d9 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs @@ -600,6 +600,15 @@ namespace Squidex.Domain.Apps.Core { } } + /// + /// Looks up a localized string similar to Validates the content item.. + /// + public static string ContentValidate { + get { + return ResourceManager.GetString("ContentValidate", resourceCulture); + } + } + /// /// Looks up a localized string similar to The context object holding all values.. /// diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx b/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx index 9698e8835..d5fcff1bf 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx +++ b/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx @@ -297,6 +297,9 @@ The URL to the content. + + Validates the content item. + The context object holding all values. diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs index 4fcea8597..a616affd5 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs @@ -13,6 +13,12 @@ namespace Squidex.Domain.Apps.Core.Scripting { public sealed class ContentScriptVars : DataScriptVars { + [FieldDescription(nameof(FieldDescriptions.ContentValidate))] + public Action Validate + { + set => SetValue(value); + } + [FieldDescription(nameof(FieldDescriptions.AppId))] public DomainId AppId { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptingCompleter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptingCompleter.cs index 914016a73..f58b79a65 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptingCompleter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptingCompleter.cs @@ -235,6 +235,10 @@ namespace Squidex.Domain.Apps.Core.Scripting { AddBoolean(name, description); } + else if (typeof(MulticastDelegate).IsAssignableFrom(propertyType.BaseType)) + { + AddFunction(name, description); + } else if (propertyType == typeof(AssetMetadata)) { AddObject(name, description, () => @@ -386,14 +390,19 @@ namespace Squidex.Domain.Apps.Core.Scripting Add(JsonType.Boolean, name, description); } - private void AddObject(string? name, string? description) + private void AddNumber(string? name, string? description) { - Add(JsonType.Object, name, description); + Add(JsonType.Number, name, description); } - private void AddNumber(string? name, string? description) + private void AddFunction(string? name, string? description) { - Add(JsonType.Number, name, description); + Add(JsonType.Function, name, description); + } + + private void AddObject(string? name, string? description) + { + Add(JsonType.Object, name, description); } private void AddString(string? name, string? description) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/Guards/ScriptingExtensions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/Guards/ScriptingExtensions.cs index ed689be45..2c3a02930 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/Guards/ScriptingExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/Guards/ScriptingExtensions.cs @@ -61,7 +61,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards OldStatus = operation.Snapshot.Status, Operation = "Update", Status = operation.Snapshot.EditingStatus(), - StatusOld = default + StatusOld = default, }); return TransformAsync(operation, script, vars); @@ -85,7 +85,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards OldStatus = operation.Snapshot.EditingStatus(), Operation = change.ToString(), Status = status, - StatusOld = operation.Snapshot.EditingStatus() + StatusOld = operation.Snapshot.EditingStatus(), + Validate = Validate(operation, status) }); return TransformAsync(operation, script, vars); @@ -126,6 +127,23 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards await operation.Resolve().ExecuteAsync(vars, script, Options); } + private static Action Validate(ContentOperation operation, Status status) + { + return () => + { + try + { + var snapshot = operation.Snapshot; + + operation.ValidateContentAndInputAsync(snapshot.Data, false, snapshot.IsPublished() || status == Status.Published).Wait(); + } + catch (AggregateException ex) when (ex.InnerException != null) + { + throw ex.Flatten().InnerException!; + } + }; + } + private static ContentScriptVars Enrich(ContentOperation operation, ContentScriptVars vars) { vars.AppId = operation.App.Id;