diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Builder.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Builder.cs index 7022aec95..c98b28bcb 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Builder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Builder.cs @@ -151,9 +151,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types return componentTypes.GetOrDefault(schema); } - public EnumerationGraphType GetEnumeration(string name, string prefix, IEnumerable values) + public EnumerationGraphType GetEnumeration(string name, IEnumerable values) { - return enumTypes.GetOrAdd(name, x => new FieldEnumType(name, prefix, values)); + return enumTypes.GetOrAdd(name, x => new FieldEnumType(name, values)); } public IEnumerable> GetAllContentTypes() diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldEnumType.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldEnumType.cs index 3ed6f0da3..905538b56 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldEnumType.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldEnumType.cs @@ -12,35 +12,19 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents { public sealed class FieldEnumType : EnumerationGraphType { - public FieldEnumType(string name, string prefix, IEnumerable values) + public FieldEnumType(string name, IEnumerable values) { Name = name; - var index = 0; + var names = new Names(); foreach (var value in values) { - AddValue(BuildName(value, prefix, index), null, value); - - index++; + if (!Equals(value, null)) + { + AddValue(names[value.ToString()!.Slugify().ToPascalCase()], null, value); + } } } - - private static string BuildName(T value, string prefix, int index) - { - var name = value!.ToString()!.Slugify().ToPascalCase(); - - if (string.IsNullOrEmpty(name)) - { - name = $"{prefix}_{index}"; - } - - if (!char.IsLetter(name[0])) - { - name = $"{prefix}_{name}"; - } - - return name; - } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs index 49f933377..9031739a2 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs @@ -78,7 +78,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents { if (field.Properties?.AllowedValues?.Count > 0) { - return builder.GetEnumeration(args.EnumName, "Number", field.Properties.AllowedValues); + return builder.GetEnumeration(args.EnumName, field.Properties.AllowedValues); } return AllTypes.Float; @@ -88,7 +88,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents { if (field.Properties?.AllowedValues?.Count > 0) { - return builder.GetEnumeration(args.EnumName, "String", field.Properties.AllowedValues); + return builder.GetEnumeration(args.EnumName, field.Properties.AllowedValues); } return AllTypes.String; @@ -98,7 +98,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents { if (field.Properties?.AllowedValues?.Count > 0) { - var @enum = builder.GetEnumeration(args.EnumName, "Tag", field.Properties.AllowedValues); + var @enum = builder.GetEnumeration(args.EnumName, field.Properties.AllowedValues); return new ListGraphType(new NonNullGraphType(@enum)); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs index 698536671..272143811 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs @@ -168,7 +168,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents if (field.Properties?.AllowedValues?.Count > 0) { - type = builder.GetEnumeration(args.EnumName, "Number", field.Properties.AllowedValues); + type = builder.GetEnumeration(args.EnumName, field.Properties.AllowedValues); } return (type, JsonNumber, null); @@ -180,7 +180,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents if (field.Properties?.AllowedValues?.Count > 0) { - type = builder.GetEnumeration(args.EnumName, "String", field.Properties.AllowedValues); + type = builder.GetEnumeration(args.EnumName, field.Properties.AllowedValues); } return (type, JsonString, null); @@ -192,7 +192,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents if (field.Properties?.AllowedValues?.Count > 0) { - var @enum = builder.GetEnumeration(args.EnumName, "Tag", field.Properties.AllowedValues); + var @enum = builder.GetEnumeration(args.EnumName, field.Properties.AllowedValues); type = new ListGraphType(new NonNullGraphType(@enum)); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/Names.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/Names.cs new file mode 100644 index 000000000..ea7fcd434 --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/Names.cs @@ -0,0 +1,58 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents +{ + internal sealed class Names + { + private static readonly HashSet ReservedNames = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "Asset", + "AssetResultDto", + "Content", + "Component", + "EntityCreatedResultDto", + "EntitySavedResultDto", + "JsonScalar", + "JsonPrimitive", + "User" + }; + + private readonly Dictionary takenNames = new Dictionary(); + + public string this[string name, bool isEntity = true] + { + get => GetName(name, isEntity); + } + + private string GetName(string name, bool isEntity) + { + Guard.NotNullOrEmpty(name); + + if (!char.IsLetter(name[0])) + { + name = "gql_" + name; + } + else if (isEntity && ReservedNames.Contains(name)) + { + name = $"{name}Entity"; + } + + if (!takenNames.TryGetValue(name, out var offset)) + { + takenNames[name] = 0; + return name; + } + + takenNames[name] = ++offset; + + return $"{name}{offset + 1}"; + } + } +} diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/SchemaInfo.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/SchemaInfo.cs index 366a03571..f64b54f4e 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/SchemaInfo.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/SchemaInfo.cs @@ -7,7 +7,6 @@ using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Entities.Schemas; -using Squidex.Infrastructure; using Squidex.Text; #pragma warning disable MA0048 // File name must match type name @@ -155,53 +154,4 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents return new FieldInfo(rootField, typeName, names, parentNames, fieldInfos); } } - - internal sealed class Names - { - // Reserver names that are used for other GraphQL types. - private static readonly HashSet ReservedNames = new HashSet(StringComparer.OrdinalIgnoreCase) - { - "Asset", - "AssetResultDto", - "Content", - "Component", - "EntityCreatedResultDto", - "EntitySavedResultDto", - "JsonScalar", - "JsonPrimitive", - "User" - }; - private readonly Dictionary takenNames = new Dictionary(); - - public string this[string name, bool isEntity = true] - { - get => GetName(name, isEntity); - } - - private string GetName(string name, bool isEntity) - { - Guard.NotNullOrEmpty(name); - - if (!char.IsLetter(name[0])) - { - name = "gql_" + name; - } - else if (isEntity && ReservedNames.Contains(name)) - { - name = $"{name}Entity"; - } - - // Avoid duplicate names. - if (!takenNames.TryGetValue(name, out var offset)) - { - takenNames[name] = 0; - return name; - } - - takenNames[name] = ++offset; - - // Add + 1 to all offsets for backwards-compatibility. - return $"{name}{offset + 1}"; - } - } }