|
|
package loaders
import ( "context" "git.aiterp.net/rpdata/api/models" "git.aiterp.net/rpdata/api/repositories" "time" )
//go:generate go run github.com/vektah/dataloaden CharacterLoader string *git.aiterp.net/rpdata/api/models.Character
//go:generate go run github.com/vektah/dataloaden ChannelLoader string *git.aiterp.net/rpdata/api/models.Channel
// CharacterLoaderFromRepository creates a new CharacterLoader
func CharacterLoaderFromRepository(repo repositories.CharacterRepository) *CharacterLoader { return &CharacterLoader{ wait: time.Millisecond * 1, maxBatch: 100, fetch: func(keys []string) ([]*models.Character, []error) { timeout, cancel := context.WithTimeout(context.Background(), time.Second*15) defer cancel()
characters, err := repo.List(timeout, models.CharacterFilter{ IDs: keys, }) if err != nil { errs := make([]error, len(keys)) for i := range errs { errs[i] = err }
return nil, errs }
charMap := make(map[string]*models.Character, len(keys)) for _, character := range characters { charMap[character.ID] = character }
results := make([]*models.Character, len(keys)) errs := make([]error, len(keys))
for i, key := range keys { if character, ok := charMap[key]; ok { results[i] = character } else { errs[i] = repositories.ErrNotFound } }
return results, errs }, } }
// ChannelLoaderFromRepository creates a new CharacterLoader
func ChannelLoaderFromRepository(repo repositories.ChannelRepository) *ChannelLoader { return &ChannelLoader{ wait: time.Millisecond * 1, maxBatch: 100, fetch: func(keys []string) ([]*models.Channel, []error) { timeout, cancel := context.WithTimeout(context.Background(), time.Second*15) defer cancel()
channels, err := repo.List(timeout, models.ChannelFilter{ Names: keys, }) if err != nil { errs := make([]error, len(keys)) for i := range errs { errs[i] = err }
return nil, errs }
channelMap := make(map[string]*models.Channel, len(keys)) for _, channel := range channels { channelMap[channel.Name] = channel }
results := make([]*models.Channel, len(keys)) errs := make([]error, len(keys))
for i, key := range keys { if channel, ok := channelMap[key]; ok { results[i] = channel } else { errs[i] = repositories.ErrNotFound } }
return results, errs }, } }
|