mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-11 19:04:35 +00:00
127 lines
3.7 KiB
Go
127 lines
3.7 KiB
Go
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
|
|
}
|