Skip to content

Commit

Permalink
Add an example for getting the selection sets from ctx
Browse files Browse the repository at this point in the history
  • Loading branch information
vektah committed Mar 27, 2018
1 parent e700774 commit c5ccfe4
Show file tree
Hide file tree
Showing 9 changed files with 970 additions and 5 deletions.
8 changes: 4 additions & 4 deletions codegen/templates/data.go

Large diffs are not rendered by default.

768 changes: 768 additions & 0 deletions example/selection/generated.go

Large diffs are not rendered by default.

21 changes: 21 additions & 0 deletions example/selection/models_gen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// This file was generated by github.com/vektah/gqlgen, DO NOT EDIT

package selection

import (
time "time"
)

type Event interface{}
type Like struct {
Reaction string
Sent time.Time
Selection []string
Collected []string
}
type Post struct {
Message string
Sent time.Time
Selection []string
Collected []string
}
10 changes: 10 additions & 0 deletions example/selection/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
### todo app

This is the simplest example of a graphql server.

to run this server
```bash
go run ./example/todo/server/server.go
```

and open http://localhost:8081 in your browser
24 changes: 24 additions & 0 deletions example/selection/schema.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
interface Event {
selection: [String!]
collected: [String!]
}

type Post implements Event {
message: String!
sent: Time!
selection: [String!]
collected: [String!]
}

type Like implements Event {
reaction: String!
sent: Time!
selection: [String!]
collected: [String!]
}

type Query {
events: [Event]
}

scalar Time
62 changes: 62 additions & 0 deletions example/selection/selection.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//go:generate gorunpkg github.com/vektah/gqlgen -out generated.go

package selection

import (
context "context"
"fmt"
"time"

"github.com/vektah/gqlgen/graphql"
query "github.com/vektah/gqlgen/neelance/query"
)

type SelectionResolver struct{}

func (r *SelectionResolver) Query_events(ctx context.Context) ([]Event, error) {
var sels []string

reqCtx := graphql.GetRequestContext(ctx)
fieldSelections := graphql.GetResolverContext(ctx).Field.Selections
for _, sel := range fieldSelections {
switch sel := sel.(type) {
case *query.Field:
sels = append(sels, fmt.Sprintf("%s as %s", sel.Name.Name, sel.Alias.Name))
case *query.InlineFragment:
sels = append(sels, fmt.Sprintf("inline fragment on %s", sel.On.Name))
case *query.FragmentSpread:
fragment := reqCtx.Doc.Fragments.Get(sel.Name.Name)
sels = append(sels, fmt.Sprintf("named fragment %s on %s", sel.Name.Name, fragment.On.Name))
}
}

var events []Event
for i := 0; i < 10; i++ {
if i%2 == 0 {
events = append(events, &Like{
Selection: sels,
Collected: formatCollected(graphql.CollectFieldsCtx(ctx, []string{"Like"})),
Reaction: ":=)",
Sent: time.Now(),
})
} else {
events = append(events, &Post{
Selection: sels,
Collected: formatCollected(graphql.CollectFieldsCtx(ctx, []string{"Post"})),
Message: "Hey",
Sent: time.Now(),
})
}
}

return events, nil
}

func formatCollected(cf []graphql.CollectedField) []string {
var res []string

for _, f := range cf {
res = append(res, fmt.Sprintf("%s as %s", f.Name, f.Alias))
}
return res
}
58 changes: 58 additions & 0 deletions example/selection/selection_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package selection

import (
"net/http/httptest"
"testing"

"github.com/vektah/gqlgen/client"

"github.com/stretchr/testify/require"
"github.com/vektah/gqlgen/handler"
)

func TestSelection(t *testing.T) {
srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(&SelectionResolver{})))
c := client.New(srv.URL)

query := `{
events {
selection
collected
... on Post {
message
sent
}
...LikeFragment
}
}
fragment LikeFragment on Like { reaction sent }
`

var resp struct {
Events []struct {
Selection []string
Collected []string

Message string
Reaction string
Sent string
}
}
c.MustPost(query, &resp)

require.Equal(t, []string{
"selection as selection",
"collected as collected",
"inline fragment on Post",
"named fragment LikeFragment on Like",
}, resp.Events[0].Selection)

require.Equal(t, []string{
"selection as selection",
"collected as collected",
"reaction as reaction",
"sent as sent",
}, resp.Events[0].Collected)
}
15 changes: 15 additions & 0 deletions example/selection/server/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package main

import (
"log"
"net/http"

"github.com/vektah/gqlgen/example/selection"
"github.com/vektah/gqlgen/handler"
)

func main() {
http.Handle("/", handler.Playground("Selection Demo", "/query"))
http.Handle("/query", handler.GraphQL(selection.MakeExecutableSchema(&selection.SelectionResolver{})))
log.Fatal(http.ListenAndServe(":8086", nil))
}
9 changes: 8 additions & 1 deletion graphql/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,12 @@ func GetResolverContext(ctx context.Context) *ResolverContext {
}

func WithResolverContext(ctx context.Context, rc *ResolverContext) context.Context {
return context.WithValue(ctx, request, rc)
return context.WithValue(ctx, resolver, rc)
}

// This is just a convenient wrapper method for CollectFields
func CollectFieldsCtx(ctx context.Context, satisfies []string) []CollectedField {
reqctx := GetRequestContext(ctx)
resctx := GetResolverContext(ctx)
return CollectFields(reqctx.Doc, resctx.Field.Selections, satisfies, reqctx.Variables)
}

0 comments on commit c5ccfe4

Please sign in to comment.