diff --git a/core/api.go b/core/api.go index 8f53db7..2ddee37 100644 --- a/core/api.go +++ b/core/api.go @@ -55,6 +55,7 @@ import ( _log "log" "os" + "github.com/chirino/graphql" "github.com/dosco/super-graph/core/internal/allow" "github.com/dosco/super-graph/core/internal/crypto" "github.com/dosco/super-graph/core/internal/psql" @@ -92,6 +93,7 @@ type SuperGraph struct { anonExists bool qc *qcode.Compiler pc *psql.Compiler + Engine *graphql.Engine } // NewSuperGraph creates the SuperGraph struct, this involves querying the database to learn its @@ -123,6 +125,10 @@ func NewSuperGraph(conf *Config, db *sql.DB) (*SuperGraph, error) { return nil, err } + if err := sg.initGraphQLEgine(); err != nil { + return nil, err + } + if len(conf.SecretKey) != 0 { sk := sha256.Sum256([]byte(conf.SecretKey)) conf.SecretKey = "" @@ -154,6 +160,14 @@ type Result struct { // In developer mode all names queries are saved into a file `allow.list` and in production mode only // queries from this file can be run. func (sg *SuperGraph) GraphQL(c context.Context, query string, vars json.RawMessage) (*Result, error) { + // try to use the sg.Engine to execute introspection queries... + res := sg.Engine.ExecuteOne(&graphql.EngineRequest{ Query: query}) + if res.Error()==nil { + r := &Result{} + r.Data = res.Data + return r, nil + } + ct := scontext{Context: c, sg: sg, query: query, vars: vars} if len(vars) <= 2 { diff --git a/core/graph-schema.go b/core/graph-schema.go new file mode 100644 index 0000000..0f87e49 --- /dev/null +++ b/core/graph-schema.go @@ -0,0 +1,174 @@ +package core + +import ( + "strings" + + "github.com/chirino/graphql" + "github.com/chirino/graphql/resolvers" + "github.com/chirino/graphql/schema" + "github.com/dosco/super-graph/core/internal/psql" +) + +var typeMap map[string]string = map[string]string{ + "smallint": "Int", + "integer": "Int", + "bigint": "Int", + "smallserial": "Int", + "serial": "Int", + "bigserial": "Int", + "decimal": "Float", + "numeric": "Float", + "real": "Float", + "double precision": "Float", + "money": "Float", + "boolean": "Boolean", +} + +func (sg *SuperGraph) initGraphQLEgine() error { + sg.Engine = graphql.New() + engineSchema := sg.Engine.Schema + dbSchema := sg.schema + + sanitizeForGraphQLSchema := func(value string) string { + // TODO: + return value + } + + gqltype := func(col psql.DBColumn) schema.Type { + typeName := typeMap[strings.ToLower(col.Type)] + if typeName == "" { + typeName = "String" + } + var t schema.Type = &schema.TypeName{Ident: schema.Ident{Text: typeName}} + if col.NotNull { + t = &schema.NonNull{OfType: t} + } + return t + } + + query := &schema.Object{ + Name: "Query", + Fields: schema.FieldList{}, + } + mutation := &schema.Object{ + Name: "Mutation", + Fields: schema.FieldList{}, + } + engineSchema.Types[query.Name] = query + engineSchema.Types[mutation.Name] = mutation + engineSchema.EntryPoints[schema.Query] = query + engineSchema.EntryPoints[schema.Mutation] = mutation + + tableNames := dbSchema.GetTableNames() + for _, table := range tableNames { + + ti, err := dbSchema.GetTable(table) + if err != nil { + return err + } + + if !ti.IsSingular { + continue + } + + pti, err := dbSchema.GetTable(ti.Plural) + if err != nil { + return err + } + + outputType := &schema.Object{ + Name: sanitizeForGraphQLSchema(ti.Singular) + "Output", + Fields: schema.FieldList{}, + } + + inputType := &schema.InputObject{ + Name: sanitizeForGraphQLSchema(ti.Singular) + "Input", + Fields: schema.InputValueList{}, + } + + for _, col := range ti.Columns { + outputType.Fields = append(outputType.Fields, &schema.Field{ + Name: sanitizeForGraphQLSchema(col.Name), + Type: gqltype(col), + }) + inputType.Fields = append(inputType.Fields, &schema.InputValue{ + Name: schema.Ident{Text: sanitizeForGraphQLSchema(col.Name)}, + Type: gqltype(col), + }) + } + + engineSchema.Types[outputType.Name] = outputType + engineSchema.Types[inputType.Name] = inputType + + outputTypeName := &schema.TypeName{Ident: schema.Ident{Text: outputType.Name}} + inputTypeName := &schema.TypeName{Ident: schema.Ident{Text: inputType.Name}} + pluralOutputTypeName := &schema.NonNull{OfType: &schema.List{OfType: &schema.NonNull{OfType: &schema.TypeName{Ident: schema.Ident{Text: outputType.Name}}}}} + pluralInputTypeName := &schema.NonNull{OfType: &schema.List{OfType: &schema.NonNull{OfType: &schema.TypeName{Ident: schema.Ident{Text: inputType.Name}}}}} + + args := schema.InputValueList{} + if ti.PrimaryCol != nil { + t := gqltype(*ti.PrimaryCol) + if _, ok := t.(*schema.NonNull); !ok { + t = &schema.NonNull{OfType: t} + } + arg := &schema.InputValue{ + Name: schema.Ident{Text: "id"}, + Type: t, + } + args = append(args, arg) + } + + query.Fields = append(query.Fields, &schema.Field{ + Name: sanitizeForGraphQLSchema(ti.Singular), + Type: outputTypeName, + Args: args, + }) + query.Fields = append(query.Fields, &schema.Field{ + Name: sanitizeForGraphQLSchema(pti.Plural), + Type: pluralOutputTypeName, + Args: args, + }) + + mutation.Fields = append(mutation.Fields, &schema.Field{ + Name: sanitizeForGraphQLSchema(ti.Singular), + Args: append(args, schema.InputValueList{ + &schema.InputValue{ + Name: schema.Ident{Text: "insert"}, + Type: inputTypeName, + }, + &schema.InputValue{ + Name: schema.Ident{Text: "inserts"}, + Type: pluralInputTypeName, + }, + &schema.InputValue{ + Name: schema.Ident{Text: "update"}, + Type: inputTypeName, + }, + &schema.InputValue{ + Name: schema.Ident{Text: "updates"}, + Type: pluralInputTypeName, + }, + }...), + Type: outputType, + }) + + } + err := engineSchema.ResolveTypes() + if err != nil { + return err + } + + sg.Engine.Resolver = resolvers.Func(func(request *resolvers.ResolveRequest, next resolvers.Resolution) resolvers.Resolution { + resolver := resolvers.MetadataResolver.Resolve(request, next) + if resolver != nil { + return resolver + } + resolver = resolvers.MethodResolver.Resolve(request, next) // needed by the MetadataResolver + if resolver != nil { + return resolver + } + + return nil + }) + return nil +} diff --git a/core/internal/integration_tests/integration_tests.go b/core/internal/integration_tests/integration_tests.go index e97db22..b7595e2 100644 --- a/core/internal/integration_tests/integration_tests.go +++ b/core/internal/integration_tests/integration_tests.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/dosco/super-graph/core" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -90,6 +91,15 @@ func TestSuperGraph(t *testing.T, db *sql.DB, before func(t *testing.T)) { require.Equal(t, `{"line_items": [{"id": 5001}, {"id": 5002}]}`, string(res.Data)) }) + t.Run("get line item", func(t *testing.T) { + before(t) + res, err := sg.GraphQL(ctx, + `query { line_item(id:$id) { id, price, quantity } }`, + json.RawMessage(`{"id":5001}`)) + require.NoError(t, err, res.SQL()) + require.Equal(t, `{"line_item": {"id": 5001, "price": 6.95, "quantity": 10}}`, string(res.Data)) + }) + t.Run("get line items", func(t *testing.T) { before(t) res, err := sg.GraphQL(ctx, @@ -140,4 +150,154 @@ func TestSuperGraph(t *testing.T, db *sql.DB, before func(t *testing.T)) { require.Equal(t, `{"line_items": [{"id": 5003, "product": {"name": "Charmin Ultra Soft"}}]}`, string(res.Data)) }) + t.Run("schema introspection", func(t *testing.T) { + before(t) + // fmt.Println(sg.Engine.Schema.String()) + assert.Equal(t, `type Mutation { + line_item(id:Int!, insert:line_itemInput, inserts:[line_itemInput!]!, update:line_itemInput, updates:[line_itemInput!]!):line_itemOutput + product(id:Int!, insert:productInput, inserts:[productInput!]!, update:productInput, updates:[productInput!]!):productOutput + user(id:Int!, insert:userInput, inserts:[userInput!]!, update:userInput, updates:[userInput!]!):userOutput } +type Query { + line_item(id:Int!):line_itemOutput + line_items(id:Int!):[line_itemOutput!]! + product(id:Int!):productOutput + products(id:Int!):[productOutput!]! + user(id:Int!):userOutput + users(id:Int!):[userOutput!]! +} +input line_itemInput { + id:Int! + price:Float + product:Int + quantity:Int +} +type line_itemOutput { + id:Int! + price:Float + product:Int + quantity:Int +} +input productInput { + id:Int! + name:String + weight:Float +} +type productOutput { + id:Int! + name:String + weight:Float +} +input userInput { + full_name:String + id:Int! +} +type userOutput { + full_name:String + id:Int! +} +schema { + mutation: Mutation + query: Query +} +`, sg.Engine.Schema.String()) + }) + + res, err := sg.GraphQL(ctx,introspectionQuery, json.RawMessage(``)) + assert.NoError(t, err) + assert.Contains(t, string(res.Data), + `{"queryType":{"name":"Query"},"mutationType":{"name":"Mutation"},"subscriptionType":null,"types":`) + assert.Contains(t, string(res.Data), + `{"kind":"OBJECT","name":"Mutation","description":null,"fields":[{"name":"line_item","description":null`) +} + +const introspectionQuery = ` + query { + __schema { + queryType { name } + mutationType { name } + subscriptionType { name } + types { + ...FullType + } + directives { + name + description + locations + args { + ...InputValue + } + } + } + } + fragment FullType on __Type { + kind + name + description + fields(includeDeprecated: true) { + name + description + args { + ...InputValue + } + type { + ...TypeRef + } + isDeprecated + deprecationReason + } + inputFields { + ...InputValue + } + interfaces { + ...TypeRef + } + enumValues(includeDeprecated: true) { + name + description + isDeprecated + deprecationReason + } + possibleTypes { + ...TypeRef + } + } + fragment InputValue on __InputValue { + name + description + type { ...TypeRef } + defaultValue + } + fragment TypeRef on __Type { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + } + } + } + } + } + } + } + } +` diff --git a/core/internal/psql/query.go b/core/internal/psql/query.go index 853dc51..215d0bd 100644 --- a/core/internal/psql/query.go +++ b/core/internal/psql/query.go @@ -141,7 +141,7 @@ func (co *Compiler) compileQuery(qc *qcode.QCode, w io.Writer, vars Variables) ( c.renderLateralJoin(sel) } - if !ti.Singular { + if !ti.IsSingular { c.renderPluralSelect(sel, ti) } @@ -178,7 +178,7 @@ func (co *Compiler) compileQuery(qc *qcode.QCode, w io.Writer, vars Variables) ( io.WriteString(c.w, `)`) aliasWithID(c.w, "__sj", sel.ID) - if !ti.Singular { + if !ti.IsSingular { io.WriteString(c.w, `)`) aliasWithID(c.w, "__sj", sel.ID) } @@ -706,7 +706,7 @@ func (c *compilerContext) renderBaseSelect(sel *qcode.Select, ti *DBTableInfo, r } switch { - case ti.Singular: + case ti.IsSingular: io.WriteString(c.w, ` LIMIT ('1') :: integer`) case len(sel.Paging.Limit) != 0: diff --git a/core/internal/psql/schema.go b/core/internal/psql/schema.go index b885f72..8727a89 100644 --- a/core/internal/psql/schema.go +++ b/core/internal/psql/schema.go @@ -16,12 +16,14 @@ type DBSchema struct { type DBTableInfo struct { Name string Type string - Singular bool + IsSingular bool Columns []DBColumn PrimaryCol *DBColumn TSVCol *DBColumn ColMap map[string]*DBColumn ColIDMap map[int16]*DBColumn + Singular string + Plural string } type RelType int @@ -89,23 +91,28 @@ func (s *DBSchema) addTable( colidmap := make(map[int16]*DBColumn, len(cols)) singular := flect.Singularize(t.Key) + plural := flect.Pluralize(t.Key) + s.t[singular] = &DBTableInfo{ - Name: t.Name, - Type: t.Type, - Singular: true, - Columns: cols, - ColMap: colmap, - ColIDMap: colidmap, + Name: t.Name, + Type: t.Type, + IsSingular: true, + Columns: cols, + ColMap: colmap, + ColIDMap: colidmap, + Singular: singular, + Plural: plural, } - plural := flect.Pluralize(t.Key) s.t[plural] = &DBTableInfo{ - Name: t.Name, - Type: t.Type, - Singular: false, - Columns: cols, - ColMap: colmap, - ColIDMap: colidmap, + Name: t.Name, + Type: t.Type, + IsSingular: false, + Columns: cols, + ColMap: colmap, + ColIDMap: colidmap, + Singular: singular, + Plural: plural, } if al, ok := aliases[t.Key]; ok { @@ -364,6 +371,14 @@ func (s *DBSchema) updateSchemaOTMT( return nil } +func (s *DBSchema) GetTableNames() []string { + var names []string + for name, _ := range s.t { + names = append(names, name) + } + return names +} + func (s *DBSchema) GetTable(table string) (*DBTableInfo, error) { t, ok := s.t[table] if !ok { diff --git a/go.mod b/go.mod index ac6658d..7e70b30 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b github.com/brianvoe/gofakeit/v5 v5.2.0 github.com/cespare/xxhash/v2 v2.1.1 + github.com/chirino/graphql v0.0.0-20200419184546-f015b9dab85d github.com/daaku/go.zipexe v1.0.1 // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dlclark/regexp2 v1.2.0 // indirect @@ -32,9 +33,10 @@ require ( github.com/valyala/fasttemplate v1.1.0 go.uber.org/zap v1.14.1 golang.org/x/crypto v0.0.0-20200414173820-0848c9571904 + golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 // indirect - golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508 // indirect golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/ini.v1 v1.55.0 // indirect ) diff --git a/go.sum b/go.sum index 85a8efa..7f74369 100644 --- a/go.sum +++ b/go.sum @@ -25,9 +25,13 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chirino/graphql v0.0.0-20200419184546-f015b9dab85d h1:JnYHwwRhFmQ8DeyfqmIrzpkkxnZ+iT5V1CUd3Linin0= +github.com/chirino/graphql v0.0.0-20200419184546-f015b9dab85d/go.mod h1:+34LPrbHFfKVDPsNfi445UArMEjbeTlCm7C+OpdC7IU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -51,6 +55,7 @@ github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dop251/goja v0.0.0-20200414142002-77e84ffb8c65 h1:Nud597JuGCF/MScrb6NNVDRgmuk8X7w3pFc5GvSsm5E= github.com/dop251/goja v0.0.0-20200414142002-77e84ffb8c65/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/friendsofgo/graphiql v0.2.2/go.mod h1:8Y2kZ36AoTGWs78+VRpvATyt3LJBx0SZXmay80ZTRWo= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= @@ -83,6 +88,7 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGa github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosimple/slug v1.9.0 h1:r5vDcYrFz9BmfIAMC829un9hq7hKM4cHUrsv36LbEqs= github.com/gosimple/slug v1.9.0/go.mod h1:AMZ+sOVe65uByN3kgEyf9WEBKBCSS+dJjMX9x4vDJbg= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -181,6 +187,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI= @@ -213,9 +221,13 @@ github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/segmentio/ksuid v1.0.2 h1:9yBfKyw4ECGTdALaF09Snw3sLJmYIX6AbPJrAy6MrDc= +github.com/segmentio/ksuid v1.0.2/go.mod h1:BXuJDr2byAiHuQaQtSKoXh1J0YmUDurywOXgB2w+OSU= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -260,6 +272,12 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/uber-go/atomic v1.3.2 h1:Azu9lPBWRNKzYXSIwRfgRuDuS0YKsK4NFhiQv98gkxo= +github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/uber/jaeger-client-go v2.14.1-0.20180928181052-40fb3b2c4120+incompatible h1:Dw0AFQs6RGO8RxMPGP2LknN/VtHolVH82P9PP0Ni+9w= +github.com/uber/jaeger-client-go v2.14.1-0.20180928181052-40fb3b2c4120+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v1.5.0 h1:OHbgr8l656Ub3Fw5k9SWnBfIEwvoHQ+W2y+Aa9D1Uyo= +github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -290,6 +308,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904 h1:bXoxMPcSLOq08zI3/c5dEBT6lE4eh+jOh886GHrn6V8= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -298,6 +317,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -308,6 +328,8 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -328,6 +350,7 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= @@ -346,12 +369,13 @@ golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508 h1:0FYNp0PF9kFm/ZUrvcJiQ12IUJJG7iAc6Cu01wbKrbU= -golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200128220307-520188d60f50 h1:0qnG0gwzB6QPiLDow10WJDdB38c+hQ7ArxO26Qc1boM= +golang.org/x/tools v0.0.0-20200128220307-520188d60f50/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -363,6 +387,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= diff --git a/internal/serv/http.go b/internal/serv/http.go index 8879d48..54afef9 100644 --- a/internal/serv/http.go +++ b/internal/serv/http.go @@ -6,7 +6,6 @@ import ( "io" "io/ioutil" "net/http" - "strings" "github.com/dosco/super-graph/core" "github.com/dosco/super-graph/internal/serv/internal/auth" @@ -75,11 +74,6 @@ func apiV1(w http.ResponseWriter, r *http.Request) { return } - if strings.EqualFold(req.OpName, introspectionQuery) { - introspect(w) - return - } - res, err := sg.GraphQL(ct, req.Query, req.Vars) if logLevel >= LogLevelDebug { diff --git a/internal/serv/rice-box.go b/internal/serv/rice-box.go index 4540e84..7435f77 100644 --- a/internal/serv/rice-box.go +++ b/internal/serv/rice-box.go @@ -317,11 +317,11 @@ func init() { "static/media": dirr, }, Files: map[string]*embedded.EmbeddedFile{ - "asset-manifest.json": file9, - "favicon.ico": filea, - "index.html": fileb, - "manifest.json": filec, - "precache-manifest.ac47d060293cf05e2bbe249faba24591.js": filed, + "asset-manifest.json": file9, + "favicon.ico": filea, + "index.html": fileb, + "manifest.json": filec, + "precache-manifest.ac47d060293cf05e2bbe249faba24591.js": filed, "service-worker.js": filee, "static/css/main.c6b5c55c.chunk.css": fileh, "static/css/main.c6b5c55c.chunk.css.map": filei,