An implementation of GraphQL for Go / Golang

graphql CircleCI GoDoc Coverage Status Join the chat at https://gitter.im/graphql-go/graphql

An implementation of GraphQL in Go. Follows the official reference implementation graphql-js.

Supports: queries, mutations & subscriptions.

Documentation

godoc: https://pkg.go.dev/github.com/graphql-go/graphql

Getting Started

To install the library, run:

go get github.com/graphql-go/graphql

The following is a simple example which defines a schema with a single hello string-type field and a Resolve method which returns the string world. A GraphQL query is performed against this schema with the resulting output printed in JSON format.

package main

import (
	"encoding/json"
	"fmt"
	"log"

	"github.com/graphql-go/graphql"
)

func main() {
	// Schema
	fields := graphql.Fields{
		"hello": &graphql.Field{
			Type: graphql.String,
			Resolve: func(p graphql.ResolveParams) (interface{}, error) {
				return "world", nil
			},
		},
	}
	rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields}
	schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
	schema, err := graphql.NewSchema(schemaConfig)
	if err != nil {
		log.Fatalf("failed to create new schema, error: %v", err)
	}

	// Query
	query := `
		{
			hello
		}
	`
	params := graphql.Params{Schema: schema, RequestString: query}
	r := graphql.Do(params)
	if len(r.Errors) > 0 {
		log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors)
	}
	rJSON, _ := json.Marshal(r)
	fmt.Printf("%s \n", rJSON) // {"data":{"hello":"world"}}
}

For more complex examples, refer to the examples/ directory and graphql_test.go.

Third Party Libraries

Name Author Description
graphql-go-handler Hafiz Ismail Middleware to handle GraphQL queries through HTTP requests.
graphql-relay-go Hafiz Ismail Lib to construct a graphql-go server supporting react-relay.
golang-relay-starter-kit Hafiz Ismail Barebones starting point for a Relay application with Golang GraphQL server.
dataloader Nick Randall DataLoader implementation in Go.

Blog Posts

