mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-11 19:04:35 +00:00
Public holidays API (#212)
This commit is contained in:
126
holidays/handler/holidays.go
Normal file
126
holidays/handler/holidays.go
Normal file
@@ -0,0 +1,126 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
|
||||
"github.com/micro/micro/v3/service/config"
|
||||
"github.com/micro/micro/v3/service/errors"
|
||||
log "github.com/micro/micro/v3/service/logger"
|
||||
|
||||
pb "github.com/micro/services/holidays/proto"
|
||||
)
|
||||
|
||||
type Holidays struct {
|
||||
conf conf
|
||||
}
|
||||
|
||||
type conf struct {
|
||||
NagerHost string `json:"nager_host"`
|
||||
}
|
||||
|
||||
func New() *Holidays {
|
||||
val, err := config.Get("micro.holidays")
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to load config %s", err)
|
||||
}
|
||||
var conf conf
|
||||
if err := val.Scan(&conf); err != nil {
|
||||
log.Fatalf("Failed to load config %s", err)
|
||||
}
|
||||
if len(conf.NagerHost) == 0 {
|
||||
log.Fatalf("Nager host not configured")
|
||||
}
|
||||
return &Holidays{conf: conf}
|
||||
}
|
||||
|
||||
type nagerCountry struct {
|
||||
CountryCode string `json:"countryCode"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
func (h *Holidays) Countries(ctx context.Context, request *pb.CountriesRequest, response *pb.CountriesResponse) error {
|
||||
rsp, err := http.Get(h.conf.NagerHost + "/api/v3/AvailableCountries")
|
||||
if err != nil {
|
||||
log.Errorf("Error listing available countries %s", err)
|
||||
return errors.InternalServerError("holidays.countries", "Error retrieving country list")
|
||||
}
|
||||
defer rsp.Body.Close()
|
||||
if rsp.StatusCode != 200 {
|
||||
log.Errorf("Error listing available countries %s", rsp.Status)
|
||||
return errors.InternalServerError("holidays.countries", "Error retrieving country list")
|
||||
}
|
||||
b, err := ioutil.ReadAll(rsp.Body)
|
||||
if err != nil {
|
||||
log.Errorf("Error processing available countries %s", err)
|
||||
return errors.InternalServerError("holidays.countries", "Error retrieving country list")
|
||||
}
|
||||
var rspArr []nagerCountry
|
||||
if err := json.Unmarshal(b, &rspArr); err != nil {
|
||||
log.Errorf("Error processing available countries %s", err)
|
||||
return errors.InternalServerError("holidays.countries", "Error retrieving country list")
|
||||
}
|
||||
response.Countries = make([]*pb.Country, len(rspArr))
|
||||
for i, c := range rspArr {
|
||||
response.Countries[i] = &pb.Country{
|
||||
Code: c.CountryCode,
|
||||
Name: c.Name,
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type nagerHoliday struct {
|
||||
Date string `json:"date"`
|
||||
LocalName string `json:"localName"`
|
||||
Name string `json:"name"`
|
||||
CountryCode string `json:"countryCode"`
|
||||
Counties []string `json:"counties"`
|
||||
Types []string `json:"types"`
|
||||
}
|
||||
|
||||
func (h Holidays) List(ctx context.Context, request *pb.ListRequest, response *pb.ListResponse) error {
|
||||
if request.Year == 0 {
|
||||
return errors.BadRequest("holidays.list", "Missing year argument")
|
||||
}
|
||||
if len(request.CountryCode) == 0 {
|
||||
return errors.BadRequest("holidays.list", "Missing country code argument")
|
||||
}
|
||||
rsp, err := http.Get(fmt.Sprintf("%s/api/v3/PublicHolidays/%d/%s", h.conf.NagerHost, request.Year, request.CountryCode))
|
||||
if err != nil {
|
||||
log.Errorf("Error listing available countries %s", err)
|
||||
return errors.InternalServerError("holidays.list", "Error retrieving holidays list")
|
||||
}
|
||||
defer rsp.Body.Close()
|
||||
if rsp.StatusCode != 200 {
|
||||
log.Errorf("Error listing holidays %s", rsp.Status)
|
||||
return errors.InternalServerError("holidays.list", "Error retrieving holidays list")
|
||||
}
|
||||
b, err := ioutil.ReadAll(rsp.Body)
|
||||
if err != nil {
|
||||
log.Errorf("Error processing holidays %s", err)
|
||||
return errors.InternalServerError("holidays.countries", "Error retrieving holidays list")
|
||||
}
|
||||
var rspArr []nagerHoliday
|
||||
if err := json.Unmarshal(b, &rspArr); err != nil {
|
||||
log.Errorf("Error processing holidays %s", err)
|
||||
return errors.InternalServerError("holidays.countries", "Error retrieving holidays list")
|
||||
}
|
||||
|
||||
response.Holidays = make([]*pb.Holiday, len(rspArr))
|
||||
for i, c := range rspArr {
|
||||
response.Holidays[i] = &pb.Holiday{
|
||||
Date: c.Date,
|
||||
Name: c.Name,
|
||||
LocalName: c.LocalName,
|
||||
CountryCode: c.CountryCode,
|
||||
Regions: c.Counties,
|
||||
Types: c.Types,
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user