예제 #1
0
        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""
                  }
                ]
              }
            }
            ");
        }
예제 #5
0
        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""
                    }
                  }
                }
                ");
        }
예제 #6
0
        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""
                    }
                  }
                }
                ");
        }
예제 #7
0
        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);
            });
        }