Comments
  • Subscription execution

    Subscription execution

    Adds subscription execution support and a Subscribe resolver to Field and FieldDefinition types

    Resolves https://github.com/graphql-go/graphql/issues/242

  • Resolve fields asyncronously

    Resolve fields asyncronously

    Modified executeFields to resolve each field in their own go routine.

    I suspect that this may be the intended behaviour because it is just a copy of executeFieldsSerially right now.

  • Adding extra fields to errors

    Adding extra fields to errors

    Let's say I have a graphql schema with a field that looks like this:

    fields := graphql.Fields{
            "hello": &graphql.Field{
                Type: graphql.String,
                Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                    return nil, errors.New("Whoops! An error occurred")
                },
            },
        }
    

    The result would be:

    {
      "data": {
        "test": {
          "id": null,
        }
      },
      "errors": [
        {
          "message": "Whoops! An error occurred",
          "locations": [
          ]
        }
      ]
    }
    

    What I would like to do is to be able to add extra fields to the errors object. For example:

    {
      "data": {
        "test": {
          "id": null,
        }
      },
      "errors": [
        {
          "message": "Whoops! An error occurred",
          "locations": [
          ],
          "field": "hello",
          "code": "WHOOPS_ERROR"
        }
      ]
    }
    

    It would be really cool if there's way to be able to add these extra fields into the error message when an error happens.

  • Experimental/Need feedback: Implement pluggable batching/dedup/concurrent fetch like facebook/dataloader

    Experimental/Need feedback: Implement pluggable batching/dedup/concurrent fetch like facebook/dataloader

    I have been considering how to implement the idea of facebook/dataloader with graphql in go (which address issues like #106, #132), and this PR shows the progress so far.

    This PR is mainly a demonstration on how it could work. And so far I'm happy with the idea.

    This requires some minimum changes to the graphql package (just to inject a executor with a simple interface). The real concurrency feature is implemented in the godataloader library that I wrote separately, which can be plugged into graphql.

    examples/dataloader contains an actual example, which demonstrate the following features:

    • Opt-in.
    • Concurrently loading multiple data.
    • Load duplicate requests once.
    • Batching multiple requests.
    • No unnecessary goroutines are spawn unless concurrency actually happen.
    • Synchronous programming style (without Promise-like object).

    The test might best demonstrate the behavior.

    func TestQuery(t *testing.T) {
        schema := dataloaderexample.CreateSchema()
        r := dataloaderexample.RunQuery(`{
            p1_0: post(id: "1") { id author { name }}
            p1_1: post(id: "1") { id author { name }}
            p1_2: post(id: "1") { id author { name }}
            p1_3: post(id: "1") { id author { name }}
            p1_4: post(id: "1") { id author { name }}
            p1_5: post(id: "1") { id author { name }}
            p2_1: post(id: "2") { id author { name }}
            p2_2: post(id: "2") { id author { name }}
            p2_3: post(id: "2") { id author { name }}
            p3_1: post(id: "3") { id author { name }}
            p3_2: post(id: "3") { id author { name }}
            p3_3: post(id: "3") { id author { name }}
            u1_1: user(id: "1") { name }
            u1_2: user(id: "1") { name }
            u1_3: user(id: "1") { name }
            u2_1: user(id: "3") { name }
            u2_2: user(id: "3") { name }
            u2_3: user(id: "3") { name }
        }`, schema)
        if len(r.Errors) != 0 {
            t.Error(r.Errors)
        }
        t.Error(r)
        // The above query would produce log like this:
        // 2016/07/23 23:49:31 Load post 3
        // 2016/07/23 23:49:31 Load post 1
        // 2016/07/23 23:49:31 Load post 2
        // 2016/07/23 23:49:32 Batch load users [3 1 2]
        // Notice the first level post loading is done concurrently without duplicate.
        // The user loading is also done in the same fashion, but batched fetch is used instead.
        // TODO: Make test actually verify the logged behavior.
    }
    

    This PR is not meant to be merged yet (at least the example probably doesn't fit to be part of this project because of its external dependency, unless the godataloader library is moved).

    The godataloader library is probably a little bit more complicated than one would expect. And I'm happy to explain it if anyone finds this idea interesting.

  • Concurrently resolve fields

    Concurrently resolve fields

    This PR addresses #106 and probably #119. This also depends on PR #123 and has updated with changes from that PR.

    Relevant commits specifically for this PR: (The other commits are not related to this PR)


    https://github.com/graphql-go/graphql/commit/09574d6faa9ef710320137f0fc9b1e4d02c6e2f6 Ensure rw-safety of ExecutionContext.errors which will be read/written by multiple routines/threads later

    Uses sync.RWMutex to ensure safety of ExecutionContext.errors.

    If the executor encounters errors while resolving fields (e.g. from recovering from panic or when ResolveFn returns an error), it will collect it and add to a list of errors, which will then be returned in graphql.Result.

    Since this will be done concurrently if we use go-routines to resolve fields, this has to be thread-safe.


    https://github.com/graphql-go/graphql/commit/ab3b083f9119b0aaf8c98ec716524dcf1c231780 Experimental implementation of concurrently resolving fields

    This change is contained in executeFields(...).

    For each field to be resolved, create a go-routine to resolve a field. sync.WaitGroup is used to wait for all fields to complete. This will happen for each field that has sub-fields as well.

    Given the following query:

    query Bar {
      article {
        id
        author {
          id
          name
        }
      }
      feed {
        title
        body
        author {
          id
          name
        }
      }
    }
    
      Bar ---> article ---> id
          |           |
          |            --> author ---> id
          |                      |
          |                       ---> name
          ---> feed ---> title
                    |
                    ---> body
                    |
                    ---> author ---> id
                                |
                                ---> name
    
    1. article and feed will be resolved concurrently.
    2. Within article: id and author will be resolved concurrently.
    3. Within article.author: id and name will be resolved concurrently.
    4. Within feed: title, body and author will be resolved concurrently.
    5. Within feed.author: id and name will be resolved concurrently.

    Cheers!

  • Added Custom Error Formatter

    Added Custom Error Formatter

    I added support for a custom error formatter. Sometimes you come with custom error objects that might need special parsing to add correct extensions in a generic way by object type.

    This implementation doesn't change anything to the flow if no Custom Handler is specified since it uses by default the FormatError method. However if you specify, it will run your custom function expecting a FormattedError to return.

    Just a quick example:

    func CustomFormat(err error) gqlerrors.FormattedError {
    	switch err := err.(type) {
    	case *gqlerrors.Error:
                    // My custom error object returned in the mutation / query is encapsulated as OriginalError
    		cf := CustomFormat(err.OriginalError)
    		cf.Locations = err.Locations
    		cf.Path = err.Path
    		return cf
    	case *QuantoError.ErrorObject:
                    // Here I can call my custom ErrorObject ToFormattedError that will return an FormattedError with proper extensions set.
    		return err.ToFormattedError()
    	default:
    		return gqlerrors.FormatError(err)
    	}
    }
    

    Then you can use something like:

    	// execute graphql query
    	params := graphql.Params{
    		Schema:         		*h.Schema,
    		RequestString:  		opts.Query,
    		VariableValues: 		opts.Variables,
    		OperationName:  		opts.OperationName,
    		Context:        		ctx,
    		CustomErrorFomatter: 	CustomFormat,
    	}
    	result := graphql.Do(params)
    

    And everything will work.

    I'm also opening a PR in graphql-go/handler since it also benefits in this custom handler. I will put a example there as well.

  • Subscription support

    Subscription support

    Some initial work has been done to implement subscriptions in graphql-js: https://github.com/graphql/graphql-js/pull/189

    Here's the relay discussion for getting support into relay: https://github.com/facebook/relay/issues/541

    Would love to see this subscriptions land here once they are in the reference implementation :smile:

  • Create basic example follow http://graphql.org/docs/getting-started/

    Create basic example follow http://graphql.org/docs/getting-started/

    Just port a simple example from JS into GoLang follow http://graphql.org/docs/getting-started/ I hope it will make everyone easy to start to learn about Graphql by using graphql-go and understand how to port js schema sources into Golang

  • API Improvement.

    API Improvement.

    Before releasing the first version of the lib, I think we could improve the API, meaning remove verbosity and clean-it-up to be go-idiomatic, so please do share ur thoughts on this! :+1:

    This is the basic example from the Getting Started section on README (still to merge #43):

    package main
    
    import (
        "encoding/json"
        "fmt"
        "log"
    
        "github.com/chris-ramon/graphql"
    )
    
    func main() {
        // Schema
        fields := graphql.FieldConfigMap{
            "hello": &graphql.FieldConfig{
                Type: graphql.String,
                Resolve: func(p graphql.GQLFRParams) interface{} {
                    return "world"
                },
            },
        }
        rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields}
        schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
        schema, err := graphql.NewSchema(schemaConfig)
        if err != nil {
            log.Fatalf("failed to create new schema, error: %v", err)
        }
    
        // Query
        query := `{hello}`
        params := graphql.Params{Schema: schema, RequestString: query}
        result := make(chan *graphql.Result)
        go graphql.Graphql(params, result)
        r := <-result
        if len(r.Errors) > 0 {
            log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors)
        }
    }
    

    My initial proposal is:

    package main
    
    import (
        "encoding/json"
        "fmt"
        "log"
    
        "github.com/chris-ramon/graphql"
    )
    
    func main() {
        // Schema
        helloResolve := func(p graphql.ResolveParams) interface{} {
            return "world"
        }
        fields := []graphql.Fields{
            graphql.Field{Name: "hello", Type: graphql.String, Resolve: helloResolve},
        }
        schema, err := graphql.NewSchema(Name: "RootQuery", Fields: fields)
        if err != nil {
            log.Fatalf("failed to create new schema, error: %v", err)
        }
    
        // Query
        query := `{hello}`
        result := make(chan *graphql.Result)
        go graphql.Do(schema, query, result) // Like: http.Client.Do
        r := <-result
        if len(r.Errors) > 0 {
            log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors)
        }
    }
    
  • Rally community...

    Rally community...

    Browsing around it looks like the go-graphql landscape is still in its infancy, however graphql-go seems to be one of the more referenced libs out there. I'm looking at using it in my own work and would potentially be happy to start contributing, but it would be helpful to sketch out some a bit more detailed roadmap and near-term goals so potential contributors can see what to focus on.

  • Add BindFields function tool

    Add BindFields function tool

    I've been working with graphql-go lately and realize I'm pretty lazy to create object type for every struct I had. So I made a binder/wrapper function to easily bind all fields in my struct into graphql object.

    So if you have this struct

    type Person struct {
        Name    string  `graph:"name"`
        Address string  `graph:"address"`
    }
    

    you can create person type with

    personType := graphql.NewObject(graphql.ObjectConfig{
            Name:   "Person",
            Fields: BindFields(Person{}),
        })
    

    in file util_test.go I made an example with Person struct that looked like this:

    type Person struct {
    	Human //embedded Fields
    	Name    string   `json:"name"` // standard scalar type
    	Home    Address  `json:"home"` // struct type
    	Hobbies []string `json:"hobbies"` // slice of scalar type 
    	Friends []Friend `json:"friends"` // slice of struct type
    }
    
    type Human struct {
    	Alive  bool    `json:"alive"`
    	Age    int     `json:"age"`
    	Weight float64 `json:"weight"`
    }
    
    type Friend struct {
    	Name    string `json:"name"`
    	Address string `json:"address"`
    }
    
    type Address struct {
    	Street string `json:"street"`
    	City   string `json:"city"`
    }
    

    because this function will scan through empty struct so this function cannot accept recursive type. that would make a stack-overflow error. And one more utility function which is BindArgs that can bind the args depending on provided params.

  • The code generator does not take into account naming conflicts

    The code generator does not take into account naming conflicts

    There are some examples : type VenuePlan { groundPeriods(ground: ID!):[VenuePeriod!]! } type VenuePlanGround { Periods(date: Time!):[VenuePeriod!]! } and when i run code generating in front-end side, there is the error: image YvOXogqai3

  • Create graphql schema from string

    Create graphql schema from string

    There is an option to create *graphql.Schema from string. This is my string : `type Query { greeting:String students:[Student] }

         type Student {
            id:ID!
            firstName:String
            lastName:String
            password:String
            collegeId:String
         }
    

    ` and I want to create from string *graphql.Schema

  • Cannot parse GitHub public schema v4

    Cannot parse GitHub public schema v4

    Because of following two syntax

    does not support = null

    • varName: Boolean = null

    '#' character inside string cause parser(probably lexer) broken

    • @deprecated(reason: "The ProjectV2View#order_by...")

    GitHub public schema v4

    https://docs.github.com/public/schema.docs.graphql

  • Is using graphql base on RPC instead of HTTP expectable?

    Is using graphql base on RPC instead of HTTP expectable?

    Background

    • I'm trying to use Apollo Supergraph to build the composition of microservices. Its router can automatically using defined graphql to communicate with microservices.
    • Microservice needs to be fast, we use gRPC protocol for the transport among microservices currently.
    • It would be ideal if graphql can run on a RPC server, for it would allow microservices to be fast and have other features Apollo Supergraph provides at the sametime.

    Question

    • Is using graphql base on a RPC protocol like gRPC expectable in the future?
  • Is there any example to run a simple query against an existing schema using authentication?

    Is there any example to run a simple query against an existing schema using authentication?

    Is there any example to run a simple query against an existing schema using authentication?

    Perhaps I misunderstood what is this library for. My goal is to run a simple query against my graphQL server programmatically using also a Bearer token for authentication.

    I am trying to do

    
           query := `
    query MyQuery {
      queryImage {
        id
      }
    }
    `
    	params := graphql.Params{RequestString: query}
    	r := graphql.Do(params)
    	if len(r.Errors) > 0 {
    		log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors)
    	}
    	rJSON, _ := json.Marshal(r)
    	fmt.Printf("%s \n", rJSON)
    

    The response is always empty.

  • concurrent-resolvers example is not correct

    concurrent-resolvers example is not correct

    As per https://github.com/graphql-go/graphql/issues/592 if the resolver is made as a thunk, they will be concurrent. To confirm I took the example given at https://github.com/graphql-go/graphql/blob/master/examples/concurrent-resolvers/main.go and changed QueryType to this

    // QueryType fields: `concurrentFieldFoo` and `concurrentFieldBar` are resolved
    // concurrently because they belong to the same field-level and their `Resolve`
    // function returns a function (thunk).
    var QueryType = graphql.NewObject(graphql.ObjectConfig{
    	Name: "Query",
    	Fields: graphql.Fields{
    		"concurrentFieldFoo": &graphql.Field{
    			Type: FieldFooType,
    			Resolve: func(p graphql.ResolveParams) (interface{}, error) {
    				var foo = Foo{Name: "Foo's name"}
    				fmt.Println("concurrentFieldFoo: sleeping for 5 secs...")
    				time.Sleep(5 * time.Second)
    				fmt.Println("concurrentFieldFoo: sleeping for 5 secs... done")
    				return func() (interface{}, error) {
    					return &foo, nil
    				}, nil
    			},
    		},
    		"concurrentFieldBar": &graphql.Field{
    			Type: FieldBarType,
    			Resolve: func(p graphql.ResolveParams) (interface{}, error) {
    				var foo = Bar{Name: "Bar's name"}
    				fmt.Println("concurrentFieldBar: sleeping for 5 secs...")
    				time.Sleep(5 * time.Second)
    				fmt.Println("concurrentFieldFoo: sleeping for 5 secs... done")
    				return func() (interface{}, error) {
    					return &foo, nil
    				}, nil
    			},
    		},
    	},
    })
    

    concurrentFieldFoo and concurrentFieldBar have the same logic - deviating from the sample code where there was a go routine that was created to send the data in later - where both the resolvers sleep for 5 seconds.

    In my output, I was expecting to see, the following:

    concurrentFieldFoo: sleeping for 5 secs...
    concurrentFieldBar: sleeping for 5 secs...
    concurrentFieldFoo: sleeping for 5 secs... done
    concurrentFieldFoo: sleeping for 5 secs... done
    

    But I am seeing this:

    concurrent-resolvers git:(master) ✗ go run main.go
    concurrentFieldFoo: sleeping for 5 secs...
    concurrentFieldFoo: sleeping for 5 secs... done
    concurrentFieldBar: sleeping for 5 secs...
    concurrentFieldFoo: sleeping for 5 secs... done
    {"data":{"concurrentFieldBar":{"name":"Bar's name"},"concurrentFieldFoo":{"name":"Foo's name"}}}%      
    

    This is not what I understood from https://github.com/graphql-go/graphql/pull/388 .

    What am I missing here?

    Full source attached here

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"log"
    	"time"
    
    	"github.com/graphql-go/graphql"
    )
    
    type Foo struct {
    	Name string
    }
    
    var FieldFooType = graphql.NewObject(graphql.ObjectConfig{
    	Name: "Foo",
    	Fields: graphql.Fields{
    		"name": &graphql.Field{Type: graphql.String},
    	},
    })
    
    type Bar struct {
    	Name string
    }
    
    var FieldBarType = graphql.NewObject(graphql.ObjectConfig{
    	Name: "Bar",
    	Fields: graphql.Fields{
    		"name": &graphql.Field{Type: graphql.String},
    	},
    })
    
    // QueryType fields: `concurrentFieldFoo` and `concurrentFieldBar` are resolved
    // concurrently because they belong to the same field-level and their `Resolve`
    // function returns a function (thunk).
    var QueryType = graphql.NewObject(graphql.ObjectConfig{
    	Name: "Query",
    	Fields: graphql.Fields{
    		"concurrentFieldFoo": &graphql.Field{
    			Type: FieldFooType,
    			Resolve: func(p graphql.ResolveParams) (interface{}, error) {
    				var foo = Foo{Name: "Foo's name"}
    				fmt.Println("concurrentFieldFoo: sleeping for 5 secs...")
    				time.Sleep(5 * time.Second)
    				fmt.Println("concurrentFieldFoo: sleeping for 5 secs... done")
    				return func() (interface{}, error) {
    					return &foo, nil
    				}, nil
    			},
    		},
    		"concurrentFieldBar": &graphql.Field{
    			Type: FieldBarType,
    			Resolve: func(p graphql.ResolveParams) (interface{}, error) {
    				var foo = Bar{Name: "Bar's name"}
    				fmt.Println("concurrentFieldBar: sleeping for 5 secs...")
    				time.Sleep(5 * time.Second)
    				fmt.Println("concurrentFieldFoo: sleeping for 5 secs... done")
    				return func() (interface{}, error) {
    					return &foo, nil
    				}, nil
    			},
    		},
    	},
    })
    
    func main() {
    	schema, err := graphql.NewSchema(graphql.SchemaConfig{
    		Query: QueryType,
    	})
    	if err != nil {
    		log.Fatal(err)
    	}
    	query := `
    		query {
    			concurrentFieldFoo {
    				name
    			}
    			concurrentFieldBar {
    				name
    			}
    		}
    	`
    	result := graphql.Do(graphql.Params{
    		RequestString: query,
    		Schema:        schema,
    	})
    	b, err := json.Marshal(result)
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Printf("%s", b)
    	/*
    		{
    		  "data": {
    		    "concurrentFieldBar": {
    		      "name": "Bar's name"
    		    },
    		    "concurrentFieldFoo": {
    		      "name": "Foo's name"
    		    }
    		  }
    		}
    	*/
    }
    
    
