diff --git a/router-tests/go.mod b/router-tests/go.mod index b0cecd4121..8add22347c 100644 --- a/router-tests/go.mod +++ b/router-tests/go.mod @@ -27,7 +27,7 @@ require ( github.com/wundergraph/cosmo/demo/pkg/subgraphs/projects v0.0.0-20250715110703-10f2e5f9c79e github.com/wundergraph/cosmo/router v0.0.0-20250807150641-0bf88c35298d github.com/wundergraph/cosmo/router-plugin v0.0.0-20250616075713-f2b99c96cec4 - github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.218 + github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.219 go.opentelemetry.io/otel v1.28.0 go.opentelemetry.io/otel/sdk v1.28.0 go.opentelemetry.io/otel/sdk/metric v1.28.0 diff --git a/router-tests/go.sum b/router-tests/go.sum index cbc2a28e6c..3d4634f769 100644 --- a/router-tests/go.sum +++ b/router-tests/go.sum @@ -325,8 +325,8 @@ github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 h1:8/D7f8gKxTB github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083/go.mod h1:eOTL6acwctsN4F3b7YE+eE2t8zcJ/doLm9sZzsxxxrE= github.com/wundergraph/consul/sdk v0.0.0-20250204115147-ed842a8fd301 h1:EzfKHQoTjFDDcgaECCCR2aTePqMu9QBmPbyhqIYOhV0= github.com/wundergraph/consul/sdk v0.0.0-20250204115147-ed842a8fd301/go.mod h1:wxI0Nak5dI5RvJuzGyiEK4nZj0O9X+Aw6U0tC1wPKq0= -github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.218 h1:pum2nvDvy1S6dhJLfVQqbKLXbtTNESkQ8bFoZ9e611Y= -github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.218/go.mod h1:DnYY1alnsgzkanSwbFiFIdXKOuf8dHQWQ2P4BzTc6aI= +github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.219 h1:caSsQXPHNsFU897BFCfZftpexIxcz12u1785AcREWHE= +github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.219/go.mod h1:DnYY1alnsgzkanSwbFiFIdXKOuf8dHQWQ2P4BzTc6aI= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= diff --git a/router-tests/grpc_subgraph_test.go b/router-tests/grpc_subgraph_test.go index 5c8c6094f2..8ab7a757a4 100644 --- a/router-tests/grpc_subgraph_test.go +++ b/router-tests/grpc_subgraph_test.go @@ -128,6 +128,11 @@ func TestGRPCSubgraph(t *testing.T) { query: `query { projects { id tasks { id subtasks { id name } } } }`, expected: `{"data":{"projects":[{"id":"1","tasks":[{"id":"1","subtasks":[{"id":"1a","name":"Server Inventory"},{"id":"1b","name":"Database Inventory"},{"id":"","name":""}]},{"id":"2","subtasks":null},{"id":"3","subtasks":[{"id":"3a","name":"VPC Configuration"},{"id":"3b","name":"Security Groups"},{"id":"","name":""}]},{"id":"14","subtasks":[]}]},{"id":"2","tasks":[{"id":"4","subtasks":[]},{"id":"5","subtasks":[]}]},{"id":"3","tasks":[{"id":"6","subtasks":null},{"id":"7","subtasks":[]}]},{"id":"4","tasks":[{"id":"8","subtasks":[]}]},{"id":"5","tasks":[{"id":"9","subtasks":[]}]},{"id":"6","tasks":[{"id":"10","subtasks":null},{"id":"11","subtasks":[]}]},{"id":"7","tasks":[{"id":"12","subtasks":[]},{"id":"13","subtasks":[]}]}]}}`, }, + { + name: "query project with nullable fields and aliases", + query: `query { project(id: "1") { id name myDescription: description myStartDate: startDate myEndDate: endDate } }`, + expected: `{"data":{"project":{"id":"1","name":"Cloud Migration Overhaul","myDescription":"Migrate legacy systems to cloud-native architecture","myStartDate":"2021-01-01","myEndDate":"2025-08-20"}}}`, + }, } testenv.Run(t, &testenv.Config{ RouterConfigJSONTemplate: testenv.ConfigWithGRPCJSONTemplate, diff --git a/router-tests/router_plugin_test.go b/router-tests/router_plugin_test.go index e99cea7f8b..77264610e8 100644 --- a/router-tests/router_plugin_test.go +++ b/router-tests/router_plugin_test.go @@ -251,6 +251,11 @@ func TestRouterPluginRequests(t *testing.T) { query: `query { projects { id tasks { id subtasks { id name } } } }`, expected: `{"data":{"projects":[{"id":"1","tasks":[{"id":"1","subtasks":[{"id":"1a","name":"Server Inventory"},{"id":"1b","name":"Database Inventory"},{"id":"","name":""}]},{"id":"2","subtasks":null},{"id":"3","subtasks":[{"id":"3a","name":"VPC Configuration"},{"id":"3b","name":"Security Groups"},{"id":"","name":""}]},{"id":"14","subtasks":[]}]},{"id":"2","tasks":[{"id":"4","subtasks":[]},{"id":"5","subtasks":[]}]},{"id":"3","tasks":[{"id":"6","subtasks":null},{"id":"7","subtasks":[]}]},{"id":"4","tasks":[{"id":"8","subtasks":[]}]},{"id":"5","tasks":[{"id":"9","subtasks":[]}]},{"id":"6","tasks":[{"id":"10","subtasks":null},{"id":"11","subtasks":[]}]},{"id":"7","tasks":[{"id":"12","subtasks":[]},{"id":"13","subtasks":[]}]}]}}`, }, + { + name: "query project with nullable fields and aliases", + query: `query { project(id: "1") { id name myDescription: description myStartDate: startDate myEndDate: endDate } }`, + expected: `{"data":{"project":{"id":"1","name":"Cloud Migration Overhaul","myDescription":"Migrate legacy systems to cloud-native architecture","myStartDate":"2021-01-01","myEndDate":"2025-08-20"}}}`, + }, } testenv.Run(t, &testenv.Config{ RouterConfigJSONTemplate: testenv.ConfigWithPluginsJSONTemplate, diff --git a/router/core/factoryresolver.go b/router/core/factoryresolver.go index 3753836866..41f0c4d425 100644 --- a/router/core/factoryresolver.go +++ b/router/core/factoryresolver.go @@ -627,7 +627,7 @@ func toGRPCConfiguration(config *nodev1.GRPCConfiguration, pluginsEnabled bool) QueryRPCs: make(grpcdatasource.RPCConfigMap), MutationRPCs: make(grpcdatasource.RPCConfigMap), SubscriptionRPCs: make(grpcdatasource.RPCConfigMap), - EntityRPCs: make(map[string]grpcdatasource.EntityRPCConfig), + EntityRPCs: make(map[string][]grpcdatasource.EntityRPCConfig), Fields: make(map[string]grpcdatasource.FieldMap), EnumValues: make(map[string][]grpcdatasource.EnumValueMapping), } @@ -649,14 +649,14 @@ func toGRPCConfiguration(config *nodev1.GRPCConfiguration, pluginsEnabled bool) } for _, entity := range in.EntityMappings { - result.EntityRPCs[entity.Key] = grpcdatasource.EntityRPCConfig{ + result.EntityRPCs[entity.TypeName] = append(result.EntityRPCs[entity.TypeName], grpcdatasource.EntityRPCConfig{ Key: entity.Key, RPCConfig: grpcdatasource.RPCConfig{ RPC: entity.Rpc, Request: entity.Request, Response: entity.Response, }, - } + }) } for _, field := range in.TypeFieldMappings { diff --git a/router/go.mod b/router/go.mod index 9f6458b899..1cbf41f91e 100644 --- a/router/go.mod +++ b/router/go.mod @@ -31,7 +31,7 @@ require ( github.com/tidwall/gjson v1.18.0 github.com/tidwall/sjson v1.2.5 github.com/twmb/franz-go v1.16.1 - github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.218 + github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.219 // Do not upgrade, it renames attributes we rely on go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 go.opentelemetry.io/contrib/propagators/b3 v1.23.0 diff --git a/router/go.sum b/router/go.sum index 6e9b3b742d..337daf14a6 100644 --- a/router/go.sum +++ b/router/go.sum @@ -290,8 +290,8 @@ github.com/vektah/gqlparser/v2 v2.5.16 h1:1gcmLTvs3JLKXckwCwlUagVn/IlV2bwqle0vJ0 github.com/vektah/gqlparser/v2 v2.5.16/go.mod h1:1lz1OeCqgQbQepsGxPVywrjdBHW2T08PUS3pJqepRww= github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 h1:8/D7f8gKxTBjW+SZK4mhxTTBVpxcqeBgWF1Rfmltbfk= github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083/go.mod h1:eOTL6acwctsN4F3b7YE+eE2t8zcJ/doLm9sZzsxxxrE= -github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.218 h1:pum2nvDvy1S6dhJLfVQqbKLXbtTNESkQ8bFoZ9e611Y= -github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.218/go.mod h1:DnYY1alnsgzkanSwbFiFIdXKOuf8dHQWQ2P4BzTc6aI= +github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.219 h1:caSsQXPHNsFU897BFCfZftpexIxcz12u1785AcREWHE= +github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.219/go.mod h1:DnYY1alnsgzkanSwbFiFIdXKOuf8dHQWQ2P4BzTc6aI= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=