feat: integrate restcountries api
This commit is contained in:
@@ -0,0 +1,57 @@
|
|||||||
|
package geodata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FetchLive() (TimezoneMap, error) {
|
||||||
|
client := http.Client{Timeout: 10 * time.Second}
|
||||||
|
|
||||||
|
// from: https://restcountries.com
|
||||||
|
url := "https://restcountries.com/v3.1/all?fields=name,population,timezones"
|
||||||
|
|
||||||
|
resp, err := client.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to fetch country data")
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
return nil, fmt.Errorf("failed to fetch country data")
|
||||||
|
}
|
||||||
|
|
||||||
|
var apidData []countryApiReponse
|
||||||
|
if err := json.NewDecoder(resp.Body).Decode(&apidData); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to fetch ")
|
||||||
|
}
|
||||||
|
|
||||||
|
return buildTzMap(apidData), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildTzMap(data []countryApiReponse) TimezoneMap {
|
||||||
|
tzMap := make(TimezoneMap)
|
||||||
|
|
||||||
|
for _, countryRaw := range data {
|
||||||
|
country := Country{
|
||||||
|
Name: countryRaw.Name.Common,
|
||||||
|
Population: countryRaw.Population,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rawTZ := range countryRaw.Timezones {
|
||||||
|
rawTZ = strings.TrimPrefix(rawTZ, "UTC")
|
||||||
|
rawTZ = strings.ReplaceAll(rawTZ, ":", "")
|
||||||
|
|
||||||
|
if rawTZ == "" {
|
||||||
|
rawTZ = "+0000" // api quirk
|
||||||
|
}
|
||||||
|
|
||||||
|
tzMap[rawTZ] = append(tzMap[rawTZ], country)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tzMap
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package geodata
|
||||||
|
|
||||||
|
// Country info exposed to other packages
|
||||||
|
type Country struct {
|
||||||
|
Name string
|
||||||
|
Population int64
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timezone to Country lookups
|
||||||
|
type TimezoneMap map[string][]Country
|
||||||
|
|
||||||
|
// internal model for https://restcountries.com/v3.1/all?fields=name,population,timezones
|
||||||
|
type countryApiReponse struct {
|
||||||
|
Name struct {
|
||||||
|
Common string `json:"common"` // it has other fields but I don't want them
|
||||||
|
} `json:"name"`
|
||||||
|
Population int64 `json:"population"`
|
||||||
|
Timezones []string `json:"timezones"` // example: [ "UTC+00:00" ]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user