public static ExecutionResultLink SignalR(string url, IHttpContextAccessor accessor) { return(RemoteLinks.SignalR(cancellationToken => { var connection = new HubConnectionBuilder() .AddJsonProtocol(options => { options .PayloadSerializerOptions .Converters .Add(new ObjectDictionaryConverter()); }) .WithUrl(url, configure => { configure.AccessTokenProvider = () => { var token = accessor.HttpContext ?.User .FindFirstValue("access_token"); return Task.FromResult(token); }; }) .Build(); return Task.FromResult(connection); })); }
public async Task Execute_with_StaticLink() { /* Given */ TypeSystemDocument schemaOne = @" extend type User { id: ID! name: String! } extend type Query { userById(id: ID!): User } extend schema { query: Query } "; TypeSystemDocument schemaTwo = @" type Address { city: String! } type User { address: Address! } type Query { } "; var schemaOneResolvers = RemoteSchemaTools.CreateLinkResolvers( schemaOne, RemoteLinks.Static(new ExecutionResult { Data = new Dictionary <string, object> { ["userById"] = new Dictionary <string, object> { ["id"] = "1", ["name"] = "name" } } })); var schemaTwoResolvers = new ResolversMap {
public async Task ExecuteWithStaticDataLink() { /* Given */ var builder = new SchemaBuilder() .Scalar("Long", out _, new StringConverter()) .Scalar("Lat", out _, new StringConverter()) .Scalar("Polyline", out _, new StringConverter()) .ImportIntrospectedSchema(GetDigitransitIntrospection()); /* When */ var schema = RemoteSchemaTools.MakeRemoteExecutable( builder, link: RemoteLinks.Static(new ExecutionResult { Data = new Dictionary <string, object> { ["feeds"] = new Dictionary <string, object> { ["feedId"] = "123" } } })); var result = await Executor.ExecuteAsync(new ExecutionOptions { Schema = schema, Document = Parser.ParseDocument(@" { feeds { feedId } } ") }); /* Then */ result.ShouldMatchJson( @" { ""data"": { ""feeds"": [ { ""feedId"": ""123"" } ] } } "); }
public async Task ExecuteRemotely() { /* Given */ var builder = new SchemaBuilder() .Scalar("Long", out _, new StringConverter()) .Scalar("Lat", out _, new StringConverter()) .Scalar("Polyline", out _, new StringConverter()) .ImportIntrospectedSchema(GetDigitransitIntrospection()); /* When */ var schema = RemoteSchemaTools.MakeRemoteExecutable( builder, link: RemoteLinks.Http( url: "https://api.digitransit.fi/routing/v1/routers/next-hsl/index/graphql" ) ); var result = await Executor.ExecuteAsync(new ExecutionOptions { Schema = schema, Document = Parser.ParseDocument(@" { feeds { feedId } } ") }); /* Then */ result.ShouldMatchJson(@" { ""data"": { ""feeds"": [ { ""feedId"": ""HSL"" }, { ""feedId"": ""HSLlautta"" } ] } } "); }
public async Task Execute_with_StaticLink() { /* Given */ var schemaOneBuilder = new SchemaBuilder() .Sdl( @" type User { id: ID! name: String! } type Query { userById(id: ID!): User } schema { query: Query } "); var schemaTwoBuilder = new SchemaBuilder() .Sdl( @" type Address { city: String! } type User { address: Address! } type Query { } " ); var schemaOne = RemoteSchemaTools.MakeRemoteExecutable( schemaOneBuilder, RemoteLinks.Static(new ExecutionResult { Data = new Dictionary <string, object> { ["userById"] = new Dictionary <string, object> { ["id"] = "1", ["name"] = "name" } } })); var schemaTwo = SchemaTools.MakeExecutableSchema( schemaTwoBuilder, new ObjectTypeMap { ["Address"] = new FieldResolversMap { { "city", context => ResolveSync.As(context.ObjectValue) } }, ["User"] = new FieldResolversMap { { "address", context => ResolveSync.As("Vantaa") } } }); var schema = new SchemaBuilder() .Merge(schemaOne, schemaTwo) .Build(); /* When */ var result = await Executor.ExecuteAsync(new ExecutionOptions { Schema = schema, Document = Parser.ParseDocument(@" { userById(id: ""1"") { id name address { city } } }") }); /* Then */ result.ShouldMatchJson( @" { ""data"": { ""userById"": { ""address"": { ""city"": ""Vantaa"" }, ""name"": ""name"", ""id"": ""1"" } } } "); }
public async Task Subscriptions() { /* Given */ var schemaOneBuilder = new SchemaBuilder() .Sdl( @" type User { id: ID! name: String! } type Query { userById(id: ID!): User } type Subscription { userAdded: User } schema { query: Query subscription: Subscription } "); var schemaTwoBuilder = new SchemaBuilder() .Sdl( @" type Address { city: String! } type User { address: Address! } type Query { } type Subscription { } " ); var schemaOne = RemoteSchemaTools.MakeRemoteExecutable( schemaOneBuilder, RemoteLinks.Static(new ExecutionResult { Data = new Dictionary <string, object> { ["userAdded"] = new Dictionary <string, object> { ["id"] = "1", ["name"] = "name" } } })); var schemaTwo = SchemaTools.MakeExecutableSchema( schemaTwoBuilder, new ObjectTypeMap { ["Address"] = new FieldResolversMap { { "city", context => ResolveSync.As(context.ObjectValue) } }, ["User"] = new FieldResolversMap { { "address", context => ResolveSync.As("Vantaa") } } }); var schema = new SchemaBuilder() .Merge(schemaOne, schemaTwo) .Build(); var unsubscribe = new CancellationTokenSource(TimeSpan.FromSeconds(30)); /* When */ var subscriptionResult = await Executor.SubscribeAsync(new ExecutionOptions { Schema = schema, Document = Parser.ParseDocument(@" subscription { userAdded { id name address { city } } }") }, unsubscribe.Token); var result = await subscriptionResult.Source.Reader.ReadAsync(unsubscribe.Token); /* Then */ result.ShouldMatchJson( @" { ""data"": { ""userAdded"": { ""address"": { ""city"": ""Vantaa"" }, ""name"": ""name"", ""id"": ""1"" } } } "); }
public static ExecutionResultLink SignalROrHttp( string hubUrl, string httpUrl, IHttpContextAccessor accessor) { var signalr = RemoteLinks.SignalR(cancellationToken => { var connection = new HubConnectionBuilder() .AddJsonProtocol(options => { options .PayloadSerializerOptions .Converters .Add(new ObjectDictionaryConverter()); }) .WithUrl(hubUrl, configure => { configure.AccessTokenProvider = () => { var token = accessor.HttpContext ?.User .FindFirstValue("access_token"); return(Task.FromResult(token)); }; }) .Build(); return(Task.FromResult(connection)); }); var http = RemoteLinks.Http( httpUrl, transformRequest: operation => { var request = HttpLink.DefaultTransformRequest(operation); request.Headers.Authorization = new AuthenticationHeaderValue( "Bearer", accessor.HttpContext?.User.FindFirstValue("access_token")); return(request); }, transformResponse: response => { return(HttpLink.DefaultTransformResponse(response)); }); return(async(document, variables, token) => { var hasQueryOrMutation = document.OperationDefinitions .Any(op => op.Operation != OperationType.Subscription); if (hasQueryOrMutation) { var result = await http(document, variables, CancellationToken.None); return result; } return await signalr(document, variables, token); }); }