func()

in PetAdoptions/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
}