Skip to content

Instantly share code, notes, and snippets.

View fwojciec's full-sized avatar

Filip Wojciechowski fwojciec

View GitHub Profile
@fwojciec
fwojciec / dataloaders.go
Created January 20, 2020 16:11
gqlserver2: dataloaders10
func newAgentByAuthorID(ctx context.Context, repo pg.Repository) *AgentLoader {
return NewAgentLoader(AgentLoaderConfig{
MaxBatch: 100,
Wait: 5 * time.Millisecond,
Fetch: func(authorIDs []int64) ([]*pg.Agent, []error) {
// db query
res, err := repo.ListAgentsByAuthorIDs(ctx, authorIDs)
if err != nil {
return nil, []error{err}
}
@fwojciec
fwojciec / dataloaders.go
Created January 20, 2020 16:11
gqlserver2: dataloaders9
// Loaders holds references to the individual dataloaders.
type Loaders struct {
AgentByAuthorID *AgentLoader
}
@fwojciec
fwojciec / agentloader_gen.go
Created January 20, 2020 16:03
gqlserver2: dataloaders8
// AgentLoaderConfig captures the config to create a new AgentLoader
type AgentLoaderConfig struct {
// Fetch is a method that provides the data for the loader
Fetch func(keys []int64) ([]*pg.Agent, []error)
// Wait is how long wait before sending a batch
Wait time.Duration
// MaxBatch will limit the maximum number of keys to send in one batch, 0 = not limit
MaxBatch int
@fwojciec
fwojciec / dataloaders.go
Created January 20, 2020 16:02
gqlserver2: dataloaders7
package dataloaders
//go:generate go run github.com/vektah/dataloaden AgentLoader int64 *github.com/[username]/gqlgen-sqlc-example/pg.Agent
@fwojciec
fwojciec / main.go
Created January 20, 2020 16:01
gqlserver2: dataloaders6
package main
import (
"fmt"
"net/http"
"os"
"github.com/[username]/gqlgen-sqlc-example/dataloaders" // update the username
"github.com/[username]/gqlgen-sqlc-example/gqlgen" // update the username
"github.com/[username]/gqlgen-sqlc-example/pg" // update the username
@fwojciec
fwojciec / gqlgen.go
Created January 20, 2020 16:00
gqlserver2: dataloaders5
// NewHandler returns a new graphql endpoint handler.
func NewHandler(repo pg.Repository, dl dataloaders.Retriever) http.Handler {
return handler.GraphQL(NewExecutableSchema(Config{
Resolvers: &Resolver{
Repository: repo,
DataLoaders: dl,
},
}))
}
@fwojciec
fwojciec / resolvers.go
Created January 20, 2020 15:59
gqlserver2: dataloaders4
// Resolver connects individual resolvers with the datalayer.
type Resolver struct {
Repository pg.Repository
DataLoaders dataloaders.Retriever
}
@fwojciec
fwojciec / dataloaders.go
Created January 20, 2020 15:58
gqlserver2: dataloaders3
// Retriever retrieves dataloaders from the request context.
type Retriever interface {
Retrieve(context.Context) *Loaders
}
type retriever struct {
key contextKey
}
func (r *retriever) Retrieve(ctx context.Context) *Loaders {
@fwojciec
fwojciec / middleware.go
Created January 20, 2020 15:57
gqlserver2: dataloaders2
package dataloaders
import (
"context"
"net/http"
"github.com/[username]/gqlgen-sqlc-example/pg" // update the username
)
// Middleware stores Loaders as a request-scoped context value.
@fwojciec
fwojciec / dataloaders.go
Created January 20, 2020 15:56
gqlserver2: dataloaders1
package dataloaders
import (
"context"
"github.com/[username]/gqlgen-sqlc-example/pg" // update the username
)
type contextKey string