-
Notifications
You must be signed in to change notification settings - Fork 2
/
reportsAPI.go
130 lines (114 loc) · 3.58 KB
/
reportsAPI.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
package amazonmwsapi
import (
"context"
"fmt"
"net/url"
"time"
)
const reportsAPIversion = "2009-01-01"
// ReportsAPI hold calls for downloading (order) reports
type ReportsAPI struct {
client *AmazonClient
endpoint string
}
// NewReportsAPI creates and configures new ReportsAPI object
func NewReportsAPI(cli *AmazonClient) *ReportsAPI {
api := &ReportsAPI{client: cli}
api.endpoint = api.client.Region.Endpoint + "Reports/" + reportsAPIversion
return api
}
// GetReportList calls a list of reports available for download
func (api *ReportsAPI) GetReportList() *GetReportListRequest {
return &GetReportListRequest{
amazonRequest{
client: api.client,
endpoint: api.endpoint,
params: url.Values{"Action": {"GetReportList"}, "Version": {reportsAPIversion}},
method: "POST",
},
}
}
// GetReport downloads a single report
func (api *ReportsAPI) GetReport(reportID string) *GetReportRequest {
return &GetReportRequest{
amazonRequest{
client: api.client,
endpoint: api.endpoint,
params: url.Values{"Action": {"GetReport"}, "Version": {reportsAPIversion},
"ReportId": {reportID}},
method: "POST",
},
}
}
// UpdateReportAcknowledgements downloads a single report
func (api *ReportsAPI) UpdateReportAcknowledgements(reportIDs []string) *UpdateReportAcknowledgementsRequest {
req := &UpdateReportAcknowledgementsRequest{
amazonRequest{
client: api.client,
endpoint: api.endpoint,
params: url.Values{"Action": {"UpdateReportAcknowledgements"}, "Version": {reportsAPIversion}},
method: "POST",
},
}
for i, rep := range reportIDs {
key := fmt.Sprintf("ReportIdList.Type.%d", (i + 1))
req.params.Add(key, rep)
}
return req
}
// RequestReport requests a report be prepared by amazonMWS
func (api *ReportsAPI) RequestReport(reportType string) *RequestReportRequest {
return &RequestReportRequest{
amazonRequest{
client: api.client,
endpoint: api.endpoint,
params: url.Values{"Action": {"RequestReport"}, "Version": {reportsAPIversion},
"ReportType": {reportType}},
method: "POST",
},
}
}
// GetReportRequestList calls a list of requested reports and thier status
func (api *ReportsAPI) GetReportRequestList() *GetReportRequestListRequest {
return &GetReportRequestListRequest{
amazonRequest{
client: api.client,
endpoint: api.endpoint,
params: url.Values{"Action": {"GetReportRequestList"}, "Version": {reportsAPIversion}},
method: "POST",
},
}
}
// DownloadInvReport requests an inventory report, checks report progress and downloads report to destination
func (api *ReportsAPI) DownloadInvReport(ctx context.Context, reportType string, filePath string) error {
// request product report
reqRepResp, err := api.RequestReport(reportType).Do(ctx)
if err != nil {
return err
}
// get report request list
reportReady := false
var genRepID string
for !reportReady {
repReqListResp, err := api.GetReportRequestList().
ReportRequestIDList([]string{reqRepResp.RequestReportResult.ReportRequestInfo.ReportRequestID}).
Do(ctx)
if err != nil {
return err
}
if len(repReqListResp.GetReportRequestListResult.ReportRequestInfo) == 0 ||
repReqListResp.GetReportRequestListResult.ReportRequestInfo[0].ReportProcessingStatus != "_DONE_" {
// Report not ready, try again later (strict request limit here => 15 calls)
time.Sleep(4 * time.Second)
continue
}
reportReady = true
genRepID = repReqListResp.GetReportRequestListResult.ReportRequestInfo[0].GeneratedReportID
}
// Download generated report
err = api.GetReport(genRepID).Download(ctx, filePath)
if err != nil {
return err
}
return nil
}