This repository has been archived on 2022-09-04. You can view files and clone it, but cannot push or open issues or pull requests.
api/graphql/dataloader/data_loader.go

65 lines
1.4 KiB
Go
Raw Normal View History

package dataloader
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"time"
"github.com/tribalwarshelp/api/player"
"github.com/tribalwarshelp/api/tribe"
2020-11-06 19:23:12 +00:00
"github.com/tribalwarshelp/api/version"
"github.com/tribalwarshelp/api/village"
)
const (
wait = 2 * time.Millisecond
maxBatch = 200
)
type DataLoader struct {
2020-12-25 11:42:46 +00:00
VersionByCode *VersionLoader
}
type Config struct {
2020-11-06 19:23:12 +00:00
PlayerRepo player.Repository
TribeRepo tribe.Repository
VillageRepo village.Repository
VersionRepo version.Repository
}
func NewDataLoader(cfg Config) *DataLoader {
return &DataLoader{
2020-12-25 11:42:46 +00:00
VersionByCode: &VersionLoader{
wait: wait,
maxBatch: maxBatch,
fetch: func(keys []string) ([]*twmodel.Version, []error) {
2021-05-05 17:58:45 +00:00
var codes []twmodel.VersionCode
2020-11-06 19:23:12 +00:00
for _, code := range keys {
codes = append(codes, twmodel.VersionCode(code))
}
2020-11-06 19:23:12 +00:00
versions, _, err := cfg.VersionRepo.Fetch(context.Background(), version.FetchConfig{
Filter: &twmodel.VersionFilter{
2020-11-06 19:23:12 +00:00
Code: codes,
},
Select: true,
})
if err != nil {
return nil, []error{err}
}
versionByCode := make(map[twmodel.VersionCode]*twmodel.Version)
for _, v := range versions {
versionByCode[v.Code] = v
}
inOrder := make([]*twmodel.Version, len(keys))
2020-11-06 19:23:12 +00:00
for i, code := range codes {
inOrder[i] = versionByCode[code]
}
return inOrder, nil
},
},
}
}