Browse Source

Allow to validate in scripts.

pull/878/head
Sebastian 4 years ago
parent
commit
939922158c
  1. 9
      backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs
  2. 3
      backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx
  3. 6
      backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs
  4. 17
      backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptingCompleter.cs
  5. 22
      backend/src/Squidex.Domain.Apps.Entities/Contents/DomainObject/Guards/ScriptingExtensions.cs

9
backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs

@ -600,6 +600,15 @@ namespace Squidex.Domain.Apps.Core {
} }
} }
/// <summary>
/// Looks up a localized string similar to Validates the content item..
/// </summary>
public static string ContentValidate {
get {
return ResourceManager.GetString("ContentValidate", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to The context object holding all values.. /// Looks up a localized string similar to The context object holding all values..
/// </summary> /// </summary>

3
backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx

@ -297,6 +297,9 @@
<data name="ContentUrl" xml:space="preserve"> <data name="ContentUrl" xml:space="preserve">
<value>The URL to the content.</value> <value>The URL to the content.</value>
</data> </data>
<data name="ContentValidate" xml:space="preserve">
<value>Validates the content item.</value>
</data>
<data name="Context" xml:space="preserve"> <data name="Context" xml:space="preserve">
<value>The context object holding all values.</value> <value>The context object holding all values.</value>
</data> </data>

6
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 public sealed class ContentScriptVars : DataScriptVars
{ {
[FieldDescription(nameof(FieldDescriptions.ContentValidate))]
public Action Validate
{
set => SetValue(value);
}
[FieldDescription(nameof(FieldDescriptions.AppId))] [FieldDescription(nameof(FieldDescriptions.AppId))]
public DomainId AppId public DomainId AppId
{ {

17
backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptingCompleter.cs

@ -235,6 +235,10 @@ namespace Squidex.Domain.Apps.Core.Scripting
{ {
AddBoolean(name, description); AddBoolean(name, description);
} }
else if (typeof(MulticastDelegate).IsAssignableFrom(propertyType.BaseType))
{
AddFunction(name, description);
}
else if (propertyType == typeof(AssetMetadata)) else if (propertyType == typeof(AssetMetadata))
{ {
AddObject(name, description, () => AddObject(name, description, () =>
@ -386,14 +390,19 @@ namespace Squidex.Domain.Apps.Core.Scripting
Add(JsonType.Boolean, name, description); 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) private void AddString(string? name, string? description)

22
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, OldStatus = operation.Snapshot.Status,
Operation = "Update", Operation = "Update",
Status = operation.Snapshot.EditingStatus(), Status = operation.Snapshot.EditingStatus(),
StatusOld = default StatusOld = default,
}); });
return TransformAsync(operation, script, vars); return TransformAsync(operation, script, vars);
@ -85,7 +85,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards
OldStatus = operation.Snapshot.EditingStatus(), OldStatus = operation.Snapshot.EditingStatus(),
Operation = change.ToString(), Operation = change.ToString(),
Status = status, Status = status,
StatusOld = operation.Snapshot.EditingStatus() StatusOld = operation.Snapshot.EditingStatus(),
Validate = Validate(operation, status)
}); });
return TransformAsync(operation, script, vars); return TransformAsync(operation, script, vars);
@ -126,6 +127,23 @@ namespace Squidex.Domain.Apps.Entities.Contents.DomainObject.Guards
await operation.Resolve<IScriptEngine>().ExecuteAsync(vars, script, Options); await operation.Resolve<IScriptEngine>().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) private static ContentScriptVars Enrich(ContentOperation operation, ContentScriptVars vars)
{ {
vars.AppId = operation.App.Id; vars.AppId = operation.App.Id;

Loading…
Cancel
Save