Skip to content

Commit 6697bdc

Browse files
committed
products: implement ListProducts, ProductByID
Fixes #38. a) Implements ListProducts, which given a place (lat, lon) lists available products b) Implements ProductByID c) Cleans up authentication problems that I noticed while testing out a bunch of client methods. Added "Content-Type": "application/json" headers for PUT and POST. Exhibits: * ProductByID: ```go func Example_client_ProductByID() { client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json")) if err != nil { log.Fatal(err) } product, err := client.ProductByID("bc300c14-c30d-4d3f-afcb-19b240c16a13") if err != nil { log.Fatal(err) } fmt.Printf("The Product information: %#v\n", product) } ``` Giving ```shell The Product information: &uber.Product{UpfrontFareEnabled:true, Capacity:2, ID:"bc300c14-c30d-4d3f-afcb-19b240c16a13", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-uberpool-2.png", CashEnabled:false, Shared:true, ShortDescription:"uberPOOL", DisplayName:"POOL", Description:"Share the ride, share the cost"} ``` * ListProducts: ```go func Example_client_ListProducts() { client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json")) if err != nil { log.Fatal(err) } products, err := client.ListProducts(&uber.Place{ Latitude: 38.8971, Longitude: -77.0366, }) if err != nil { log.Fatal(err) } for i, product := range products { fmt.Printf("#%d: ID: %q Product: %#v\n", i, product.ID, product) } } ``` Produces ```shell &uber.Product{UpfrontFareEnabled:true, Capacity:2, ID:"bc300c14-c30d-4d3f-afcb-19b240c16a13", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-uberpool-2.png", CashEnabled:false, Shared:true, ShortDescription:"uberPOOL", DisplayName:"POOL", Description:"Share the ride, share the cost"} &uber.Product{UpfrontFareEnabled:true, Capacity:4, ID:"dee8691c-8b48-4637-b048-300eee72d58d", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-uberx.png", CashEnabled:false, Shared:false, ShortDescription:"uberX", DisplayName:"uberX", Description:"The low-cost Uber"} &uber.Product{UpfrontFareEnabled:true, Capacity:6, ID:"9ffa937e-7d2e-4bcf-bc2b-ffec4ef24380", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-uberxl2.png", CashEnabled:false, Shared:false, ShortDescription:"uberXL", DisplayName:"uberXL", Description:"Low-cost rides for large groups"} &uber.Product{UpfrontFareEnabled:true, Capacity:4, ID:"bc98a16f-ad72-41a3-8624-809ce654ac57", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-family.png", CashEnabled:false, Shared:false, ShortDescription:"uberX + Car Seat", DisplayName:"uberX + Car Seat", Description:"uberX + Car Seat"} &uber.Product{UpfrontFareEnabled:true, Capacity:4, ID:"a52a9012-d73e-4127-8440-f273cddfd307", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-black.png", CashEnabled:false, Shared:false, ShortDescription:"BLACK CAR", DisplayName:"UberBLACK", Description:"The Original Uber"} &uber.Product{UpfrontFareEnabled:true, Capacity:4, ID:"2a299c73-098d-47cd-b32c-825cb155f82a", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-family.png", CashEnabled:false, Shared:false, ShortDescription:"BLACK CAR + Car Seat", DisplayName:"BLACK CAR + Car Seat", Description:"BLACK CAR + Car Seat"} &uber.Product{UpfrontFareEnabled:true, Capacity:6, ID:"4e6fd14c-3866-40f1-b173-f12aeb8fbbd0", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-suv.png", CashEnabled:false, Shared:false, ShortDescription:"SUV", DisplayName:"UberSUV", Description:"Room for everyone"} &uber.Product{UpfrontFareEnabled:true, Capacity:6, ID:"74766497-b951-4eae-98c9-a67d87e2c0c4", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-family.png", CashEnabled:false, Shared:false, ShortDescription:"SUV + Car Seat", DisplayName:"SUV + Car Seat", Description:"SUV + Car Seat"} &uber.Product{UpfrontFareEnabled:false, Capacity:4, ID:"89f38d7a-d184-4054-9f2e-6b57c94143d6", PriceDetails:(*uber.PriceDetails)(0xc4201d8120), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-uberx.png", CashEnabled:false, Shared:false, ShortDescription:"Wheelchair", DisplayName:"Wheelchair", Description:"TAXI WITHOUT THE HASSLE"} &uber.Product{UpfrontFareEnabled:false, Capacity:4, ID:"f67c83fb-4668-42eb-9aa1-ab32e710c8bf", PriceDetails:(*uber.PriceDetails)(nil), ImageURL:"http://d1a3f4spazzrp4.cloudfront.net/car-types/mono/mono-taxi.png", CashEnabled:false, Shared:false, ShortDescription:"TAXI", DisplayName:"uberTAXI", Description:"Taxi without the hassle"} ```
1 parent 50f2a7c commit 6697bdc

