@@ -80,6 +80,7 @@ type Client struct {
8080 Document DocumentService
8181 Event EventService
8282 FundingSource FundingSourceService
83+ KBA KBAService
8384 MassPayment MassPaymentService
8485 OnDemandAuthorization OnDemandAuthorizationService
8586 Transfer TransferService
@@ -124,6 +125,7 @@ func NewWithHTTPClient(key, secret string, environment Environment, httpClient H
124125 c .Document = & DocumentServiceOp {c }
125126 c .Event = & EventServiceOp {c }
126127 c .FundingSource = & FundingSourceServiceOp {c }
128+ c .KBA = & KBAServiceOp {c }
127129 c .MassPayment = & MassPaymentServiceOp {c }
128130 c .OnDemandAuthorization = & OnDemandAuthorizationServiceOp {c }
129131 c .Transfer = & TransferServiceOp {c }
@@ -200,7 +202,7 @@ func (c *Client) RequestToken(ctx context.Context) error {
200202
201203 buf := bytes .NewBuffer ([]byte ("grant_type=client_credentials" ))
202204
203- req , err := http .NewRequest ( "POST" , c .BuildAPIURL ("token" ), buf )
205+ req , err := http .NewRequestWithContext ( ctx , "POST" , c .BuildAPIURL ("token" ), buf )
204206 if err != nil {
205207 return err
206208 }
@@ -210,24 +212,19 @@ func (c *Client) RequestToken(ctx context.Context) error {
210212
211213 req .SetBasicAuth (c .Key , c .Secret )
212214
213- req = req .WithContext (ctx )
214-
215215 res , err := c .HTTPClient .Do (req )
216-
217216 if err != nil {
218217 return err
219218 }
220219
221220 defer res .Body .Close ()
222221
223222 resBody , err := ioutil .ReadAll (res .Body )
224-
225223 if err != nil {
226224 return err
227225 }
228226
229227 err = json .Unmarshal (resBody , & token )
230-
231228 if err != nil {
232229 return err
233230 }
@@ -270,8 +267,7 @@ func (c *Client) Get(ctx context.Context, path string, params *url.Values, heade
270267 return err
271268 }
272269
273- req , err := http .NewRequest ("GET" , c .BuildAPIURL (path ), nil )
274-
270+ req , err := http .NewRequestWithContext (ctx , "GET" , c .BuildAPIURL (path ), nil )
275271 if err != nil {
276272 return err
277273 }
@@ -288,18 +284,14 @@ func (c *Client) Get(ctx context.Context, path string, params *url.Values, heade
288284 req .URL .RawQuery = params .Encode ()
289285 }
290286
291- req = req .WithContext (ctx )
292-
293287 res , err := c .HTTPClient .Do (req )
294-
295288 if err != nil {
296289 return err
297290 }
298291
299292 defer res .Body .Close ()
300293
301294 resBody , err := ioutil .ReadAll (res .Body )
302-
303295 if err != nil {
304296 return err
305297 }
@@ -345,16 +337,14 @@ func (c *Client) Post(ctx context.Context, path string, body interface{}, header
345337
346338 if body != nil {
347339 bodyBytes , err := json .Marshal (body )
348-
349340 if err != nil {
350341 return err
351342 }
352343
353344 bodyReader = bytes .NewReader (bodyBytes )
354345 }
355346
356- req , err := http .NewRequest ("POST" , c .BuildAPIURL (path ), bodyReader )
357-
347+ req , err := http .NewRequestWithContext (ctx , "POST" , c .BuildAPIURL (path ), bodyReader )
358348 if err != nil {
359349 return err
360350 }
@@ -368,10 +358,7 @@ func (c *Client) Post(ctx context.Context, path string, body interface{}, header
368358 req .Header .Set ("Content-Type" , "application/vnd.dwolla.v1.hal+json" )
369359 req .Header .Set ("User-Agent" , "dwolla-v2-go" )
370360
371- req = req .WithContext (ctx )
372-
373361 res , err := c .HTTPClient .Do (req )
374-
375362 if err != nil {
376363 return err
377364 }
@@ -385,7 +372,6 @@ func (c *Client) Post(ctx context.Context, path string, body interface{}, header
385372 }
386373
387374 resBody , err := ioutil .ReadAll (res .Body )
388-
389375 if err != nil {
390376 return err
391377 }
@@ -427,8 +413,9 @@ func (c *Client) Post(ctx context.Context, path string, body interface{}, header
427413// Upload performs a multipart file upload to the Dwolla API
428414func (c * Client ) Upload (ctx context.Context , path string , documentType DocumentType , fileName string , file io.Reader , container interface {}) error {
429415 var (
430- err error
431- halError HALError
416+ err error
417+ halError HALError
418+ validationError ValidationError
432419 )
433420
434421 if err = c .EnsureToken (ctx ); err != nil {
@@ -438,31 +425,26 @@ func (c *Client) Upload(ctx context.Context, path string, documentType DocumentT
438425 body := & bytes.Buffer {}
439426 writer := multipart .NewWriter (body )
440427 part , err := writer .CreateFormFile ("file" , fileName )
441-
442428 if err != nil {
443429 return err
444430 }
445431
446432 _ , err = io .Copy (part , file )
447-
448433 if err != nil {
449434 return err
450435 }
451436
452437 err = writer .WriteField ("documentType" , string (documentType ))
453-
454438 if err != nil {
455439 return err
456440 }
457441
458442 err = writer .Close ()
459-
460443 if err != nil {
461444 return err
462445 }
463446
464- req , err := http .NewRequest ("POST" , c .BuildAPIURL (path ), body )
465-
447+ req , err := http .NewRequestWithContext (ctx , "POST" , c .BuildAPIURL (path ), body )
466448 if err != nil {
467449 return err
468450 }
@@ -473,10 +455,7 @@ func (c *Client) Upload(ctx context.Context, path string, documentType DocumentT
473455 req .Header .Set ("Content-Type" , writer .FormDataContentType ())
474456 req .Header .Set ("User-Agent" , "dwolla-v2-go" )
475457
476- req = req .WithContext (ctx )
477-
478458 res , err := c .HTTPClient .Do (req )
479-
480459 if err != nil {
481460 return err
482461 }
@@ -490,7 +469,6 @@ func (c *Client) Upload(ctx context.Context, path string, documentType DocumentT
490469 }
491470
492471 resBody , err := ioutil .ReadAll (res .Body )
493-
494472 if err != nil {
495473 return err
496474 }
@@ -511,6 +489,14 @@ func (c *Client) Upload(ctx context.Context, path string, documentType DocumentT
511489 return c .Upload (ctx , path , documentType , fileName , file , container )
512490 }
513491
492+ if halError .Code == "ValidationError" {
493+ if err := json .Unmarshal (resBody , & validationError ); err != nil {
494+ return err
495+ }
496+
497+ return validationError
498+ }
499+
514500 return halError
515501 }
516502
@@ -532,8 +518,7 @@ func (c *Client) Delete(ctx context.Context, path string, params *url.Values, he
532518 return err
533519 }
534520
535- req , err := http .NewRequest ("DELETE" , c .BuildAPIURL (path ), nil )
536-
521+ req , err := http .NewRequestWithContext (ctx , "DELETE" , c .BuildAPIURL (path ), nil )
537522 if err != nil {
538523 return err
539524 }
@@ -550,10 +535,7 @@ func (c *Client) Delete(ctx context.Context, path string, params *url.Values, he
550535 req .URL .RawQuery = params .Encode ()
551536 }
552537
553- req = req .WithContext (ctx )
554-
555538 res , err := c .HTTPClient .Do (req )
556-
557539 if err != nil {
558540 return err
559541 }
@@ -562,7 +544,6 @@ func (c *Client) Delete(ctx context.Context, path string, params *url.Values, he
562544
563545 if res .StatusCode > 299 {
564546 resBody , err := ioutil .ReadAll (res .Body )
565-
566547 if err != nil {
567548 return err
568549 }
@@ -627,7 +608,7 @@ func (c *Client) CreateClientToken(ctx context.Context, action string, customer
627608
628609 var token ClientToken
629610
630- if err := c .Post (ctx , "client-tokens" , body , nil , token ); err != nil {
611+ if err := c .Post (ctx , "client-tokens" , body , nil , & token ); err != nil {
631612 return nil , err
632613 }
633614
0 commit comments