func (w *wrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { if !w.whitelist[req.Service()] { return errors.Forbidden("go.micro.rpc", "forbidden") } return w.Client.Call(ctx, req, rsp, opts...) }
func (s *Hotel) Rates(ctx context.Context, req *hotel.Request, rsp *hotel.Response) error { // tracing tr := trace.New("api.v1", "Hotel.Rates") defer tr.Finish() // context ctx = trace.NewContext(ctx, tr) md, ok := metadata.FromContext(ctx) if !ok { md = metadata.Metadata{} } // add a unique request id to context if traceID, err := uuid.NewV4(); err == nil { // make copy tmd := metadata.Metadata{} for k, v := range md { tmd[k] = v } tmd["traceID"] = traceID.String() tmd["fromName"] = "api.v1" ctx = metadata.NewContext(ctx, tmd) } // token from request headers token, err := getToken(md) if err != nil { return merr.Forbidden("api.hotel.rates", err.Error()) } // verify token w/ auth service authClient := auth.NewAuthClient("go.micro.srv.auth", s.Client) if _, err = authClient.VerifyToken(ctx, &auth.Request{AuthToken: token}); err != nil { return merr.Unauthorized("api.hotel.rates", "Unauthorized") } // checkin and checkout date query params inDate, outDate := req.InDate, req.OutDate if inDate == "" || outDate == "" { return merr.BadRequest("api.hotel.rates", "Please specify inDate/outDate params") } // finds nearby hotels // TODO(hw): use lat/lon from request params geoClient := geo.NewGeoClient("go.micro.srv.geo", s.Client) nearby, err := geoClient.Nearby(ctx, &geo.Request{ Lat: 51.502973, Lon: -0.114723, }) if err != nil { return merr.InternalServerError("api.hotel.rates", err.Error()) } // make reqeusts for profiles and rates profileCh := getHotelProfiles(s.Client, ctx, nearby.HotelIds) rateCh := getRatePlans(s.Client, ctx, nearby.HotelIds, inDate, outDate) // wait on profiles reply profileReply := <-profileCh if err := profileReply.err; err != nil { return merr.InternalServerError("api.hotel.rates", err.Error()) } // wait on rates reply rateReply := <-rateCh if err := rateReply.err; err != nil { return merr.InternalServerError("api.hotel.rates", err.Error()) } rsp.Hotels = profileReply.hotels rsp.RatePlans = rateReply.ratePlans return nil }