diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/ContentSchemaBuilder.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/ContentSchemaBuilder.cs index 3ef318630..3af3c441c 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/ContentSchemaBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/ContentSchemaBuilder.cs @@ -24,15 +24,15 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema { Properties = { - ["id"] = Builder.GuidProperty($"The id of the {schemaName} content.", true), - ["data"] = Builder.ObjectProperty(dataSchema, $"The data of the {schemaName}.", true), - ["dataDraft"] = Builder.ObjectProperty(dataSchema, $"The draft data of the {schemaName}."), - ["version"] = Builder.NumberProperty($"The version of the {schemaName}.", true), - ["created"] = Builder.DateTimeProperty($"The date and time when the {schemaName} content has been created.", true), - ["createdBy"] = Builder.StringProperty($"The user that has created the {schemaName} content.", true), - ["lastModified"] = Builder.DateTimeProperty($"The date and time when the {schemaName} content has been modified last.", true), - ["lastModifiedBy"] = Builder.StringProperty($"The user that has updated the {schemaName} content last.", true), - ["status"] = Builder.StringProperty($"The status of the content.", true) + ["id"] = SchemaBuilder.GuidProperty($"The id of the {schemaName} content.", true), + ["data"] = SchemaBuilder.ObjectProperty(dataSchema, $"The data of the {schemaName}.", true), + ["dataDraft"] = SchemaBuilder.ObjectProperty(dataSchema, $"The draft data of the {schemaName}."), + ["version"] = SchemaBuilder.NumberProperty($"The version of the {schemaName}.", true), + ["created"] = SchemaBuilder.DateTimeProperty($"The date and time when the {schemaName} content has been created.", true), + ["createdBy"] = SchemaBuilder.StringProperty($"The user that has created the {schemaName} content.", true), + ["lastModified"] = SchemaBuilder.DateTimeProperty($"The date and time when the {schemaName} content has been modified last.", true), + ["lastModifiedBy"] = SchemaBuilder.StringProperty($"The user that has updated the {schemaName} content last.", true), + ["status"] = SchemaBuilder.StringProperty($"The status of the content.", true) }, Type = JsonObjectType.Object }; diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs index 3818fc018..1dc5f49a1 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs @@ -21,11 +21,11 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema var schemaName = schema.Name.ToPascalCase(); var jsonTypeVisitor = new JsonTypeVisitor(schemaResolver, withHidden); - var jsonSchema = Builder.Object(); + var jsonSchema = SchemaBuilder.Object(); foreach (var field in schema.Fields.ForApi(withHidden)) { - var partitionObject = Builder.Object(); + var partitionObject = SchemaBuilder.Object(); var partitioning = partitionResolver(field.Partitioning); foreach (var partitionKey in partitioning.AllKeys) @@ -39,7 +39,7 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema var name = partitioning.GetName(partitionKey); partitionItemProperty.Description = name; - partitionItemProperty.IsRequired = field.RawProperties.IsRequired && !isOptional; + partitionItemProperty.SetRequired(field.RawProperties.IsRequired && !isOptional); partitionObject.Properties.Add(partitionKey, partitionItemProperty); } @@ -58,7 +58,7 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema public static JsonSchemaProperty CreateProperty(IField field, JsonSchema reference) { - var jsonProperty = Builder.ObjectProperty(reference); + var jsonProperty = SchemaBuilder.ObjectProperty(reference); if (!string.IsNullOrWhiteSpace(field.RawProperties.Hints)) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs index e56831091..f680d1cea 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs @@ -27,74 +27,76 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema public JsonSchemaProperty? Visit(IArrayField field) { - var item = Builder.Object(); + var itemSchema = SchemaBuilder.Object(); foreach (var nestedField in field.Fields.ForApi(withHiddenFields)) { - var childProperty = nestedField.Accept(this); + var nestedProperty = nestedField.Accept(this); - if (childProperty != null) + if (nestedProperty != null) { - childProperty.Description = nestedField.RawProperties.Hints; - childProperty.IsRequired = nestedField.RawProperties.IsRequired; + nestedProperty.Description = nestedField.RawProperties.Hints; + nestedProperty.SetRequired(nestedField.RawProperties.IsRequired); - item.Properties.Add(nestedField.Name, childProperty); + itemSchema.Properties.Add(nestedField.Name, nestedProperty); } } - return Builder.ArrayProperty(item); + return SchemaBuilder.ArrayProperty(itemSchema); } public JsonSchemaProperty? Visit(IField field) { - var item = schemaResolver("AssetItem", Builder.Guid()); + var itemSchema = schemaResolver("AssetItem", SchemaBuilder.Guid()); - return Builder.ArrayProperty(item); + return SchemaBuilder.ArrayProperty(itemSchema); } public JsonSchemaProperty? Visit(IField field) { - return Builder.BooleanProperty(); + return SchemaBuilder.BooleanProperty(); } public JsonSchemaProperty? Visit(IField field) { - return Builder.DateTimeProperty(); + return SchemaBuilder.DateTimeProperty(); } public JsonSchemaProperty? Visit(IField field) { - var geolocationSchema = Builder.Object(); + var geolocationSchema = SchemaBuilder.Object(); geolocationSchema.Properties.Add("latitude", new JsonSchemaProperty { Type = JsonObjectType.Number, - Minimum = -90, + IsNullableRaw = false, + IsRequired = true, Maximum = 90, - IsRequired = true + Minimum = -90 }); geolocationSchema.Properties.Add("longitude", new JsonSchemaProperty { Type = JsonObjectType.Number, - Minimum = -180, + IsNullableRaw = false, + IsRequired = true, Maximum = 180, - IsRequired = true + Minimum = -180 }); var reference = schemaResolver("GeolocationDto", geolocationSchema); - return Builder.ObjectProperty(reference); + return SchemaBuilder.ObjectProperty(reference); } public JsonSchemaProperty? Visit(IField field) { - return Builder.JsonProperty(); + return SchemaBuilder.JsonProperty(); } public JsonSchemaProperty? Visit(IField field) { - var property = Builder.NumberProperty(); + var property = SchemaBuilder.NumberProperty(); if (field.Properties.MinValue.HasValue) { @@ -111,17 +113,18 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema public JsonSchemaProperty? Visit(IField field) { - var item = schemaResolver("ReferenceItem", Builder.Guid()); + var itemSchema = schemaResolver("ReferenceItem", SchemaBuilder.Guid()); - return Builder.ArrayProperty(item); + return SchemaBuilder.ArrayProperty(itemSchema); } public JsonSchemaProperty? Visit(IField field) { - var property = Builder.StringProperty(); + var property = SchemaBuilder.StringProperty(); - property.MinLength = field.Properties.MinLength; property.MaxLength = field.Properties.MaxLength; + property.MinLength = field.Properties.MinLength; + property.Pattern = field.Properties.Pattern; if (field.Properties.AllowedValues != null) { @@ -138,9 +141,9 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema public JsonSchemaProperty? Visit(IField field) { - var item = schemaResolver("ReferenceItem", Builder.String()); + var itemSchema = schemaResolver("ReferenceItem", SchemaBuilder.String()); - return Builder.ArrayProperty(item); + return SchemaBuilder.ArrayProperty(itemSchema); } public JsonSchemaProperty? Visit(IField field) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/Builder.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/SchemaBuilder.cs similarity index 88% rename from backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/Builder.cs rename to backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/SchemaBuilder.cs index ec08af5ec..b84cafd7d 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/Builder.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/SchemaBuilder.cs @@ -9,7 +9,7 @@ using NJsonSchema; namespace Squidex.Domain.Apps.Core.GenerateJsonSchema { - public static class Builder + public static class SchemaBuilder { public static JsonSchema Object() { @@ -69,9 +69,21 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema private static JsonSchemaProperty Enrich(JsonSchemaProperty property, string? description = null, bool isRequired = false) { property.Description = description; - property.IsRequired = isRequired; + property.SetRequired(isRequired); return property; } + + public static void SetRequired(this JsonSchemaProperty property, bool isRequired) + { + if (isRequired) + { + property.IsRequired = true; + } + else + { + property.IsNullableRaw = true; + } + } } } diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Generator/SchemaOpenApiGenerator.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Generator/SchemaOpenApiGenerator.cs index 2e472237f..fa22e3fe8 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Generator/SchemaOpenApiGenerator.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Generator/SchemaOpenApiGenerator.cs @@ -244,14 +244,8 @@ namespace Squidex.Areas.Api.Controllers.Contents.Generator { Properties = { - ["total"] = new JsonSchemaProperty - { - Type = JsonObjectType.Number, IsRequired = true, Description = $"The total number of {schemaName} contents." - }, - ["items"] = new JsonSchemaProperty - { - Type = JsonObjectType.Array, IsRequired = true, Description = $"The {schemaName} contents.", Item = contentSchema - } + ["total"] = SchemaBuilder.NumberProperty($"The total number of {schemaName} contents.", true), + ["items"] = SchemaBuilder.ArrayProperty(contentSchema, $"The {schemaName} contents.", true) }, Type = JsonObjectType.Object }; diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleActionProcessor.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleActionProcessor.cs index f2494c5e1..32d18dc5f 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleActionProcessor.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleActionProcessor.cs @@ -43,7 +43,9 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models schema.Properties["actionType"] = new JsonSchemaProperty { - Type = JsonObjectType.String, IsRequired = true + Type = JsonObjectType.String, + IsRequired = true, + IsNullableRaw = null }; foreach (var (key, value) in ruleRegistry.Actions) diff --git a/backend/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml b/backend/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml index 56ac5ff71..01ec2d2b9 100644 --- a/backend/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml +++ b/backend/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml @@ -19,7 +19,7 @@
- +