/
EfGraphQLService_Navigation.cs
54 lines (51 loc) · 1.9 KB
/
EfGraphQLService_Navigation.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using GraphQL.Resolvers;
using GraphQL.Types;
namespace GraphQL.EntityFramework
{
partial class EfGraphQLService
{
public FieldType AddNavigationField<TSource, TReturn>(
ObjectGraphType<TSource> graph,
string name,
Func<ResolveFieldContext<TSource>, TReturn> resolve,
Type graphType = null,
IEnumerable<QueryArgument> arguments = null,
IEnumerable<string> includeNames = null)
where TReturn : class
{
Guard.AgainstNull(nameof(graph), graph);
var field = BuildNavigationField(name, resolve, includeNames, graphType, arguments);
return graph.AddField(field);
}
FieldType BuildNavigationField<TSource, TReturn>(
string name,
Func<ResolveFieldContext<TSource>, TReturn> resolve,
IEnumerable<string> includeNames,
Type graphType,
IEnumerable<QueryArgument> arguments)
where TReturn : class
{
Guard.AgainstNullWhiteSpace(nameof(name), name);
Guard.AgainstNull(nameof(resolve), resolve);
graphType = GraphTypeFinder.FindGraphType<TReturn>(graphType);
return new FieldType
{
Name = name,
Type = graphType,
Arguments = ArgumentAppender.GetQueryArguments(arguments),
Metadata = IncludeAppender.GetIncludeMetadata(name, includeNames),
Resolver = new AsyncFieldResolver<TSource, TReturn>(async context =>
{
var result = resolve(context);
if (await filters.ShouldInclude(context.UserContext, result))
{
return result;
}
return null;
})
};
}
}
}