GraphQL implementation for click house in Go.
GraphQL implementation for click house in Go.

clickhouse-graphql-go GraphQL implementation for clickhouse in Go. This package stores real time streaming websocket data in clickhouse and uses Graph

Nov 20, 2022
Convert Golang Struct To GraphQL Object On The Fly

Straf Convert Golang Struct To GraphQL Object On The Fly Easily Create GraphQL Schemas Example Converting struct to GraphQL Object type UserExtra stru

Oct 26, 2022
Tools to write high performance GraphQL applications using Go/Golang.

graphql-go-tools Sponsors WunderGraph Are you looking for a GraphQL e2e data fetching solution? Supports frameworks like NextJS, type safety with gene

Dec 27, 2022
A GraphQL complete example using Golang And PostgreSQL

GraphQL with Golang A GraphQL complete example using Golang & PostgreSQL Installation Install the dependencies go get github.com/graphql-go/graphql go

Dec 6, 2022
A collection of Go packages for creating robust GraphQL APIs

api-fu api-fu (noun) (informal) Mastery of APIs. ?? Packages The top level apifu package is an opinionated library that aims to make it as easy as pos

Dec 28, 2022
graphql parser + utilities

graphql utilities for dealing with GraphQL queries in Go. This package focuses on actually creating GraphQL servers and expects you to describe your s

