-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathresponse_types.go
194 lines (155 loc) · 5.16 KB
/
response_types.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package incognia
import (
"errors"
"fmt"
"math"
"net/http"
"reflect"
"strings"
"time"
)
type accessToken struct {
CreatedAt int64
ExpiresIn int64 `json:"expires_in,string"`
AccessToken string `json:"access_token"`
TokenType string `json:"token_type"`
}
func (token accessToken) IsExpired() bool {
expiresAt := token.GetExpiresAt()
return time.Now().After(expiresAt)
}
func (token accessToken) GetExpiresAt() time.Time {
createdAt := token.CreatedAt
expiresIn := token.ExpiresIn
return time.Unix(createdAt+expiresIn, 0)
}
func (token accessToken) Type() string {
return token.TokenType
}
func (token accessToken) SetAuthHeader(request *http.Request) {
request.Header.Add("Authorization", fmt.Sprintf("%s %s", token.Type(), token.AccessToken))
}
type Assessment string
const (
LowRisk Assessment = "low_risk"
HighRisk Assessment = "high_risk"
UnknownRisk Assessment = "unknown_risk"
)
var (
ErrEvidenceNotFound = errors.New("evidence not found")
)
type Evidence map[string]interface{}
type Reason struct {
Code string
Source string
}
func (a Evidence) GetEvidence(evidenceName string, evidenceOut interface{}) error {
return a.getEvidenceWithPath(a, strings.Split(evidenceName, "."), evidenceOut)
}
func (a Evidence) GetEvidenceAsInt64(evidenceName string) (int64, error) {
var evidenceOut float64
if err := a.GetEvidence(evidenceName, &evidenceOut); err != nil {
return 0, err
}
for math.Mod(evidenceOut, 1) != 0 {
evidenceOut *= 10
}
return int64(evidenceOut), nil
}
func (a Evidence) getEvidenceWithPath(evidenceMap Evidence, evidencePath []string, evidenceOut interface{}) error {
if evidenceMap == nil {
return ErrEvidenceNotFound
}
if len(evidencePath) == 0 {
return ErrEvidenceNotFound
}
for len(evidencePath) > 1 {
evidenceName := evidencePath[0]
evidencePath = evidencePath[1:]
evidence, ok := evidenceMap[evidenceName]
if !ok {
return ErrEvidenceNotFound
}
evidenceSubMap, ok := evidence.(map[string]interface{})
if !ok {
return ErrEvidenceNotFound
}
evidenceMap = evidenceSubMap
}
return a.getEvidence(evidenceMap, evidencePath[0], evidenceOut)
}
func (a Evidence) getEvidence(evidenceMap map[string]interface{}, evidenceName string, evidenceOut interface{}) error {
if evidenceMap == nil {
return ErrEvidenceNotFound
}
evidence, ok := evidenceMap[evidenceName]
if !ok {
return ErrEvidenceNotFound
}
if evidence == nil {
return ErrEvidenceNotFound
}
if evidenceSlice, ok := evidence.([]interface{}); ok {
return a.setEvidenceToSlice(evidenceSlice, evidenceOut)
}
return a.setEvidenceToPointer(evidence, evidenceOut)
}
func (a Evidence) setEvidenceToPointer(evidence interface{}, evidenceOut interface{}) error {
evidenceOutReflectValue := reflect.ValueOf(evidenceOut)
if evidenceOutReflectValue.Kind() != reflect.Ptr {
return errors.New("expecting evidenceOut to be a pointer")
}
evidenceOutIndirectReflectKind := reflect.Indirect(evidenceOutReflectValue).Kind()
evidenceReflectValue := reflect.ValueOf(evidence)
evidenceReflectKind := evidenceReflectValue.Kind()
if evidenceOutIndirectReflectKind != evidenceReflectKind {
return fmt.Errorf("expecting evidenceOut to be a pointer to %s", evidenceReflectKind.String())
}
evidenceOutReflectValue.Elem().Set(evidenceReflectValue)
return nil
}
func (a Evidence) setEvidenceToSlice(evidenceSlice []interface{}, evidenceOut interface{}) error {
evidenceOutReflectValue := reflect.ValueOf(evidenceOut)
if evidenceOutReflectValue.Kind() != reflect.Ptr {
return errors.New("expecting evidenceOut to be a pointer to slice")
}
evidenceOutIndirectReflectValue := reflect.Indirect(evidenceOutReflectValue)
if evidenceOutIndirectReflectValue.Kind() != reflect.Slice {
return errors.New("expecting evidenceOut to be a pointer to slice")
}
evidenceOutElemIndirectReflectKind := evidenceOutIndirectReflectValue.Type().Elem().Kind()
if len(evidenceSlice) == 0 {
return nil
}
evidenceSliceElemKind := reflect.ValueOf(evidenceSlice[0]).Kind()
for _, e := range evidenceSlice[1:] {
if reflect.ValueOf(e).Kind() != evidenceSliceElemKind {
evidenceSliceElemKind = reflect.Interface
break
}
}
if evidenceOutElemIndirectReflectKind != evidenceSliceElemKind {
return fmt.Errorf("expecting evidenceOut to be a pointer to slice of %s", evidenceSliceElemKind.String())
}
evidenceSliceReflectValue := reflect.MakeSlice(evidenceOutIndirectReflectValue.Type(), 0, len(evidenceSlice))
for _, e := range evidenceSlice {
evidenceSliceReflectValue = reflect.Append(evidenceSliceReflectValue, reflect.ValueOf(e))
}
evidenceOutIndirectReflectValue.Set(evidenceSliceReflectValue)
return nil
}
type SignupAssessment struct {
ID string `json:"id"`
DeviceID string `json:"device_id"`
RequestID string `json:"request_id"`
RiskAssessment Assessment `json:"risk_assessment"`
Evidence Evidence `json:"evidence"`
Reasons []Reason `json:"reasons"`
}
type TransactionAssessment struct {
ID string `json:"id"`
RiskAssessment Assessment `json:"risk_assessment"`
DeviceID string `json:"device_id"`
Evidence Evidence `json:"evidence"`
Reasons []Reason `json:"reasons"`
}