github.com/Kartograf/gqlgen@v0.7.2/example/dataloader/resolvers.go (about) 1 //go:generate gorunpkg github.com/99designs/gqlgen 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 func (r *queryResolver) Torture1d(ctx context.Context, customerIds []int) ([]Customer, error) { 69 result := make([]Customer, len(customerIds)) 70 for i, id := range customerIds { 71 result[i] = Customer{ID: id, Name: fmt.Sprintf("%d", i), AddressID: rand.Int() % 10} 72 } 73 return result, nil 74 } 75 76 // this method is here to test code generation of nested arrays 77 func (r *queryResolver) Torture2d(ctx context.Context, customerIds [][]int) ([][]Customer, error) { 78 result := make([][]Customer, len(customerIds)) 79 for i := range customerIds { 80 inner := make([]Customer, len(customerIds[i])) 81 for j := range customerIds[i] { 82 inner[j] = Customer{ID: customerIds[i][j], Name: fmt.Sprintf("%d %d", i, j), AddressID: rand.Int() % 10} 83 } 84 result[i] = inner 85 } 86 return result, nil 87 }