Dec 20, 2022
GraphQL server with a focus on ease of use
GraphQL server with a focus on ease of use

graphql-go The goal of this project is to provide full support of the GraphQL draft specification with a set of idiomatic, easy to use Go packages. Wh

Dec 31, 2022
GraphQL server with a focus on ease of use
GraphQL server with a focus on ease of use

graphql-go The goal of this project is to provide full support of the GraphQL draft specification with a set of idiomatic, easy to use Go packages. Wh

Dec 25, 2022
GQLEngine is the best productive solution for implementing a GraphQL server 🚀

GQLEngine is the best productive solution for implementing a graphql server for highest formance examples starwars: https://github.com/gqlengine/starw

Apr 24, 2022
⚡️ A Go framework for rapidly building powerful graphql services

Thunder is a Go framework for rapidly building powerful graphql servers. Thunder has support for schemas automatically generated from Go types, live q

Dec 24, 2022
go generate based graphql server library
go generate based graphql server library

gqlgen What is gqlgen? gqlgen is a Go library for building GraphQL servers without any fuss. gqlgen is based on a Schema first approach — You get to D

Dec 31, 2022
gqlanalysis makes easy to develop static analysis tools for GraphQL in Go.
gqlanalysis makes easy to develop static analysis tools for GraphQL in Go.

