From c843f82f488141b2564b3cd35b09223ea8197ca4 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Mon, 20 May 2019 18:06:48 +0200 Subject: [PATCH] Validation for UI fields. --- .../Schemas/FieldExtensions.cs | 7 +- .../Guards/FieldPropertiesValidator.cs | 13 ++- .../Schemas/Guards/GuardSchema.cs | 15 ++++ .../Schemas/Guards/GuardSchemaField.cs | 10 +++ .../schemas/pages/schema/field.component.html | 4 +- src/Squidex/app/theme/_bootstrap.scss | 14 ++++ .../Schemas/Guards/GuardSchemaFieldTests.cs | 81 +++++++++++++++++-- .../Schemas/Guards/GuardSchemaTests.cs | 39 ++++++++- 8 files changed, 173 insertions(+), 10 deletions(-) diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldExtensions.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldExtensions.cs index 1d817dc1e..88a11c699 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldExtensions.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldExtensions.cs @@ -31,7 +31,12 @@ namespace Squidex.Domain.Apps.Core.Schemas public static bool IsForApi(this T field, bool withHidden = false) where T : IField { - return (withHidden || !field.IsHidden) && !(field is IField); + return (withHidden || !field.IsHidden) && field.RawProperties.IsForApi(); + } + + public static bool IsForApi(this T properties) where T : FieldProperties + { + return !(properties is UIFieldProperties); } public static Schema ReorderFields(this Schema schema, List ids, long? parentId = null) diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/Guards/FieldPropertiesValidator.cs b/src/Squidex.Domain.Apps.Entities/Schemas/Guards/FieldPropertiesValidator.cs index 857730c7a..7eb970464 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/Guards/FieldPropertiesValidator.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/Guards/FieldPropertiesValidator.cs @@ -21,7 +21,18 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards public static IEnumerable Validate(FieldProperties properties) { - return properties?.Accept(Instance); + if (properties != null) + { + if (!properties.IsForApi() && properties.IsListField) + { + yield return new ValidationError("UI field cannot be a list field.", nameof(properties.IsListField)); + } + + foreach (var error in properties.Accept(Instance)) + { + yield return error; + } + } } public IEnumerable Visit(ArrayFieldProperties properties) diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs b/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs index 65b22cbe9..ab4851731 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs @@ -13,6 +13,8 @@ using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Entities.Schemas.Commands; using Squidex.Infrastructure; +#pragma warning disable IDE0060 // Remove unused parameter + namespace Squidex.Domain.Apps.Entities.Schemas.Guards { public static class GuardSchema @@ -199,6 +201,19 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards } else { + if (!field.Properties.IsForApi()) + { + if (field.IsHidden) + { + e("UI field cannot be hidden.", $"{prefix}.{nameof(field.IsHidden)}"); + } + + if (field.IsDisabled) + { + e("UI field cannot be disabled.", $"{prefix}.{nameof(field.IsDisabled)}"); + } + } + var errors = FieldPropertiesValidator.Validate(field.Properties); errors.Foreach(x => x.WithPrefix($"{prefix}.{nameof(field.Properties)}").AddTo(e)); diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchemaField.cs b/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchemaField.cs index 83853330d..ed93453bc 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchemaField.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchemaField.cs @@ -101,6 +101,11 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards { throw new DomainException("Schema field is already hidden."); } + + if (!field.IsForApi()) + { + throw new DomainException("UI field cannot be hidden."); + } } public static void CanDisable(Schema schema, DisableField command) @@ -113,6 +118,11 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards { throw new DomainException("Schema field is already disabled."); } + + if (!field.IsForApi()) + { + throw new DomainException("UI field cannot be disabled."); + } } public static void CanDelete(Schema schema, DeleteField command) diff --git a/src/Squidex/app/features/schemas/pages/schema/field.component.html b/src/Squidex/app/features/schemas/pages/schema/field.component.html index 27ce3bc1c..772319a9a 100644 --- a/src/Squidex/app/features/schemas/pages/schema/field.component.html +++ b/src/Squidex/app/features/schemas/pages/schema/field.component.html @@ -25,7 +25,7 @@