Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarity fixes #1

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,27 @@

[![Go Reference](https://pkg.go.dev/badge/github.com/ec2-software/gqlgen-introspect-filter.svg)](https://pkg.go.dev/github.com/ec2-software/gqlgen-introspect-filter)

Filter GQLGen's Introspection by your application's business logic.
Filter GQLGen's Introspection Schema using your application's business logic.

```go

import (
"github.com/99designs/gqlgen/graphql/handler"
"yourprojectname/generated/server"
)

// Create the default GQLGen server
exec := handler.NewDefaultServer(
server.NewExecutableSchema(
server.Config{Resolvers: resolvers},
),
)

// Use as a GQLGen plugin
exec.Use(introspectionfilter.Plugin{
Schema: schema,

exec.Use(introspectionfilter.Extension{
// Write filter functions to choose if various parts are included.
FieldFilter: func(fd *ast.FieldDefinition) bool { return fd.Name != "text" },
ReturnField: func(ctx context.Context, fd *ast.FieldDefinition, d *ast.Definition) bool {
return fd.Name != "text"
},
})
```
75 changes: 37 additions & 38 deletions introspection_filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,45 +8,44 @@ import (
"github.com/vektah/gqlparser/v2/ast"
)

type Plugin struct {
schema *ast.Schema
var schema *ast.Schema

FieldFilter FieldFilter
TypeFilter TypeFilter
DirectiveFilter DirectiveFilter
EnumFilter EnumFilter
type Extension struct {
ReturnField FieldFilter
ReturnType TypeFilter
ReturnDirective DirectiveFilter
ReturnFilter EnumFilter
}

type FieldFilter func(ctx context.Context, d *ast.FieldDefinition) bool
type FieldFilter func(ctx context.Context, fd *ast.FieldDefinition, d *ast.Definition) bool
type TypeFilter func(ctx context.Context, d *ast.Definition) bool
type DirectiveFilter func(ctx context.Context, d *ast.DirectiveDefinition) bool
type InputFieldFilter func(ctx context.Context, d *ast.FieldDefinition) bool
type EnumFilter func(ctx context.Context, d *ast.EnumValueDefinition) bool
type DirectiveFilter func(ctx context.Context, dd *ast.DirectiveDefinition) bool
type InputFieldFilter func(ctx context.Context, fd *ast.FieldDefinition) bool
type EnumFilter func(ctx context.Context, ed *ast.EnumValueDefinition) bool

func (*Plugin) ExtensionName() string {
func (e Extension) ExtensionName() string {
return "IntrospectionFilter"
}
func (p *Plugin) Validate(schema graphql.ExecutableSchema) error {
p.schema = schema.Schema()
func (e Extension) Validate(s graphql.ExecutableSchema) error {
schema = s.Schema()
return nil
}

func (p *Plugin) InterceptField(ctx context.Context, next graphql.Resolver) (res interface{}, err error) {
func (e Extension) InterceptField(ctx context.Context, next graphql.Resolver) (res interface{}, err error) {
res, err = next(ctx)
if err != nil {
return
}

fc := graphql.GetFieldContext(ctx)
schema := p.schema

switch fc.Object {
case "__Schema":
switch fc.Field.Name {
case "types":
res = p.filterTypes(ctx, res.([]introspection.Type))
res = e.filterTypes(ctx, res.([]introspection.Type))
case "directives":
res = p.filterDirectives(ctx, res.([]introspection.Directive))
res = e.filterDirectives(ctx, res.([]introspection.Directive))
}
case "__Type":
iType := fc.Parent.Result.(*introspection.Type)
Expand All @@ -62,32 +61,32 @@ func (p *Plugin) InterceptField(ctx context.Context, next graphql.Resolver) (res

switch fc.Field.Name {
case "fields":
res = p.filterFields(ctx, res.([]introspection.Field), astType)
res = e.filterFields(ctx, res.([]introspection.Field), astType)
case "inputFields":
res = p.filterInputFields(ctx, res.([]introspection.InputValue), astType)
res = e.filterInputFields(ctx, res.([]introspection.InputValue), astType)
case "possibleTypes":
res = p.filterTypes(ctx, res.([]introspection.Type))
res = e.filterTypes(ctx, res.([]introspection.Type))
case "enumValues":
res = p.filterEnumValues(ctx, res.([]introspection.EnumValue), astType)
res = e.filterEnumValues(ctx, res.([]introspection.EnumValue), astType)
}
}

return res, err
}

func (filter *Plugin) filterTypes(ctx context.Context, list []introspection.Type) []introspection.Type {
if filter.TypeFilter == nil {
func (e Extension) filterTypes(ctx context.Context, list []introspection.Type) []introspection.Type {
if e.ReturnType == nil {
return list
}
fList := make([]introspection.Type, 0, len(list))
for _, t := range list {
tName := t.Name()
if tName != nil {
astType := filter.schema.Types[*tName]
astType := schema.Types[*tName]
if astType == nil {
continue
}
if !filter.TypeFilter(ctx, astType) {
if !e.ReturnType(ctx, astType) {
continue
}
}
Expand All @@ -96,26 +95,26 @@ func (filter *Plugin) filterTypes(ctx context.Context, list []introspection.Type
return fList
}

func (p *Plugin) filterDirectives(ctx context.Context, list []introspection.Directive) []introspection.Directive {
if p.DirectiveFilter == nil {
func (e Extension) filterDirectives(ctx context.Context, list []introspection.Directive) []introspection.Directive {
if e.ReturnDirective == nil {
return list
}
fList := make([]introspection.Directive, 0, len(list))
for _, x := range list {
astDirective := p.schema.Directives[x.Name]
astDirective := schema.Directives[x.Name]
if astDirective == nil {
continue
}
if !p.DirectiveFilter(ctx, astDirective) {
if !e.ReturnDirective(ctx, astDirective) {
continue
}
fList = append(fList, x)
}
return fList
}

func (p *Plugin) filterFields(ctx context.Context, list []introspection.Field, astType *ast.Definition) []introspection.Field {
if p.FieldFilter == nil {
func (e Extension) filterFields(ctx context.Context, list []introspection.Field, astType *ast.Definition) []introspection.Field {
if e.ReturnField == nil {
return list
}
fList := make([]introspection.Field, 0, len(list))
Expand All @@ -124,16 +123,16 @@ func (p *Plugin) filterFields(ctx context.Context, list []introspection.Field, a
if astField == nil {
continue
}
if !p.FieldFilter(ctx, astField) {
if !e.ReturnField(ctx, astField, astType) {
continue
}
fList = append(fList, x)
}
return fList
}

func (p *Plugin) filterInputFields(ctx context.Context, list []introspection.InputValue, astType *ast.Definition) []introspection.InputValue {
if p.FieldFilter == nil {
func (e Extension) filterInputFields(ctx context.Context, list []introspection.InputValue, astType *ast.Definition) []introspection.InputValue {
if e.ReturnField == nil {
return list
}
fList := make([]introspection.InputValue, 0, len(list))
Expand All @@ -142,16 +141,16 @@ func (p *Plugin) filterInputFields(ctx context.Context, list []introspection.Inp
if astField == nil {
continue
}
if !p.FieldFilter(ctx, astField) {
if !e.ReturnField(ctx, astField, astType) {
continue
}
fList = append(fList, x)
}
return fList
}

func (p *Plugin) filterEnumValues(ctx context.Context, list []introspection.EnumValue, astType *ast.Definition) []introspection.EnumValue {
if p.EnumFilter == nil {
func (e Extension) filterEnumValues(ctx context.Context, list []introspection.EnumValue, astType *ast.Definition) []introspection.EnumValue {
if e.ReturnFilter == nil {
return list
}
fList := make([]introspection.EnumValue, 0, len(list))
Expand All @@ -160,7 +159,7 @@ func (p *Plugin) filterEnumValues(ctx context.Context, list []introspection.Enum
if astEnum == nil {
continue
}
if !p.EnumFilter(ctx, astEnum) {
if !e.ReturnFilter(ctx, astEnum) {
continue
}
fList = append(fList, x)
Expand Down
4 changes: 2 additions & 2 deletions introspection_filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ func TestPlugin(t *testing.T) {
graphql.GetOperationContext(ctx).DisableIntrospection = false
return next(ctx)
})
exec.Use(&introspectionfilter.Plugin{
FieldFilter: func(ctx context.Context, fd *ast.FieldDefinition) bool { return fd.Name != "text" },
exec.Use(&introspectionfilter.Extension{
ReturnField: func(ctx context.Context, fd *ast.FieldDefinition, d *ast.Definition) bool { return fd.Name != "text" },
})
ctx := context.Background()

Expand Down