diff --git a/go.mod b/go.mod index dd5cea9..faf163a 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/tribalwarshelp/map-generator v0.0.0-20200623143352-cc037d744be2 github.com/tribalwarshelp/shared v0.0.0-20200728103702-87e7e5f1b8fd github.com/vektah/gqlparser/v2 v2.0.1 + golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect google.golang.org/protobuf v1.25.0 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect diff --git a/go.sum b/go.sum index 1de4a71..68c2080 100644 --- a/go.sum +++ b/go.sum @@ -264,7 +264,10 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/servermap/usecase/map_usecase.go b/servermap/usecase/map_usecase.go index ac0db41..c023472 100644 --- a/servermap/usecase/map_usecase.go +++ b/servermap/usecase/map_usecase.go @@ -5,12 +5,14 @@ import ( "fmt" "strconv" "strings" + "sync" "github.com/pkg/errors" "github.com/tribalwarshelp/api/servermap" "github.com/tribalwarshelp/api/village" "github.com/tribalwarshelp/map-generator/generator" "github.com/tribalwarshelp/shared/models" + "golang.org/x/sync/errgroup" ) const ( @@ -27,6 +29,9 @@ func New(villageRepo village.Repository) servermap.Usecase { } func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersConfig) ([]*generator.Marker, error) { + var mutex sync.Mutex + g := new(errgroup.Group) + tribes := make(map[string][]int) tribeIDs := []int{} cache := make(map[int]bool) @@ -64,81 +69,102 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo markers := []*generator.Marker{} if cfg.ShowOtherPlayerVillages { - villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ - Server: cfg.Server, - Filter: &models.VillageFilter{ - PlayerFilter: &models.PlayerFilter{ - IdNEQ: append(playerIDs, 0), - TribeFilter: &models.TribeFilter{ - IdNEQ: tribeIDs, + g.Go(func() error { + villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ + Server: cfg.Server, + Filter: &models.VillageFilter{ + PlayerFilter: &models.PlayerFilter{ + IdNEQ: append(playerIDs, 0), + TribeFilter: &models.TribeFilter{ + IdNEQ: tribeIDs, + }, }, }, - }, - Count: false, - }) - if err != nil { - return nil, err - } - markers = append(markers, &generator.Marker{ - Villages: villages, - Color: defaultPlayerVillagesColor, + Count: false, + }) + if err != nil { + return err + } + mutex.Lock() + markers = append(markers, &generator.Marker{ + Villages: villages, + Color: defaultPlayerVillagesColor, + }) + mutex.Unlock() + return nil }) } if cfg.ShowBarbarianVillages { - villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ - Server: cfg.Server, - Filter: &models.VillageFilter{ - PlayerID: []int{0}, - }, - Count: false, - }) - if err != nil { - return nil, err - } - markers = append(markers, &generator.Marker{ - Villages: villages, - Color: defaultBarbarianVillagesColor, + g.Go(func() error { + villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ + Server: cfg.Server, + Filter: &models.VillageFilter{ + PlayerID: []int{0}, + }, + Count: false, + }) + if err != nil { + return err + } + mutex.Lock() + markers = append(markers, &generator.Marker{ + Villages: villages, + Color: defaultBarbarianVillagesColor, + }) + mutex.Unlock() + return nil }) } for color, tribeIDs := range tribes { - villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ - Server: cfg.Server, - Filter: &models.VillageFilter{ - PlayerFilter: &models.PlayerFilter{ - TribeID: tribeIDs, + g.Go(func() error { + villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ + Server: cfg.Server, + Filter: &models.VillageFilter{ + PlayerFilter: &models.PlayerFilter{ + TribeID: tribeIDs, + }, }, - }, - Count: false, - }) - if err != nil { - return nil, err - } - markers = append(markers, &generator.Marker{ - Villages: villages, - Color: color, + Count: false, + }) + if err != nil { + return err + } + mutex.Lock() + markers = append(markers, &generator.Marker{ + Villages: villages, + Color: color, + }) + mutex.Unlock() + return nil }) } for color, playerIDs := range players { - villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ - Server: cfg.Server, - Filter: &models.VillageFilter{ - PlayerID: playerIDs, - }, - Count: false, - }) - if err != nil { - return nil, err - } - markers = append(markers, &generator.Marker{ - Villages: villages, - Color: color, + g.Go(func() error { + villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ + Server: cfg.Server, + Filter: &models.VillageFilter{ + PlayerID: playerIDs, + }, + Count: false, + }) + if err != nil { + return err + } + mutex.Lock() + markers = append(markers, &generator.Marker{ + Villages: villages, + Color: color, + }) + mutex.Unlock() + return nil }) } - return markers, nil + err := g.Wait() + return markers, err } func parseQueryParam(str string) (int, string, error) {