diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/CachingGraphQLService.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/CachingGraphQLService.cs index 9e09e9bd4..15fc0f613 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/CachingGraphQLService.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/CachingGraphQLService.cs @@ -91,7 +91,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL return new GraphQLModel(app, allSchemas, - resolver.GetRequiredService(), + resolver.GetRequiredService(), resolver.GetRequiredService()); }); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs index 833f42278..ac8c73812 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs @@ -24,7 +24,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL private readonly GraphQLSchema schema; private readonly ISemanticLog log; - public GraphQLModel(IAppEntity app, IEnumerable schemas, GraphQLTypeFactory typeFactory, ISemanticLog log) + public GraphQLModel(IAppEntity app, IEnumerable schemas, SharedTypes typeFactory, ISemanticLog log) { this.log = log; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppQueriesGraphType.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppQueriesGraphType.cs index e43e36059..541528b82 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppQueriesGraphType.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppQueriesGraphType.cs @@ -15,9 +15,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { public AppQueriesGraphType(Builder builder, IEnumerable schemaInfos) { - AddField(builder.TypeFactory.FindAsset); - AddField(builder.TypeFactory.QueryAssets); - AddField(builder.TypeFactory.QueryAssetsWithTotal); + AddField(builder.SharedTypes.FindAsset); + AddField(builder.SharedTypes.QueryAssets); + AddField(builder.SharedTypes.QueryAssetsWithTotal); foreach (var schemaInfo in schemaInfos) { 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 63a175bb8..cbc877f2c 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 @@ -28,14 +28,14 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { private readonly Dictionary contentTypes = new Dictionary(ReferenceEqualityComparer.Instance); private readonly Dictionary contentResultTypes = new Dictionary(ReferenceEqualityComparer.Instance); - private readonly GraphQLTypeFactory typeFactory; - private readonly GraphQLFieldVisitor fieldVisitor; - private readonly GraphQLFieldInputVisitor fieldInputVisitor; + private readonly SharedTypes sharedTypes; + private readonly FieldVisitor fieldVisitor; + private readonly FieldInputVisitor fieldInputVisitor; private readonly PartitionResolver partitionResolver; - public GraphQLTypeFactory TypeFactory + public SharedTypes SharedTypes { - get { return typeFactory; } + get { return sharedTypes; } } static Builder() @@ -48,14 +48,14 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types ValueConverter.Register(x => new Status(x)); } - public Builder(IAppEntity app, GraphQLTypeFactory typeFactory) + public Builder(IAppEntity app, SharedTypes sharedTypes) { - this.typeFactory = typeFactory; + this.sharedTypes = sharedTypes; partitionResolver = app.PartitionResolver(); - fieldVisitor = new GraphQLFieldVisitor(this); - fieldInputVisitor = new GraphQLFieldInputVisitor(this); + fieldVisitor = new FieldVisitor(this); + fieldInputVisitor = new FieldInputVisitor(this); } public GraphQLSchema BuildSchema(IEnumerable schemas) @@ -68,7 +68,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types foreach (var schemaInfo in schemaInfos) { - var contentType = new ContentGraphType(schemaInfo); + var contentType = new ContentGraphType(this, schemaInfo); contentTypes[schemaInfo] = contentType; contentResultTypes[schemaInfo] = new ContentResultGraphType(contentType, schemaInfo); @@ -82,7 +82,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types newSchema.RegisterValueConverter(JsonConverter.Instance); newSchema.RegisterValueConverter(InstantConverter.Instance); - newSchema.RegisterType(ContentInterfaceGraphType.Instance); + newSchema.RegisterType(sharedTypes.ContentInterface); if (schemas.Any()) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentGraphType.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentGraphType.cs index 5647b4810..a29a4d870 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentGraphType.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentGraphType.cs @@ -17,7 +17,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents { private readonly DomainId schemaId; - public ContentGraphType(SchemaInfo schemaInfo) + public ContentGraphType(Builder builder, SchemaInfo schemaInfo) { schemaId = schemaInfo.Schema.Id; @@ -32,7 +32,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents AddField(ContentFields.Status); AddField(ContentFields.StatusColor); - AddResolvedInterface(ContentInterfaceGraphType.Instance); + AddResolvedInterface(builder.SharedTypes.ContentInterface); Description = $"The structure of a {schemaInfo.DisplayName} content type."; @@ -44,7 +44,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents return value is IContentEntity content && content.SchemaId?.Id == schemaId; } - public void Initialize(Builder builder, SchemaInfo schemaInfo, IEnumerable all) + public void Initialize(Builder builder, SchemaInfo schemaInfo, IEnumerable allSchemas) { AddField(new FieldType { @@ -80,7 +80,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents }); } - foreach (var other in all.Where(x => References(x, schemaInfo))) + foreach (var other in allSchemas.Where(IsReferencingThis)) { AddReferencingQueries(builder, other); } @@ -111,14 +111,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents }).WithSchemaId(referencingSchemaInfo); } - private static bool References(SchemaInfo other, SchemaInfo schema) + private bool IsReferencingThis(SchemaInfo other) { - var id = schema.Schema.Id; - - return other.Schema.SchemaDef.Fields.Any(x => References(x, id)); + return other.Schema.SchemaDef.Fields.Any(IsReferencingThis); } - private static bool References(IField field, DomainId id) + private bool IsReferencingThis(IField field) { switch (field) { @@ -126,9 +124,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents return reference.Properties.SchemaIds == null || reference.Properties.SchemaIds.Count == 0 || - reference.Properties.SchemaIds.Contains(id); + reference.Properties.SchemaIds.Contains(schemaId); case IArrayField arrayField: - return arrayField.Fields.Any(x => References(x, id)); + return arrayField.Fields.Any(IsReferencingThis); } return false; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentInterfaceGraphType.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentInterfaceGraphType.cs index 3d9b845d6..eb4ef1297 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentInterfaceGraphType.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentInterfaceGraphType.cs @@ -11,9 +11,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents { internal sealed class ContentInterfaceGraphType : InterfaceGraphType { - public static readonly IInterfaceGraphType Instance = new ContentInterfaceGraphType(); - - private ContentInterfaceGraphType() + public ContentInterfaceGraphType() { Name = "Content"; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLFieldInputVisitor.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs similarity index 94% rename from backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLFieldInputVisitor.cs rename to backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs index a628db17b..72dd6644c 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLFieldInputVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldInputVisitor.cs @@ -11,11 +11,11 @@ using Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents; namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { - internal sealed class GraphQLFieldInputVisitor : IFieldVisitor + internal sealed class FieldInputVisitor : IFieldVisitor { private readonly Builder builder; - public GraphQLFieldInputVisitor(Builder builder) + public FieldInputVisitor(Builder builder) { this.builder = builder; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLFieldVisitor.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs similarity index 93% rename from backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLFieldVisitor.cs rename to backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs index 678a844fb..1eb3fb55e 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLFieldVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs @@ -11,14 +11,13 @@ using GraphQL; using GraphQL.Resolvers; using GraphQL.Types; using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents; using Squidex.Infrastructure.Json.Objects; -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types +namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents { public delegate object ValueResolver(IJsonValue value, IResolveFieldContext fieldContext, GraphQLExecutionContext context); - internal sealed class GraphQLFieldVisitor : IFieldVisitor<(IGraphType?, IFieldResolver?, QueryArguments?), FieldInfo> + internal sealed class FieldVisitor : IFieldVisitor<(IGraphType?, IFieldResolver?, QueryArguments?), FieldInfo> { private static readonly IFieldResolver Noop = CreateValueResolver((value, fieldContext, contex) => value); private static readonly IFieldResolver Json = CreateValueResolver(ContentActions.Json.Resolver); @@ -35,7 +34,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types private readonly Builder builder; - public GraphQLFieldVisitor(Builder builder) + public FieldVisitor(Builder builder) { this.builder = builder; } @@ -52,7 +51,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types public (IGraphType?, IFieldResolver?, QueryArguments?) Visit(IField field, FieldInfo args) { - return (builder.TypeFactory.AssetsList, Assets, null); + return (builder.SharedTypes.AssetsList, Assets, null); } public (IGraphType?, IFieldResolver?, QueryArguments?) Visit(IField field, FieldInfo args) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/SchemaInfos.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/SchemaInfos.cs similarity index 100% rename from backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/SchemaInfos.cs rename to backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/SchemaInfos.cs diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLTypeFactory.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/SharedTypes.cs similarity index 86% rename from backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLTypeFactory.cs rename to backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/SharedTypes.cs index 432e759e9..865ec637f 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GraphQLTypeFactory.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/SharedTypes.cs @@ -9,14 +9,16 @@ using System; using GraphQL.Types; using Squidex.Domain.Apps.Core; using Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Assets; +using Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents; namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { - public class GraphQLTypeFactory + public sealed class SharedTypes { private readonly Lazy asset; private readonly Lazy assetsList; private readonly Lazy assetsResult; + private readonly Lazy contentInterface; private readonly Lazy findAsset; private readonly Lazy queryAssets; private readonly Lazy queryAssetsWithTotal; @@ -27,13 +29,15 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types public IGraphType AssetsResult => assetsResult.Value; + public IInterfaceGraphType ContentInterface => contentInterface.Value; + public FieldType FindAsset => findAsset.Value; public FieldType QueryAssets => queryAssets.Value; public FieldType QueryAssetsWithTotal => queryAssetsWithTotal.Value; - public GraphQLTypeFactory(IUrlGenerator urlGenerator) + public SharedTypes(IUrlGenerator urlGenerator) { asset = new Lazy(() => { @@ -50,6 +54,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types return new AssetsResultGraphType(AssetsList); }); + contentInterface = new Lazy(() => + { + return new ContentInterfaceGraphType(); + }); + findAsset = new Lazy(() => { return new FieldType diff --git a/backend/src/Squidex/Config/Domain/QueryServices.cs b/backend/src/Squidex/Config/Domain/QueryServices.cs index 45651c669..5c27169b5 100644 --- a/backend/src/Squidex/Config/Domain/QueryServices.cs +++ b/backend/src/Squidex/Config/Domain/QueryServices.cs @@ -30,7 +30,7 @@ namespace Squidex.Config.Domain services.AddSingletonAs() .AsSelf(); - services.AddSingletonAs() + services.AddSingletonAs() .AsSelf(); services.AddSingletonAs() diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLTestBase.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLTestBase.cs index 0602afc7d..742c88ca1 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLTestBase.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLTestBase.cs @@ -170,7 +170,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL [typeof(IUrlGenerator)] = urlGenerator, [typeof(ISemanticLog)] = A.Fake(), [typeof(DataLoaderDocumentListener)] = new DataLoaderDocumentListener(dataLoaderContext), - [typeof(GraphQLTypeFactory)] = new GraphQLTypeFactory(urlGenerator) + [typeof(SharedTypes)] = new SharedTypes(urlGenerator) }; }