-
Notifications
You must be signed in to change notification settings - Fork 70
/
Copy pathmatch_target_sequence.go
143 lines (118 loc) · 4.89 KB
/
match_target_sequence.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
package appsec
import (
"context"
"fmt"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v10/pkg/session"
validation "github.com/go-ozzo/ozzo-validation/v4"
)
type (
// The MatchTargetSequence interface supports querying and modifying the order of match targets.
MatchTargetSequence interface {
// GetMatchTargetSequence returns match targets defined in the specified security configuration version.
//
// See: https://techdocs.akamai.com/application-security/reference/get-match-targets
GetMatchTargetSequence(ctx context.Context, params GetMatchTargetSequenceRequest) (*GetMatchTargetSequenceResponse, error)
// UpdateMatchTargetSequence updates the sequence of Match Targets in a configuration version.
//
// See: https://techdocs.akamai.com/application-security/reference/put-match-targets-sequence
UpdateMatchTargetSequence(ctx context.Context, params UpdateMatchTargetSequenceRequest) (*UpdateMatchTargetSequenceResponse, error)
}
// GetMatchTargetSequenceRequest is used to retrieve the sequence of match targets for a configuration.
GetMatchTargetSequenceRequest struct {
ConfigID int `json:"configId"`
ConfigVersion int `json:"configVersion"`
Type string `json:"type"`
}
// GetMatchTargetSequenceResponse is returned from a call to GetMatchTargetSequence.
GetMatchTargetSequenceResponse struct {
TargetSequence []MatchTargetItem `json:"targetSequence"`
Type string `json:"type"`
}
// UpdateMatchTargetSequenceRequest UpdateMatchTargetSequenceRequest is used to modify an existing match target sequence.
UpdateMatchTargetSequenceRequest struct {
ConfigID int `json:"-"`
ConfigVersion int `json:"-"`
TargetSequence []MatchTargetItem `json:"targetSequence"`
Type string `json:"type"`
}
// UpdateMatchTargetSequenceResponse is returned from a call to UpdateMatchTargetSequence.
UpdateMatchTargetSequenceResponse struct {
TargetSequence []MatchTargetItem `json:"targetSequence"`
Type string `json:"type"`
}
// MatchTargetItem describes a match target and its sequence number.
MatchTargetItem struct {
Sequence int `json:"sequence"`
TargetID int `json:"targetId"`
}
)
// Validate validates a GetMatchTargetSequenceRequest.
func (v GetMatchTargetSequenceRequest) Validate() error {
return validation.Errors{
"ConfigID": validation.Validate(v.ConfigID, validation.Required),
"ConfigVersion": validation.Validate(v.ConfigVersion, validation.Required),
"Type": validation.Validate(v.Type, validation.Required),
}.Filter()
}
// Validate validates an UpdateMatchTargetSequenceRequest.
func (v UpdateMatchTargetSequenceRequest) Validate() error {
return validation.Errors{
"ConfigID": validation.Validate(v.ConfigID, validation.Required),
"ConfigVersion": validation.Validate(v.ConfigVersion, validation.Required),
"Type": validation.Validate(v.ConfigVersion, validation.Required),
}.Filter()
}
func (p *appsec) GetMatchTargetSequence(ctx context.Context, params GetMatchTargetSequenceRequest) (*GetMatchTargetSequenceResponse, error) {
logger := p.Log(ctx)
logger.Debug("GetMatchTargetSequence")
if err := params.Validate(); err != nil {
return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
}
uri := fmt.Sprintf(
"/appsec/v1/configs/%d/versions/%d/match-targets/sequence?type=%s",
params.ConfigID,
params.ConfigVersion,
params.Type,
)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, fmt.Errorf("failed to create GetMatchTargetSequence request: %w", err)
}
var result GetMatchTargetSequenceResponse
resp, err := p.Exec(req, &result)
if err != nil {
return nil, fmt.Errorf("get match target sequence request failed: %w", err)
}
defer session.CloseResponseBody(resp)
if resp.StatusCode != http.StatusOK {
return nil, p.Error(resp)
}
return &result, nil
}
func (p *appsec) UpdateMatchTargetSequence(ctx context.Context, params UpdateMatchTargetSequenceRequest) (*UpdateMatchTargetSequenceResponse, error) {
logger := p.Log(ctx)
logger.Debug("UpdateMatchTargetSequence")
if err := params.Validate(); err != nil {
return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
}
uri := fmt.Sprintf(
"/appsec/v1/configs/%d/versions/%d/match-targets/sequence",
params.ConfigID,
params.ConfigVersion,
)
req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
if err != nil {
return nil, fmt.Errorf("failed to create UpdateMatchTargetSequence request: %w", err)
}
var result UpdateMatchTargetSequenceResponse
resp, err := p.Exec(req, &result, params)
if err != nil {
return nil, fmt.Errorf("update match target sequence request failed: %w", err)
}
defer session.CloseResponseBody(resp)
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
return nil, p.Error(resp)
}
return &result, nil
}