From 7ab57f2ea00b4572748f0692f8ac2ca17a31024a Mon Sep 17 00:00:00 2001 From: Dan Dobos Date: Tue, 2 Nov 2021 16:32:21 +0100 Subject: [PATCH] concurrent working --- .../domain/pokemongotemplates/Provider.go | 112 ++++++++++++------ internal/domain/pokemongotemplates/Types.go | 2 +- internal/infrastructure/app/SiteHandlers.go | 2 +- 3 files changed, 76 insertions(+), 40 deletions(-) diff --git a/internal/domain/pokemongotemplates/Provider.go b/internal/domain/pokemongotemplates/Provider.go index 652ed95..661cce4 100644 --- a/internal/domain/pokemongotemplates/Provider.go +++ b/internal/domain/pokemongotemplates/Provider.go @@ -5,9 +5,10 @@ import ( "fmt" "io/ioutil" "net/http" + "sync" ) -func GetPokemons() (*[]Pokemon, error) { +func GetPokemons() (map[string]*Pokemon, error) { //get pokemon data from api resp, err := http.Get("https://pokeapi.co/api/v2/pokemon/?offset=0&limit=500") @@ -27,44 +28,79 @@ func GetPokemons() (*[]Pokemon, error) { fmt.Println(err.Error()) } - PokemonSlice := make([]Pokemon, 0) + // PokemonSlice := make([]Pokemon, 0) + + // for i := range pokemonsData.Results { + // go func() { + // indPokemon := fetchIndividualPokemons(pokemonsData.Results[i].URL) + // PokemonSlice = append(PokemonSlice, indPokemon) + // }() + // } + + PokemonMap := make(map[string]*Pokemon) + + pokemonStream := make(chan Pokemon) + + var wg sync.WaitGroup + wg.Add(len(pokemonsData.Results)) for i := range pokemonsData.Results { - resp, err := http.Get(pokemonsData.Results[i].URL) - if err != nil { - fmt.Println(err.Error()) - } - defer resp.Body.Close() - rowData, err := ioutil.ReadAll(resp.Body) - if err != nil { - fmt.Println(err.Error()) - } - - var pokemonDetails PokemonDetails - if err := json.Unmarshal(rowData, &pokemonDetails); err != nil { - fmt.Println(err.Error()) - } - - var pokeMoves string - for x := range pokemonDetails.Moves { - if x <= 3 { - pokeMoves += pokemonDetails.Moves[x].Move.Name + " " - } - } - var pokeTypes string - for z := range pokemonDetails.Types { - pokeTypes += pokemonDetails.Types[z].Type.Name + " " - } - - PokemonSlice = append(PokemonSlice, Pokemon{ - Name: pokemonDetails.Name, - Weight: pokemonDetails.Weight, - Height: pokemonDetails.Height, - Moves: pokeMoves, - Types: pokeTypes, - Image: pokemonDetails.Sprites.Other.OfficialArtwork.FrontDefault, - }) - + go func(iterator int) { + defer wg.Done() + indPokemon := fetchIndividualPokemons(pokemonsData.Results[iterator].URL) + pokemonStream <- indPokemon + }(i) } - return &PokemonSlice, nil + + for range pokemonsData.Results { + p := <-pokemonStream + PokemonMap[p.Name] = &p + } + + go func() { + wg.Wait() + close(pokemonStream) + }() + + fmt.Print(len(PokemonMap)) + + return PokemonMap, nil +} + +func fetchIndividualPokemons(pokemonURL string) Pokemon { + resp, err := http.Get(pokemonURL) + if err != nil { + fmt.Println(err.Error()) + } + defer resp.Body.Close() + rowData, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println(err.Error()) + } + + var pokemonDetails PokemonDetails + if err := json.Unmarshal(rowData, &pokemonDetails); err != nil { + fmt.Println(err.Error()) + } + + var pokeMoves string + for x := range pokemonDetails.Moves { + if x <= 3 { + pokeMoves += pokemonDetails.Moves[x].Move.Name + " " + } + } + var pokeTypes string + for z := range pokemonDetails.Types { + pokeTypes += pokemonDetails.Types[z].Type.Name + " " + } + + return Pokemon{ + Name: pokemonDetails.Name, + Weight: pokemonDetails.Weight, + Height: pokemonDetails.Height, + Moves: pokeMoves, + Types: pokeTypes, + Image: pokemonDetails.Sprites.Other.OfficialArtwork.FrontDefault, + } + } diff --git a/internal/domain/pokemongotemplates/Types.go b/internal/domain/pokemongotemplates/Types.go index a6d43be..5f4f203 100644 --- a/internal/domain/pokemongotemplates/Types.go +++ b/internal/domain/pokemongotemplates/Types.go @@ -27,7 +27,7 @@ type Pokemon struct { type PageData struct { NavigationLinks []SiteLink - Data []Pokemon + Data map[string]*Pokemon } type PokemonMove struct { diff --git a/internal/infrastructure/app/SiteHandlers.go b/internal/infrastructure/app/SiteHandlers.go index 7d27d70..e8464f2 100644 --- a/internal/infrastructure/app/SiteHandlers.go +++ b/internal/infrastructure/app/SiteHandlers.go @@ -16,7 +16,7 @@ func (s *ApplicationServer) pokemonPageHandler() func(*gin.Context) { return func(c *gin.Context) { c.HTML(http.StatusOK, "views/Pokemons.gohtml", pokemongotemplates.PageData{ NavigationLinks: pokemongotemplates.NavigationLinks, - Data: *data, + Data: data, }) } }