gqlanalysis gqlanalysis defines the interface between a modular static analysis for GraphQL in Go. gqlanalysis is inspired by go/analysis. gqlanalysis

Dec 14, 2022
Go monolith with embedded microservices including GRPC,REST,GraphQL and The Clean Architecture.
Go monolith with embedded microservices including GRPC,REST,GraphQL and The Clean Architecture.

GoArcc - Go monolith with embedded microservices including GRPC,REST, graphQL and The Clean Architecture. Description When you start writing a Go proj

Dec 21, 2022
GraphQL parser comparison in different languages

graphql-parser-bench Parsing a schema or document can be a critical part of the application, especially if you have to care about latency. This is the

Jul 10, 2022
A simple Go, GraphQL, and PostgreSQL starter template

Simple Go/GraphQL/PostgreSQL template Purpose Have a good starting point for any project that needs a graphql, go, and postgres backend. It's a very l

Jan 8, 2022
This app is an attempt towards using go lang with graphql data fetch in react front end.

go_movies _A React js + GraphQL supported with backend in GoLang. This app is an attempt towards using go lang with graphql data fetch in react front

Dec 7, 2021
proof-of-concept minimal GraphQL service for LTV

LTV GraphQL Proof-of-Concept This is a barebones proof-of-concept of a possible GraphQL implementation that interacts with Core. It includes a few ver

Jan 4, 2022
Learn GraphQL with THE IDOLM@STER SHINY COLORS.

faaaar Learn GraphQL with THE IDOLM@STER SHINY COLORS. Getting Started The following is a simple example which get information about 20-year-old idols

Dec 11, 2022
A simple (yet effective) GraphQL to HTTP / REST router

ReGraphQL A simple (yet effective) GraphQL to REST / HTTP router. ReGraphQL helps you expose your GraphQL queries / mutations as REST / HTTP endpoints

Dec 12, 2022