From 752265ec3b7c35e510b0e6940c8ab3229e721316 Mon Sep 17 00:00:00 2001 From: Andreas Magnarson Nypan <andrenyp@stud.ntnu.no> Date: Fri, 7 Mar 2025 13:09:41 +0000 Subject: [PATCH] Upload New File --- utils/api_fetch.go | 183 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 utils/api_fetch.go diff --git a/utils/api_fetch.go b/utils/api_fetch.go new file mode 100644 index 0000000..74b3240 --- /dev/null +++ b/utils/api_fetch.go @@ -0,0 +1,183 @@ +package utils + +import ( + "CountryAPI/models" + "encoding/json" + "fmt" + "log" + "math" + "net/http" + "strings" +) + +// fetching the country data using the alpha code to find the my country +func FetchCountryData(countryCode string) (models.CountryInfoStruct, error) { + url := "http://129.241.150.113:8080/v3.1/alpha/" + countryCode + r, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + fmt.Errorf("Error in creating request:", err.Error()) + } + + client := &http.Client{} + res, err := client.Do(r) + if err != nil { + fmt.Errorf("Error in response:", err.Error()) + } + + decoder := json.NewDecoder(res.Body) + var countryAPI []map[string]any + if err := decoder.Decode(&countryAPI); err != nil { + log.Fatal(err) + } + country := countryAPI[0] + //countryname + name := "" + if nameData, ok := country["name"].(map[string]any); ok { + name, _ = nameData["common"].(string) + } + //continent + var continents []string // for all the arrays with strings i do this to extract my strings + if continentData, ok := country["continents"].([]any); ok { + for _, v := range continentData { + if con, ok := v.(string); ok { + continents = append(continents, con) + } + } + } + // population + population := int(country["population"].(float64)) + + var languages []string + if langList, ok := country["languages"].(map[string]any); ok { + for _, v := range langList { + if lan, ok := v.(string); ok { + languages = append(languages, lan) + } + } + } + //borders + var borders []string + if borderData, ok := country["borders"].([]any); ok { + for _, v := range borderData { + if bor, ok := v.(string); ok { + borders = append(borders, bor) + } + } + } + //flag + var flag string + if flagData, ok := country["flags"].(map[string]any); ok { + flag, _ = flagData["png"].(string) + } + //capital + var capital string + if capitalData, ok := country["capital"].([]any); ok && len(capitalData) > 0 { + if cap, ok := capitalData[0].(string); ok { + capital = cap + } + } + + return models.CountryInfoStruct{ + Name: name, + Continents: continents, + Population: population, + Languages: languages, + Borders: borders, + Flag: flag, + Capital: capital, + }, nil +} + +// fetching cities +func FetchCities(countryName string) ([]string, error) { + url := "http://129.241.150.113:3500/api/v0.1/countries/cities" + rb := `{"country":"` + countryName + `"}` + + r, err := http.NewRequest(http.MethodPost, url, strings.NewReader(rb)) + if err != nil { + fmt.Errorf("Error in creating request:", err.Error()) + } + r.Header.Set("Content-Type", "application/json") + + client := &http.Client{} + res, err := client.Do(r) + if err != nil { + fmt.Errorf("Error in creating response:", err.Error()) + } + + var citiesData struct { + Data []string `json:"data"` + } + if err := json.NewDecoder(res.Body).Decode(&citiesData); err != nil { + log.Fatal(err) + } + + return citiesData.Data, nil +} + +// fetching population data +func FetchPopulationData(countryCode string, startYear, endYear int) (map[string]any, error) { + //Using fetchcountrydata to find the country name cus cant use iso2 directrly to look at population stats + countryData, err := FetchCountryData(countryCode) + if err != nil { + return nil, fmt.Errorf("error fetching country name:", err) + } + countryName := countryData.Name + + url := "http://129.241.150.113:3500/api/v0.1/countries/population" + rb := `{"country":"` + countryName + `"}` + + r, err := http.NewRequest(http.MethodPost, url, strings.NewReader(rb)) + if err != nil { + return nil, fmt.Errorf("error creating request:", err) + } + r.Header.Set("Content-Type", "application/json") + + client := &http.Client{} + res, err := client.Do(r) + if err != nil { + return nil, fmt.Errorf("error creating response:", err) + } + //i did the whole because of alot error checking previously + var popData struct { + Error bool `json:"error"` + Msg string `json:"msg"` + Data struct { + Country string `json:"country"` + Code string `json:"code"` + Iso3 string `json:"iso3"` + PopulationCounts []struct { + Year int `json:"year"` + Value int `json:"value"` + } `json:"populationCounts"` + } `json:"data"` + } + + if err := json.NewDecoder(res.Body).Decode(&popData); err != nil { + return nil, fmt.Errorf("error decoding JSON: %w", err) + } + + var filteredValues []map[string]int + var totalPopulation, count int + + for _, record := range popData.Data.PopulationCounts { + if (startYear == 0 || record.Year >= startYear) && (endYear == 0 || record.Year <= endYear) { + filteredValues = append(filteredValues, map[string]int{ + "year": record.Year, + "value": record.Value, + }) + totalPopulation += record.Value + count++ + } + } + + meanPopulation := 0 + if count > 0 { + meanPopulation = int(math.Round(float64(totalPopulation) / float64(count))) // findding the means + } + + return map[string]interface{}{ + "mean": meanPopulation, + "values": filteredValues, + }, nil +} -- GitLab