|
|
@ -6,18 +6,18 @@ |
|
|
// ==========================================================================
|
|
|
// ==========================================================================
|
|
|
|
|
|
|
|
|
using System; |
|
|
using System; |
|
|
using System.Collections.Generic; |
|
|
|
|
|
using GraphQL.Resolvers; |
|
|
|
|
|
using GraphQL.Types; |
|
|
using GraphQL.Types; |
|
|
using Newtonsoft.Json.Linq; |
|
|
using Newtonsoft.Json.Linq; |
|
|
using Squidex.Domain.Apps.Core.Schemas; |
|
|
using Squidex.Domain.Apps.Core.Schemas; |
|
|
using Squidex.Domain.Apps.Entities.Schemas; |
|
|
using Squidex.Domain.Apps.Entities.Schemas; |
|
|
using Squidex.Infrastructure; |
|
|
|
|
|
|
|
|
|
|
|
namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types |
|
|
namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types |
|
|
{ |
|
|
{ |
|
|
public sealed class QueryGraphTypeVisitor : IFieldVisitor<(IGraphType ResolveType, IFieldResolver Resolver)> |
|
|
public delegate object ValueResolver(JToken value, ResolveFieldContext context); |
|
|
|
|
|
|
|
|
|
|
|
public sealed class QueryGraphTypeVisitor : IFieldVisitor<(IGraphType ResolveType, ValueResolver Resolver)> |
|
|
{ |
|
|
{ |
|
|
|
|
|
private static readonly ValueResolver NoopResolver = new ValueResolver((value, c) => value); |
|
|
private readonly ISchemaEntity schema; |
|
|
private readonly ISchemaEntity schema; |
|
|
private readonly Func<Guid, IGraphType> schemaResolver; |
|
|
private readonly Func<Guid, IGraphType> schemaResolver; |
|
|
private readonly IGraphModel model; |
|
|
private readonly IGraphModel model; |
|
|
@ -31,87 +31,81 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types |
|
|
this.schemaResolver = schemaResolver; |
|
|
this.schemaResolver = schemaResolver; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IArrayField field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IArrayField field) |
|
|
{ |
|
|
{ |
|
|
return ResolveNested(field); |
|
|
return ResolveNested(field); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<AssetsFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<AssetsFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveAssets(assetListType); |
|
|
return ResolveAssets(assetListType); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<BooleanFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<BooleanFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveDefault(AllTypes.NoopBoolean); |
|
|
return ResolveDefault(AllTypes.NoopBoolean); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<DateTimeFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<DateTimeFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveDefault(AllTypes.NoopDate); |
|
|
return ResolveDefault(AllTypes.NoopDate); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<GeolocationFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<GeolocationFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveDefault(AllTypes.NoopGeolocation); |
|
|
return ResolveDefault(AllTypes.NoopGeolocation); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<JsonFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<JsonFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveDefault(AllTypes.NoopJson); |
|
|
return ResolveDefault(AllTypes.NoopJson); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<NumberFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<NumberFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveDefault(AllTypes.NoopFloat); |
|
|
return ResolveDefault(AllTypes.NoopFloat); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<ReferencesFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<ReferencesFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveReferences(field); |
|
|
return ResolveReferences(field); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<StringFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<StringFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveDefault(AllTypes.NoopString); |
|
|
return ResolveDefault(AllTypes.NoopString); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public (IGraphType ResolveType, IFieldResolver Resolver) Visit(IField<TagsFieldProperties> field) |
|
|
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<TagsFieldProperties> field) |
|
|
{ |
|
|
{ |
|
|
return ResolveDefault(AllTypes.NoopTags); |
|
|
return ResolveDefault(AllTypes.NoopTags); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private static (IGraphType ResolveType, IFieldResolver Resolver) ResolveDefault(IGraphType type) |
|
|
private static (IGraphType ResolveType, ValueResolver Resolver) ResolveDefault(IGraphType type) |
|
|
{ |
|
|
{ |
|
|
return (type, new FuncFieldResolver<IReadOnlyDictionary<string, JToken>, object>(c => c.Source.GetOrDefault(c.FieldName))); |
|
|
return (type, NoopResolver); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private static ValueTuple<IGraphType, IFieldResolver> ResolveAssets(IGraphType assetListType) |
|
|
private (IGraphType ResolveType, ValueResolver Resolver) ResolveNested(IArrayField field) |
|
|
{ |
|
|
{ |
|
|
var resolver = new FuncFieldResolver<IReadOnlyDictionary<string, JToken>, object>(c => |
|
|
var schemaFieldType = new ListGraphType(new NonNullGraphType(new NestedObjectGraphType(model, schema, field))); |
|
|
{ |
|
|
|
|
|
var context = (GraphQLExecutionContext)c.UserContext; |
|
|
|
|
|
var contentIds = c.Source.GetOrDefault(c.FieldName); |
|
|
|
|
|
|
|
|
|
|
|
return context.GetReferencedAssetsAsync(contentIds); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
return (assetListType, resolver); |
|
|
return (schemaFieldType, NoopResolver); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private ValueTuple<IGraphType, IFieldResolver> ResolveNested(IArrayField field) |
|
|
private (IGraphType ResolveType, ValueResolver Resolver) ResolveAssets(IGraphType assetListType) |
|
|
{ |
|
|
{ |
|
|
var resolver = new FuncFieldResolver<IReadOnlyDictionary<string, JToken>, object>(c => |
|
|
var resolver = new ValueResolver((value, c) => |
|
|
{ |
|
|
{ |
|
|
return c.Source.GetOrDefault(c.FieldName); |
|
|
var context = (GraphQLExecutionContext)c.UserContext; |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
var schemaFieldType = new ListGraphType(new NonNullGraphType(new NestedObjectGraphType(model, schema, field))); |
|
|
return context.GetReferencedAssetsAsync(value); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
return (schemaFieldType, resolver); |
|
|
return (assetListType, resolver); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private ValueTuple<IGraphType, IFieldResolver> ResolveReferences(IField field) |
|
|
private (IGraphType ResolveType, ValueResolver Resolver) ResolveReferences(IField field) |
|
|
{ |
|
|
{ |
|
|
var schemaId = ((ReferencesFieldProperties)field.RawProperties).SchemaId; |
|
|
var schemaId = ((ReferencesFieldProperties)field.RawProperties).SchemaId; |
|
|
|
|
|
|
|
|
@ -122,12 +116,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types |
|
|
return (null, null); |
|
|
return (null, null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var resolver = new FuncFieldResolver<IReadOnlyDictionary<string, JToken>, object>(c => |
|
|
var resolver = new ValueResolver((value, c) => |
|
|
{ |
|
|
{ |
|
|
var context = (GraphQLExecutionContext)c.UserContext; |
|
|
var context = (GraphQLExecutionContext)c.UserContext; |
|
|
var contentIds = c.Source.GetOrDefault(c.FieldName); |
|
|
|
|
|
|
|
|
|
|
|
return context.GetReferencedContentsAsync(schemaId, contentIds); |
|
|
return context.GetReferencedContentsAsync(schemaId, value); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
var schemaFieldType = new ListGraphType(new NonNullGraphType(contentType)); |
|
|
var schemaFieldType = new ListGraphType(new NonNullGraphType(contentType)); |
|
|
|