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;