diff options
Diffstat (limited to 'pkg/nasa/apod.go')
-rw-r--r-- | pkg/nasa/apod.go | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/pkg/nasa/apod.go b/pkg/nasa/apod.go new file mode 100644 index 0000000..62eea96 --- /dev/null +++ b/pkg/nasa/apod.go @@ -0,0 +1,109 @@ +// Copyright (c) 2020, Andinus <andinus@inventati.org> + +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. + +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +package nasa + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "math/rand" + "net/http" + "regexp" + "time" +) + +// APOD holds responses +type APOD struct { + Copyright string `json:"copyright"` + Date string `json:"date"` + Explanation string `json:"explanation"` + HDURL string `json:"hdurl"` + MediaType string `json:"media_type"` + ServiceVersion string `json:"service_version"` + Title string `json:"title"` + URL string `json:"url"` + + Code int `json:"code"` + Msg string `json:"msg"` +} + +// RandDate returns a random date between 1995-06-16 & today +func RandDate() string { + var ( + min int64 + max int64 + sec int64 + delta int64 + date string + ) + min = time.Date(1995, 6, 16, 0, 0, 0, 0, time.UTC).Unix() + max = time.Now().UTC().Unix() + delta = max - min + + sec = rand.Int63n(delta) + min + date = time.Unix(sec, 0).Format("2006-01-02") + + return date +} + +// APODPath returns Astronomy Picture of the Day path +func APODPath(apodInfo map[string]string, timeout time.Duration) (APOD, error) { + var err error + apodRes := APOD{} + + // validate date + re := regexp.MustCompile("((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])") + if !re.MatchString(apodInfo["date"]) { + return apodRes, fmt.Errorf("%s does not match format 'YYYY-MM-DD'", apodInfo["date"]) + } + + client := http.Client{ + Timeout: time.Second * timeout, + } + + req, err := http.NewRequest(http.MethodGet, apodInfo["api"], nil) + if err != nil { + return apodRes, err + } + q := req.URL.Query() + q.Add("api_key", apodInfo["apiKey"]) + q.Add("date", apodInfo["date"]) + req.URL.RawQuery = q.Encode() + + res, err := client.Do(req) + + if err != nil { + fmt.Printf("Error: GET %s\n", apodInfo["api"]) + return apodRes, err + } + defer res.Body.Close() + + resBody, err := ioutil.ReadAll(res.Body) + if err != nil { + return apodRes, err + } + + err = json.Unmarshal([]byte(resBody), &apodRes) + if err != nil { + return apodRes, err + } + + if res.StatusCode != 200 { + return apodRes, fmt.Errorf("Unexpected response status code received: %d %s", + res.StatusCode, http.StatusText(res.StatusCode)) + } + + return apodRes, err +} |