Browse Source

Merge branch 'feature/graphql-enums'

# Conflicts:
#	backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Builder.cs
#	backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldEnumType.cs
#	backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs
#	backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs
pull/849/head
Sebastian 4 years ago
parent
commit
6ef47362c7
  1. 4
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Builder.cs
  2. 26
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldEnumType.cs
  3. 6
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs
  4. 6
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs
  5. 60
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/Names.cs
  6. 50
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/SchemaInfo.cs

4
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<T>(string name, string prefix, IEnumerable<T> values)
public EnumerationGraphType GetEnumeration<T>(string name, IEnumerable<T> values)
{
return enumTypes.GetOrAdd(name, x => new FieldEnumType<T>(name, prefix, values));
return enumTypes.GetOrAdd(name, x => new FieldEnumType<T>(name, values));
}
public IEnumerable<KeyValuePair<SchemaInfo, ContentGraphType>> GetAllContentTypes()

26
backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldEnumType.cs

@ -12,35 +12,23 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents
{
public sealed class FieldEnumType<T> : EnumerationGraphType
{
public FieldEnumType(string name, string prefix, IEnumerable<T> values)
public FieldEnumType(string name, IEnumerable<T> values)
{
Name = name;
var index = 0;
// Avoid conflicts with duplicate names.
var names = new Names();
foreach (var value in values)
{
AddValue(BuildName(value, prefix, index), null, value);
index++;
}
}
private static string BuildName(T value, string prefix, int index)
if (!Equals(value, null))
{
var name = value!.ToString()!.Slugify().ToPascalCase();
// Get rid of special characters.
var valueName = value.ToString()!.Slugify().ToPascalCase();
if (string.IsNullOrEmpty(name))
{
name = $"{prefix}_{index}";
AddValue(names[valueName], null, value);
}
if (!char.IsLetter(name[0]))
{
name = $"{prefix}_{name}";
}
return name;
}
}
}

6
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));
}

6
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));
}

60
backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/Names.cs

@ -0,0 +1,60 @@
// ==========================================================================
// 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
{
// Reserver names that are used for other GraphQL types.
private static readonly HashSet<string> ReservedNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
"Asset",
"AssetResultDto",
"Content",
"Component",
"EntityCreatedResultDto",
"EntitySavedResultDto",
"JsonScalar",
"JsonPrimitive",
"User"
};
private readonly Dictionary<string, int> takenNames = new Dictionary<string, int>();
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}";
}
}
}

50
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<string> ReservedNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
"Asset",
"AssetResultDto",
"Content",
"Component",
"EntityCreatedResultDto",
"EntitySavedResultDto",
"JsonScalar",
"JsonPrimitive",
"User"
};
private readonly Dictionary<string, int> takenNames = new Dictionary<string, int>();
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}";
}
}
}

Loading…
Cancel
Save