src/Epam.GraphQL/Configuration/Implementations/Fields/ResolvableFields/ResolvedMutationFieldResolverFactory.cs (102 lines of code) (raw):
// Copyright © 2020 EPAM Systems, Inc. All Rights Reserved. All information contained herein is, and remains the
// property of EPAM Systems, Inc. and/or its suppliers and is protected by international intellectual
// property law. Dissemination of this information or reproduction of this material is strictly forbidden,
// unless prior written permission is obtained from EPAM Systems, Inc
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Epam.GraphQL.Configuration.Implementations.Descriptors;
using Epam.GraphQL.Mutation;
using Epam.GraphQL.Savers;
using Epam.GraphQL.Types;
using GraphQL;
using GraphQL.Resolvers;
namespace Epam.GraphQL.Configuration.Implementations.Fields.ResolvableFields
{
internal static class ResolvedMutationFieldResolverFactory
{
public static (IFieldResolver Resolver, IGraphTypeDescriptor<TExecutionContext> GraphType) Create<TReturnType, TExecutionContext>(
IGraphTypeDescriptor<TExecutionContext> graphType,
Func<IResolveFieldContext, TReturnType> resolver)
{
return (new FuncFieldResolver<object, TReturnType>(resolver), graphType);
}
public static (IFieldResolver Resolver, IGraphTypeDescriptor<TExecutionContext> GraphType) Create<TReturnType, TExecutionContext>(
MutationField<TExecutionContext> mutationField,
Func<IResolveFieldContext, MutationResult<TReturnType>> resolver,
Action<ResolveOptionsBuilder>? optionsBuilder)
{
var builder = new ResolveOptionsBuilder();
optionsBuilder?.Invoke(builder);
var options = builder.Options;
var graphType = GraphTypeDescriptor.Create<TExecutionContext>(typeof(MutationResultGraphType<TExecutionContext, TReturnType>));
var fieldResolver = new FuncFieldResolver<object>(context =>
{
return DbContextSaver.PerformManualMutationAndGetResult(mutationField.Mutation.SubmitInputTypeRegistry, resolver(context), mutationField.Mutation, context, options);
});
return (fieldResolver, graphType);
}
public static (IFieldResolver Resolver, IGraphTypeDescriptor<TExecutionContext> GraphType) Create<TReturnType, TExecutionContext>(
IGraphTypeDescriptor<TExecutionContext> graphType,
Func<IResolveFieldContext, Task<TReturnType>> resolver)
{
return (new FuncFieldResolver<object, TReturnType>(arg => new ValueTask<TReturnType?>(resolver(arg))), graphType);
}
public static (IFieldResolver Resolver, IGraphTypeDescriptor<TExecutionContext> GraphType) Create<TReturnType, TExecutionContext>(
MutationField<TExecutionContext> mutationField,
Func<IResolveFieldContext, Task<MutationResult<TReturnType>>> resolver,
Action<ResolveOptionsBuilder>? optionsBuilder)
{
var builder = new ResolveOptionsBuilder();
optionsBuilder?.Invoke(builder);
var options = builder.Options;
var graphType = GraphTypeDescriptor.Create<MutationResultGraphType<TExecutionContext, TReturnType>, TExecutionContext>();
var fieldResolver = new FuncFieldResolver<object>(async context =>
{
var mutationResult = await resolver(context).ConfigureAwait(false);
return await DbContextSaver.PerformManualMutationAndGetResult(mutationField.Mutation.SubmitInputTypeRegistry, mutationResult, mutationField.Mutation, context, options).ConfigureAwait(false);
});
return (fieldResolver, graphType);
}
public static (IFieldResolver Resolver, IGraphTypeDescriptor<TExecutionContext> GraphType) Create<TReturnType, TExecutionContext>(
MutationField<TExecutionContext> mutationField,
IGraphTypeDescriptor<TExecutionContext> graphType,
Func<IResolveFieldContext, IEnumerable<TReturnType>> resolver,
Action<ResolveOptionsBuilder>? optionsBuilder)
{
if (typeof(TReturnType) == typeof(object) || mutationField.Mutation.SubmitInputTypeRegistry.IsRegistered<TReturnType>())
{
var builder = new ResolveOptionsBuilder();
optionsBuilder?.Invoke(builder);
var options = builder.Options;
graphType = GraphTypeDescriptor.Create<SubmitOutputGraphType<TExecutionContext>, TExecutionContext>();
var fieldResolver = new FuncFieldResolver<object>(context =>
{
var result = resolver(context).Cast<object>();
return DbContextSaver.PerformManualMutationAndGetResult(mutationField.Mutation.SubmitInputTypeRegistry, result, mutationField.Mutation, context, options);
});
return (fieldResolver, graphType);
}
return Create(graphType, resolver);
}
public static (IFieldResolver Resolver, IGraphTypeDescriptor<TExecutionContext> GraphType) Create<TReturnType, TExecutionContext>(
MutationField<TExecutionContext> mutationField,
IGraphTypeDescriptor<TExecutionContext> graphType,
Func<IResolveFieldContext, Task<IEnumerable<TReturnType>>> resolver,
Action<ResolveOptionsBuilder>? optionsBuilder)
{
if (typeof(TReturnType) == typeof(object) || mutationField.Mutation.SubmitInputTypeRegistry.IsRegistered<TReturnType>())
{
var builder = new ResolveOptionsBuilder();
optionsBuilder?.Invoke(builder);
var options = builder.Options;
graphType = GraphTypeDescriptor.Create<SubmitOutputGraphType<TExecutionContext>, TExecutionContext>();
var fieldResolver = new FuncFieldResolver<object>(async context =>
{
var result = (await resolver(context).ConfigureAwait(false)).Cast<object>();
return await DbContextSaver.PerformManualMutationAndGetResult(mutationField.Mutation.SubmitInputTypeRegistry, result, mutationField.Mutation, context, options)
.ConfigureAwait(false);
});
return (fieldResolver, graphType);
}
return Create(graphType, resolver);
}
}
}