/
payment-method.go
88 lines (71 loc) · 2.61 KB
/
payment-method.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package tga
import (
"encoding/json"
"fmt"
)
type PaymentMethod struct {
Id string
InternalType string
AdyenApiPayload string
DisplayValue string
SavePaymentMethod string // TODO: check what it is
PaymentProvider PaymentProvider
PaymentType PaymentType
IsPreferred bool
}
func (p PaymentMethod) String() string {
return fmt.Sprintf("%v%v, isPreferred=%v", p.PaymentType, p.DisplayValue, p.IsPreferred)
}
func NewPaymentMethodsFromPaymentMethodsResponse(responseBody []byte) ([]PaymentMethod, error) {
var parsedPaymentMethods map[string]interface{}
err := json.Unmarshal(responseBody, &parsedPaymentMethods)
if err != nil {
glog.Printf("full response: %v\n", string(responseBody))
return []PaymentMethod{}, fmt.Errorf("error from json.Unmarshal: %w", err)
}
items := parsedPaymentMethods["payment_methods"].([]interface{})
paymentMethods := make([]PaymentMethod, len(items))
for itemPos, item := range items {
parsedPaymentMethod := item.(map[string]interface{})
// Warning, it seems that most fields are optional
id, hasId := parsedPaymentMethod["identifier"]
if hasId {
paymentMethods[itemPos].Id = id.(string)
}
internalType, hasInternalType := parsedPaymentMethod["type"]
if hasInternalType {
paymentMethods[itemPos].InternalType = internalType.(string)
}
aydenApiPayload, hasAydenApiPayload := parsedPaymentMethod["adyen_api_payload"]
if hasAydenApiPayload {
paymentMethods[itemPos].AdyenApiPayload = aydenApiPayload.(string)
}
displayValue, hasDisplayValue := parsedPaymentMethod["display_value"]
if hasDisplayValue {
paymentMethods[itemPos].DisplayValue = displayValue.(string)
}
savePaymentMethod, hasSavePaymentMethod := parsedPaymentMethod["save_payment_method"]
if hasSavePaymentMethod {
paymentMethods[itemPos].SavePaymentMethod = savePaymentMethod.(string)
}
paymentProvider, hasPaymentProvider := parsedPaymentMethod["payment_provider"]
if hasPaymentProvider {
paymentMethods[itemPos].PaymentProvider, err = NewPaymentProvider(paymentProvider.(string))
if err != nil {
return paymentMethods, fmt.Errorf("error from NewPaymentProvider: %w", err)
}
}
paymentType, hasPaymentType := parsedPaymentMethod["payment_type"]
if hasPaymentType {
paymentMethods[itemPos].PaymentType, err = NewPaymentType(paymentType.(string))
if err != nil {
return paymentMethods, fmt.Errorf("error from NewPaymentType: %w", err)
}
}
isPreferred, hasIsPreferred := parsedPaymentMethod["preferred"]
if hasIsPreferred {
paymentMethods[itemPos].IsPreferred = isPreferred.(bool)
}
}
return paymentMethods, nil
}