Skip to content

Commit

Permalink
Add support for named queries/mutations
Browse files Browse the repository at this point in the history
  • Loading branch information
mislav committed Jul 28, 2020
1 parent d48a9a7 commit a4a48d3
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 5 deletions.
45 changes: 40 additions & 5 deletions query.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,55 @@ import (
"github.com/shurcooL/graphql/ident"
)

type NamedOperation struct {
Name string
Document interface{}
}

func NewNamedOperation(name string, v interface{}) *NamedOperation {
return &NamedOperation{
Name: name,
Document: v,
}
}

func deconstructOperation(v interface{}) (string, interface{}) {
if named, ok := v.(*NamedOperation); ok {
return named.Name, named.Document
}
return "", v
}

func constructQuery(v interface{}, variables map[string]interface{}) string {
query := query(v)
queryName, queryDoc := deconstructOperation(v)
query := query(queryDoc)

queryPrefix := "query"
if queryName != "" {
queryPrefix = "query " + queryName
}

if len(variables) > 0 {
return "query(" + queryArguments(variables) + ")" + query
return queryPrefix + "(" + queryArguments(variables) + ")" + query
} else if queryName != "" {
return queryPrefix + query
}
return query
}

func constructMutation(v interface{}, variables map[string]interface{}) string {
query := query(v)
mutationName, queryDoc := deconstructOperation(v)
query := query(queryDoc)

mutationPrefix := "mutation"
if mutationName != "" {
mutationPrefix = "mutation " + mutationName
}

if len(variables) > 0 {
return "mutation(" + queryArguments(variables) + ")" + query
return mutationPrefix + "(" + queryArguments(variables) + ")" + query
}
return "mutation" + query
return mutationPrefix + query
}

// queryArguments constructs a minified arguments string for variables.
Expand Down
32 changes: 32 additions & 0 deletions query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,20 @@ func TestConstructQuery(t *testing.T) {
}{},
want: `{viewer{login,createdAt,id,databaseId}}`,
},
{
inV: NewNamedOperation("FindPerson", struct {
Login string
}{}),
inVariables: nil,
want: `query FindPerson{login}`,
},
{
inV: NewNamedOperation("FindPerson", struct {
Login string
}{}),
inVariables: map[string]interface{}{"id": Int(1)},
want: `query FindPerson($id:Int!){login}`,
},
}
for _, tc := range tests {
got := constructQuery(tc.inV, tc.inVariables)
Expand Down Expand Up @@ -262,6 +276,24 @@ func TestConstructMutation(t *testing.T) {
},
want: `mutation($input:AddReactionInput!){addReaction(input:$input){subject{reactionGroups{users{totalCount}}}}}`,
},
{
inV: NewNamedOperation("ThumbsUp", struct {
AddReaction struct {
Name string
} `graphql:"addReaction(input:$input)"`
}{}),
inVariables: nil,
want: `mutation ThumbsUp{addReaction(input:$input){name}}`,
},
{
inV: NewNamedOperation("ThumbsUp", struct {
AddReaction struct {
Name string
} `graphql:"addReaction(input:$input)"`
}{}),
inVariables: map[string]interface{}{"id": Int(1)},
want: `mutation ThumbsUp($id:Int!){addReaction(input:$input){name}}`,
},
}
for _, tc := range tests {
got := constructMutation(tc.inV, tc.inVariables)
Expand Down

0 comments on commit a4a48d3

Please sign in to comment.