From f2f89de480a7c23956fed3981c2f09fe9914b9d4 Mon Sep 17 00:00:00 2001 From: SEBESTYEN Date: Thu, 27 May 2021 12:53:09 +0200 Subject: [PATCH] Feature/add array builder (#709) * use UpsertSchemaFieldBase in FieldBuilder * ArrayFieldBuilder implementation * formating * Refactoring Builders (CRTP) * Formating property * Update ArrayFieldBuilder.cs --- .../Templates/Builders/ArrayFieldBuilder.cs | 110 ++++++++++++++++++ .../Templates/Builders/AssetFieldBuilder.cs | 4 +- .../Templates/Builders/BooleanFieldBuilder.cs | 4 +- .../Builders/DateTimeFieldBuilder.cs | 4 +- .../Apps/Templates/Builders/FieldBuilder.cs | 65 ++++++----- .../Templates/Builders/JsonFieldBuilder.cs | 4 +- .../Templates/Builders/NumberFieldBuilder.cs | 4 +- .../Builders/ReferencesFieldBuilder.cs | 4 +- .../Apps/Templates/Builders/SchemaBuilder.cs | 9 ++ .../Templates/Builders/StringFieldBuilder.cs | 4 +- .../Templates/Builders/TagsFieldBuilder.cs | 2 +- 11 files changed, 170 insertions(+), 44 deletions(-) create mode 100644 backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ArrayFieldBuilder.cs diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ArrayFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ArrayFieldBuilder.cs new file mode 100644 index 000000000..519cb5537 --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ArrayFieldBuilder.cs @@ -0,0 +1,110 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Linq; +using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Domain.Apps.Entities.Schemas.Commands; +using Squidex.Text; + +namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders +{ + public class ArrayFieldBuilder : FieldBuilder + { + protected new UpsertSchemaField field + { + get => base.Field as UpsertSchemaField; + init => base.Field = value; + } + + public ArrayFieldBuilder(UpsertSchemaField field, CreateSchema schema) + : base(field, schema) + { + } + + public ArrayFieldBuilder AddAssets(string name, Action configure) + { + var field = AddField(name); + + configure(new AssetFieldBuilder(field, Schema)); + + return this; + } + + public ArrayFieldBuilder AddBoolean(string name, Action configure) + { + var field = AddField(name); + + configure(new BooleanFieldBuilder(field, Schema)); + + return this; + } + + public ArrayFieldBuilder AddDateTime(string name, Action configure) + { + var field = AddField(name); + + configure(new DateTimeFieldBuilder(field, Schema)); + + return this; + } + + public ArrayFieldBuilder AddJson(string name, Action configure) + { + var field = AddField(name); + + configure(new JsonFieldBuilder(field, Schema)); + + return this; + } + + public ArrayFieldBuilder AddNumber(string name, Action configure) + { + var field = AddField(name); + + configure(new NumberFieldBuilder(field, Schema)); + + return this; + } + + public ArrayFieldBuilder AddReferences(string name, Action configure) + { + var field = AddField(name); + + configure(new ReferencesFieldBuilder(field, Schema)); + + return this; + } + + public ArrayFieldBuilder AddString(string name, Action configure) + { + var field = AddField(name); + + configure(new StringFieldBuilder(field, Schema)); + + return this; + } + + private UpsertSchemaNestedField AddField(string name) where T : FieldProperties, new() + { + var nestedField = new UpsertSchemaNestedField + { + Name = name.ToCamelCase(), + Properties = new T + { + Label = name + } + }; + + field.Nested ??= Array.Empty(); + field.Nested = field.Nested.Union(new[] { nestedField }).ToArray(); + + return nestedField; + } + + } +} diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/AssetFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/AssetFieldBuilder.cs index 0e01618c0..894c4d9cc 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/AssetFieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/AssetFieldBuilder.cs @@ -10,9 +10,9 @@ using Squidex.Domain.Apps.Entities.Schemas.Commands; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { - public class AssetFieldBuilder : FieldBuilder + public class AssetFieldBuilder : FieldBuilder { - public AssetFieldBuilder(UpsertSchemaField field, CreateSchema schema) + public AssetFieldBuilder(UpsertSchemaFieldBase field, CreateSchema schema) : base(field, schema) { } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/BooleanFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/BooleanFieldBuilder.cs index d59672d76..d1cab5e80 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/BooleanFieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/BooleanFieldBuilder.cs @@ -10,9 +10,9 @@ using Squidex.Domain.Apps.Entities.Schemas.Commands; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { - public class BooleanFieldBuilder : FieldBuilder + public class BooleanFieldBuilder : FieldBuilder { - public BooleanFieldBuilder(UpsertSchemaField field, CreateSchema schema) + public BooleanFieldBuilder(UpsertSchemaFieldBase field, CreateSchema schema) : base(field, schema) { } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/DateTimeFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/DateTimeFieldBuilder.cs index 14261dacc..4ed161cd7 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/DateTimeFieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/DateTimeFieldBuilder.cs @@ -10,9 +10,9 @@ using Squidex.Domain.Apps.Entities.Schemas.Commands; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { - public class DateTimeFieldBuilder : FieldBuilder + public class DateTimeFieldBuilder : FieldBuilder { - public DateTimeFieldBuilder(UpsertSchemaField field, CreateSchema schema) + public DateTimeFieldBuilder(UpsertSchemaFieldBase field, CreateSchema schema) : base(field, schema) { } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/FieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/FieldBuilder.cs index f2f67e710..899fdaf8d 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/FieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/FieldBuilder.cs @@ -14,69 +14,76 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { public abstract class FieldBuilder { - private readonly UpsertSchemaField field; - private readonly CreateSchema schema; + protected UpsertSchemaFieldBase Field { get; init; } + protected CreateSchema Schema { get; init; } + } - protected FieldBuilder(UpsertSchemaField field, CreateSchema schema) + public abstract class FieldBuilder : FieldBuilder + where T : FieldBuilder + { + protected FieldBuilder(UpsertSchemaFieldBase field, CreateSchema schema) { - this.field = field; - this.schema = schema; + Field = field; + Schema = schema; } - public FieldBuilder Label(string? label) + public T Label(string? label) { - field.Properties = field.Properties with { Label = label }; + Field.Properties = Field.Properties with { Label = label }; - return this; + return this as T; } - public FieldBuilder Hints(string? hints) + public T Hints(string? hints) { - field.Properties = field.Properties with { Hints = hints }; + Field.Properties = Field.Properties with { Hints = hints }; - return this; + return this as T; } - public FieldBuilder Localizable() + public T Localizable() { - field.Partitioning = Partitioning.Language.Key; + if (Field is UpsertSchemaField localizableField) + { + localizableField.Partitioning = Partitioning.Language.Key; + } - return this; + return this as T; } - public FieldBuilder Disabled() + public T Disabled() { - field.IsDisabled = true; + Field.IsDisabled = true; - return this; + return this as T; } - public FieldBuilder Required() + public T Required() { - field.Properties = field.Properties with { IsRequired = true }; + Field.Properties = Field.Properties with { IsRequired = true }; - return this; + return this as T; } protected void Properties(Func updater) where T : FieldProperties { - field.Properties = updater((T)field.Properties); + Field.Properties = updater((T)Field.Properties); } - public FieldBuilder ShowInList() + public T ShowInList() { - schema.FieldsInLists ??= new FieldNames(); - schema.FieldsInLists.Add(field.Name); + Schema.FieldsInLists ??= new FieldNames(); + Schema.FieldsInLists.Add(Field.Name); - return this; + return this as T; } - public FieldBuilder ShowInReferences() + public T ShowInReferences() { - schema.FieldsInReferences ??= new FieldNames(); - schema.FieldsInReferences.Add(field.Name); + Schema.FieldsInReferences ??= new FieldNames(); + Schema.FieldsInReferences.Add(Field.Name); - return this; + return this as T; } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/JsonFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/JsonFieldBuilder.cs index 6c2ac8b88..672c86407 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/JsonFieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/JsonFieldBuilder.cs @@ -9,9 +9,9 @@ using Squidex.Domain.Apps.Entities.Schemas.Commands; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { - public class JsonFieldBuilder : FieldBuilder + public class JsonFieldBuilder : FieldBuilder { - public JsonFieldBuilder(UpsertSchemaField field, CreateSchema schema) + public JsonFieldBuilder(UpsertSchemaFieldBase field, CreateSchema schema) : base(field, schema) { } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/NumberFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/NumberFieldBuilder.cs index c09a5fa68..7cb33b243 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/NumberFieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/NumberFieldBuilder.cs @@ -9,9 +9,9 @@ using Squidex.Domain.Apps.Entities.Schemas.Commands; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { - public class NumberFieldBuilder : FieldBuilder + public class NumberFieldBuilder : FieldBuilder { - public NumberFieldBuilder(UpsertSchemaField field, CreateSchema schema) + public NumberFieldBuilder(UpsertSchemaFieldBase field, CreateSchema schema) : base(field, schema) { } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ReferencesFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ReferencesFieldBuilder.cs index 541710e1e..0979dfdef 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ReferencesFieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ReferencesFieldBuilder.cs @@ -12,9 +12,9 @@ using Squidex.Infrastructure.Collections; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { - public class ReferencesFieldBuilder : FieldBuilder + public class ReferencesFieldBuilder : FieldBuilder { - public ReferencesFieldBuilder(UpsertSchemaField field, CreateSchema schema) + public ReferencesFieldBuilder(UpsertSchemaFieldBase field, CreateSchema schema) : base(field, schema) { } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs index 91d3dcdce..7757cab14 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs @@ -139,6 +139,15 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders return this; } + public SchemaBuilder AddArray(string name, Action configure) + { + var field = AddField(name); + + configure(new ArrayFieldBuilder(field, command)); + + return this; + } + private UpsertSchemaField AddField(string name) where T : FieldProperties, new() { var field = new UpsertSchemaField diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/StringFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/StringFieldBuilder.cs index f227149b8..8db1172ae 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/StringFieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/StringFieldBuilder.cs @@ -11,9 +11,9 @@ using Squidex.Infrastructure.Collections; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { - public class StringFieldBuilder : FieldBuilder + public class StringFieldBuilder : FieldBuilder { - public StringFieldBuilder(UpsertSchemaField field, CreateSchema schema) + public StringFieldBuilder(UpsertSchemaFieldBase field, CreateSchema schema) : base(field, schema) { } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/TagsFieldBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/TagsFieldBuilder.cs index bb20e708d..7ebb417be 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/TagsFieldBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/TagsFieldBuilder.cs @@ -11,7 +11,7 @@ using Squidex.Infrastructure.Collections; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { - public class TagsFieldBuilder : FieldBuilder + public class TagsFieldBuilder : FieldBuilder { public TagsFieldBuilder(UpsertSchemaField field, CreateSchema schema) : base(field, schema)