15 files changed

Lines changed: 534 additions & 32 deletions

example_test.go

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ package uber_test
1717
import (
1818
"fmt"
1919
"log"
20+
"os"
2021

2122
"github.com/orijtech/uber/v1"
2223
)
2324

2425
func Example_client_ListPaymentMethods() {
25-
client, err := uber.NewClient()
26+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
2627
if err != nil {
2728
log.Fatal(err)
2829
}
@@ -41,7 +42,7 @@ func Example_client_ListPaymentMethods() {
4142
}
4243

4344
func Example_client_ListHistory() {
44-
client, err := uber.NewClient()
45+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
4546
if err != nil {
4647
log.Fatal(err)
4748
}
@@ -78,7 +79,7 @@ func Example_client_ListHistory() {
7879
}
7980

8081
func Example_client_ListAllMyHistory() {
81-
client, err := uber.NewClient()
82+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
8283
if err != nil {
8384
log.Fatal(err)
8485
}
@@ -110,7 +111,7 @@ func Example_client_ListAllMyHistory() {
110111
}
111112

112113
func Example_client_EstimatePrice() {
113-
client, err := uber.NewClient()
114+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
114115
if err != nil {
115116
log.Fatal(err)
116117
}
@@ -143,10 +144,12 @@ func Example_client_EstimatePrice() {
143144
cancelPaging()
144145
}
145146
}
147+
// Output:
148+
// WW
146149
}
147150

148151
func Example_client_EstimateTime() {
149-
client, err := uber.NewClient()
152+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
150153
if err != nil {
151154
log.Fatal(err)
152155
}
@@ -181,10 +184,12 @@ func Example_client_EstimateTime() {
181184
cancelPaging()
182185
}
183186
}
187+
// Output:
188+
// WW
184189
}
185190

186191
func Example_client_RetrieveMyProfile() {
187-
client, err := uber.NewClient()
192+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
188193
if err != nil {
189194
log.Fatal(err)
190195
}
@@ -198,7 +203,7 @@ func Example_client_RetrieveMyProfile() {
198203
}
199204

200205
func Example_client_ApplyPromoCode() {
201-
client, err := uber.NewClient()
206+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
202207
if err != nil {
203208
log.Fatal(err)
204209
}
@@ -226,7 +231,7 @@ func Example_client_RequestReceipt() {
226231
}
227232

228233
func Example_client_RetrieveHomeAddress() {
229-
client, err := uber.NewClient()
234+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
230235
if err != nil {
231236
log.Fatal(err)
232237
}
@@ -240,7 +245,7 @@ func Example_client_RetrieveHomeAddress() {
240245
}
241246

242247
func Example_client_RetrieveWorkAddress() {
243-
client, err := uber.NewClient()
248+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
244249
if err != nil {
245250
log.Fatal(err)
246251
}
@@ -254,7 +259,7 @@ func Example_client_RetrieveWorkAddress() {
254259
}
255260

256261
func Example_client_UpdateHomeAddress() {
257-
client, err := uber.NewClient()
262+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
258263
if err != nil {
259264
log.Fatal(err)
260265
}
@@ -271,7 +276,7 @@ func Example_client_UpdateHomeAddress() {
271276
}
272277

273278
func Example_client_UpdateWorkAddress() {
274-
client, err := uber.NewClient()
279+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
275280
if err != nil {
276281
log.Fatal(err)
277282
}
@@ -288,7 +293,7 @@ func Example_client_UpdateWorkAddress() {
288293
}
289294

290295
func Example_client_RequestMap() {
291-
client, err := uber.NewClient()
296+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
292297
if err != nil {
293298
log.Fatal(err)
294299
}
@@ -302,18 +307,18 @@ func Example_client_RequestMap() {
302307
}
303308

304309
func Example_client_OpenMap() {
305-
client, err := uber.NewClient()
310+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
306311
if err != nil {
307312
log.Fatal(err)
308313
}
309314

310-
if err := client.OpenMapForTrip("b5512127-a134-4bf4-b1ba-fe9f48f56d9d"); err != nil {
315+
if err := client.OpenMapForTrip("64561dfe-87fa-41d7-807e-f364527b11cb"); err != nil {
311316
log.Fatal(err)
312317
}
313318
}
314319

315320
func Example_client_UpfrontFare() {
316-
client, err := uber.NewClientFromOAuth2File("./testdata/.uber/credentials.json")
321+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
317322
if err != nil {
318323
log.Fatal(err)
319324
}
@@ -341,7 +346,7 @@ func Example_client_UpfrontFare() {
341346
}
342347

343348
func Example_client_RequestRide() {
344-
client, err := uber.NewClientFromOAuth2File("./testdata/.uber/credentials.json")
349+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
345350
if err != nil {
346351
log.Fatal(err)
347352
}
@@ -366,7 +371,7 @@ func Example_client_RequestRide() {
366371
}
367372

368373
func Example_client_RequestDelivery() {
369-
client, err := uber.NewClientFromOAuth2File("./testdata/.uber/credentials.json")
374+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
370375
if err != nil {
371376
log.Fatal(err)
372377
}
@@ -421,15 +426,50 @@ func Example_client_RequestDelivery() {
421426
}
422427

423428
func Example_client_CancelDelivery() {
424-
client, err := uber.NewClientFromOAuth2File("./testdata/.uber/credentials.json")
429+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
425430
if err != nil {
426431
log.Fatal(err)
427432
}
428433

429-
err := client.CancelDelivery("71a969ca-5359-4334-a7b7-5a1705869c51")
434+
err = client.CancelDelivery("71a969ca-5359-4334-a7b7-5a1705869c51")
430435
if err == nil {
431436
log.Printf("Successfully canceled that delivery!")
432437
} else {
433438
log.Printf("Failed to cancel that delivery, err: %v", err)
434439
}
435440
}
441+
442+
func Example_client_ListProducts() {
443+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
444+
if err != nil {
445+
log.Fatal(err)
446+
}
447+
448+
products, err := client.ListProducts(&uber.Place{
449+
Latitude: 38.8971,
450+
Longitude: -77.0366,
451+
})
452+
if err != nil {
453+
log.Fatal(err)
454+
}
455+
456+
for i, product := range products {
457+
fmt.Printf("#%d: ID: %q Product: %#v\n", i, product.ID, product)
458+
}
459+
// Output:
460+
// WW
461+
}
462+
463+
func Example_client_ProductByID() {
464+
client, err := uber.NewClientFromOAuth2File(os.ExpandEnv("$HOME/.uber/credentials.json"))
465+
if err != nil {
466+
log.Fatal(err)
467+
}
468+
469+
product, err := client.ProductByID("bc300c14-c30d-4d3f-afcb-19b240c16a13")
470+
if err != nil {
471+
log.Fatal(err)
472+
}
473+
474+
fmt.Printf("The Product information: %#v\n", product)
475+
}

oauth2/oauth2.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
type OAuth2AppConfig struct {
3737
ClientID string `json:"client_id"`
3838
ClientSecret string `json:"client_secret"`
39+
RedirectURL string `json:"redirect_url"`
3940
}
4041

4142
var (
@@ -195,9 +196,15 @@ func Authorize(oconfig *OAuth2AppConfig, scopes ...string) (*oauth2.Token, error
195196
AuthURL: OAuth2AuthURL,
196197
TokenURL: OAuth2TokenURL,
197198
},
199+
RedirectURL: oconfig.RedirectURL,
198200
}
199201

200-
state := fmt.Sprintf("%v%s", time.Now().Unix(), rand.Float32())
202+
srvAddr := ":8889"
203+
if config.RedirectURL == "" {
204+
config.RedirectURL = fmt.Sprintf("http://localhost%s/", srvAddr)
205+
}
206+
207+
state := fmt.Sprintf("%v%f", time.Now().Unix(), rand.Float32())
201208
urlToVisit := config.AuthCodeURL(state, oauth2.AccessTypeOffline)
202209
fmt.Printf("Please visit this URL for the auth dialog: %v\n", urlToVisit)
203210

@@ -210,8 +217,7 @@ func Authorize(oconfig *OAuth2AppConfig, scopes ...string) (*oauth2.Token, error
210217
})
211218

212219
defer close(callbackURLChan)
213-
addr := ":8889"
214-
if err := http.ListenAndServe(addr, nil); err != nil {
220+
if err := http.ListenAndServe(srvAddr, nil); err != nil {
215221
log.Fatal(err)
216222
}
217223
}()

v1/client.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ type Client struct {
4242
sandboxed bool
4343
}
4444

45+
func (c *Client) hasServerToken() bool {
46+
c.RLock()
47+
defer c.RUnlock()
48+
49+
return c.token != ""
50+
}
51+
4552
// Sandboxed if set to true, the client will send requests
4653
// to the sandboxed API endpoint.
4754
// See:
@@ -151,6 +158,13 @@ func (c *Client) doAuthAndHTTPReq(req *http.Request) ([]byte, http.Header, error
151158
return c.doHTTPReq(req)
152159
}
153160

161+
func (c *Client) doReq(req *http.Request) ([]byte, http.Header, error) {
162+
if c.hasServerToken() {
163+
req.Header.Set("Authorization", c.bearerToken())
164+
}
165+
return c.doHTTPReq(req)
166+
}
167+
154168
func (c *Client) doHTTPReq(req *http.Request) ([]byte, http.Header, error) {
155169
res, err := c.httpClient().Do(req)
156170
if err != nil {

v1/history.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (c *Client) ListHistory(threq *Pager) (thChan chan *TripThreadPage, cancelF
147147
return
148148
}
149149

150-
slurp, _, err := c.doAuthAndHTTPReq(req)
150+
slurp, _, err := c.doReq(req)
151151
if err != nil {
152152
ttp.Err = err
153153
historyChan <- ttp

v1/maps.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (c *Client) RequestMap(tripID string) (*Map, error) {
4545
return nil, err
4646
}
4747

48-
slurp, _, err := c.doAuthAndHTTPReq(req)
48+
slurp, _, err := c.doReq(req)
4949
if err != nil {
5050
return nil, err
5151
}

v1/payment.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ func (pm *PaymentMethod) PaymentMethodToString() string {
101101
return paymentMethodToString[*pm]
102102
}
103103

104+
func (pm PaymentMethod) String() string {
105+
return pm.PaymentMethodToString()
106+
}
107+
104108
func StringToPaymentMethod(str string) PaymentMethod {
105109
pm, ok := stringToPaymentMethod[str]
106110
if !ok {
@@ -138,7 +142,7 @@ func (c *Client) ListPaymentMethods() (*PaymentListing, error) {
138142
req.Header.Set("Content-Type", "application/json")
139143
req.Header.Set("Accept-Language", "en_US")
140144

141-
slurp, _, err := c.doAuthAndHTTPReq(req)
145+
slurp, _, err := c.doReq(req)
142146
if err != nil {
143147
return nil, err
144148
}

v1/places.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (c *Client) Place(placeName PlaceName) (*Place, error) {
3939
}
4040

4141
func (c *Client) doPlaceReq(req *http.Request) (*Place, error) {
42-
slurp, _, err := c.doAuthAndHTTPReq(req)
42+
slurp, _, err := c.doReq(req)
4343
if err != nil {
4444
return nil, err
4545
}
@@ -90,5 +90,6 @@ func (c *Client) UpdatePlace(pp *PlaceParams) (*Place, error) {
9090
if err != nil {
9191
return nil, err
9292
}
93+
req.Header.Set("Content-Type", "application/json")
9394
return c.doPlaceReq(req)
9495
}

v1/prices.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func (c *Client) EstimatePrice(ereq *EstimateRequest) (pagesChan chan *PriceEsti
148148
return
149149
}
150150

151-
slurp, _, err := c.doAuthAndHTTPReq(req)
151+
slurp, _, err := c.doReq(req)
152152
if err != nil {
153153
ep.Err = err
154154
estimatesPageChan <- ep
@@ -283,7 +283,8 @@ func (c *Client) UpfrontFare(esReq *EstimateRequest) (*UpfrontFare, error) {
283283
if err != nil {
284284
return nil, err
285285
}
286-
slurp, _, err := c.doHTTPReq(req)
286+
req.Header.Set("Content-Type", "application/json")
287+
slurp, _, err := c.doReq(req)
287288
if err != nil {
288289
return nil, err
289290
}

0 commit comments

Comments
 (0)