in PetAdoptions/cdk/pet_stack/resources/microservices/payforadoption-go/payforadoption/repository.go [85:155]
func (r *repo) UpdateAvailability(ctx context.Context, a Adoption) error {
logger := log.With(r.logger, "method", "UpdateAvailability")
subsegCtx, subseg := xray.BeginSubsegment(ctx, "UpdateAvailability")
defer subseg.Close(nil)
errs := make(chan error)
var wg sync.WaitGroup
wg.Add(2)
// using xray as a wrapper for http client
client := xray.Client(&http.Client{})
go func() {
defer wg.Done()
updateAdoptionStatusCtx, updateAdoptionStatusSeg := xray.BeginSubsegment(
subsegCtx,
"Update Adoption Status",
)
defer updateAdoptionStatusSeg.Close(nil)
body := &completeAdoptionRequest{a.PetID, a.PetType}
req, _ := sling.New().Put(r.cfg.UpdateAdoptionURL).BodyJSON(body).Request()
resp, err := client.Do(req.WithContext(updateAdoptionStatusCtx))
if err != nil {
level.Error(logger).Log("err", err)
errs <- err
return
}
defer resp.Body.Close()
if body, err := ioutil.ReadAll(resp.Body); err != nil {
level.Error(logger).Log("err", err)
errs <- err
} else {
sb := string(body)
logger.Log(sb)
}
}()
go func() {
defer wg.Done()
availabilityCtx, availabilitySeg := xray.BeginSubsegment(
subsegCtx,
"Invoking Availability API",
)
defer availabilitySeg.Close(nil)
req, _ := http.NewRequest("GET", "https://amazon.com", nil)
_, err := client.Do(req.WithContext(availabilityCtx))
if err != nil {
level.Error(logger).Log("err", err)
errs <- err
}
}()
go func() {
wg.Wait()
close(errs)
}()
// return the first error
for err := range errs {
if err != nil {
return err
}
}
return nil
}