Closed mrdulin closed 4 years ago
Here is a solution, just create base fields and merge base fields with extra fields. A bit like fragment on the client side
schema/user.go
:
var UserBaseFields = graphql.Fields{
"loginname": &graphql.Field{Type: graphql.String},
"avatar_url": &graphql.Field{Type: graphql.String},
}
var UserType = graphql.NewObject(graphql.ObjectConfig{
Name: "User",
Description: "This respresents an user",
Fields: UserBaseFields,
})
var UserDetailType = graphql.NewObject(graphql.ObjectConfig{
Name: "UserDetail",
Description: "This respresents an user detail",
Fields: utils.MergeGraphqlFields(UserBaseFields, graphql.Fields{
"githubUsername": &graphql.Field{Type: graphql.String},
"create_at": &graphql.Field{Type: graphql.String},
"score": &graphql.Field{Type: graphql.Int},
"recent_topics": &graphql.Field{Type: graphql.NewList(RecentTopicType)},
}),
})
utils.go
:
package utils
// MergeMap merge two maps without mutating anyone
func MergeGraphqlFields(a map[string]*graphql.Field, b map[string]*graphql.Field) graphql.Fields {
m := map[string]*graphql.Field{}
// TODO: use goroutine to merge concurrencily.
for k, v := range b {
m[k] = v
}
for k, v := range a {
m[k] = v
}
return m
}
Here is my senario:
As you can see, the
loginname
andavatar_url
fields are same inUserType
andUserDetailType
. I want to extract this common part and reuse it in bothUserType
andUserDetailType
.We can use embed struct in golang like the
User
andUserDetail
structs. I'd like to do the same thing forgraphql-go
. It's some kind of composition.