github.com/animeshon/gqlgen@v0.13.1-0.20210304133704-3a770431bb6d/example/dataloader/resolvers.go (about) 1 //go:generate go run ../../testdata/gqlgen.go 2 3 package dataloader 4 5 import ( 6 "context" 7 "fmt" 8 "math/rand" 9 "time" 10 ) 11 12 type Customer struct { 13 ID int `json:"id"` 14 Name string `json:"name"` 15 AddressID int 16 } 17 type Order struct { 18 ID int `json:"id"` 19 Date time.Time `json:"date"` 20 Amount float64 `json:"amount"` 21 } 22 23 type Resolver struct{} 24 25 func (r *Resolver) Customer() CustomerResolver { 26 return &customerResolver{r} 27 } 28 29 func (r *Resolver) Order() OrderResolver { 30 return &orderResolver{r} 31 } 32 33 func (r *Resolver) Query() QueryResolver { 34 return &queryResolver{r} 35 } 36 37 type customerResolver struct{ *Resolver } 38 39 func (r *customerResolver) Address(ctx context.Context, obj *Customer) (*Address, error) { 40 return ctxLoaders(ctx).addressByID.Load(obj.AddressID) 41 } 42 43 func (r *customerResolver) Orders(ctx context.Context, obj *Customer) ([]*Order, error) { 44 return ctxLoaders(ctx).ordersByCustomer.Load(obj.ID) 45 } 46 47 type orderResolver struct{ *Resolver } 48 49 func (r *orderResolver) Items(ctx context.Context, obj *Order) ([]*Item, error) { 50 return ctxLoaders(ctx).itemsByOrder.Load(obj.ID) 51 } 52 53 type queryResolver struct{ *Resolver } 54 55 func (r *queryResolver) Customers(ctx context.Context) ([]*Customer, error) { 56 fmt.Println("SELECT * FROM customer") 57 58 time.Sleep(5 * time.Millisecond) 59 60 return []*Customer{ 61 {ID: 1, Name: "Bob", AddressID: 1}, 62 {ID: 2, Name: "Alice", AddressID: 3}, 63 {ID: 3, Name: "Eve", AddressID: 4}, 64 }, nil 65 } 66 67 // this method is here to test code generation of nested arrays 68 // nolint: gosec 69 func (r *queryResolver) Torture1d(ctx context.Context, customerIds []int) ([]*Customer, error) { 70 result := make([]*Customer, len(customerIds)) 71 for i, id := range customerIds { 72 result[i] = &Customer{ID: id, Name: fmt.Sprintf("%d", i), AddressID: rand.Int() % 10} 73 } 74 return result, nil 75 } 76 77 // this method is here to test code generation of nested arrays 78 // nolint: gosec 79 func (r *queryResolver) Torture2d(ctx context.Context, customerIds [][]int) ([][]*Customer, error) { 80 result := make([][]*Customer, len(customerIds)) 81 for i := range customerIds { 82 inner := make([]*Customer, len(customerIds[i])) 83 for j := range customerIds[i] { 84 inner[j] = &Customer{ID: customerIds[i][j], Name: fmt.Sprintf("%d %d", i, j), AddressID: rand.Int() % 10} 85 } 86 result[i] = inner 87 } 88 return result, nil 89 }