github.com/mailgun/mailgun-go/v3@v3.6.4/exports.go (about) 1 package mailgun 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 ) 9 10 type ExportList struct { 11 Items []Export `json:"items"` 12 } 13 14 type Export struct { 15 ID string `json:"id"` 16 Status string `json:"status"` 17 URL string `json:"url"` 18 } 19 20 // Create an export based on the URL given 21 func (mg *MailgunImpl) CreateExport(ctx context.Context, url string) error { 22 r := newHTTPRequest(generatePublicApiUrl(mg, exportsEndpoint)) 23 r.setClient(mg.Client()) 24 r.setBasicAuth(basicAuthUser, mg.APIKey()) 25 26 payload := newUrlEncodedPayload() 27 payload.addValue("url", url) 28 _, err := makePostRequest(ctx, r, payload) 29 return err 30 } 31 32 // List all exports created within the past 24 hours 33 func (mg *MailgunImpl) ListExports(ctx context.Context, url string) ([]Export, error) { 34 r := newHTTPRequest(generatePublicApiUrl(mg, exportsEndpoint)) 35 r.setClient(mg.Client()) 36 if url != "" { 37 r.addParameter("url", url) 38 } 39 r.setBasicAuth(basicAuthUser, mg.APIKey()) 40 41 var resp ExportList 42 if err := getResponseFromJSON(ctx, r, &resp); err != nil { 43 return nil, err 44 } 45 46 var result []Export 47 for _, item := range resp.Items { 48 result = append(result, Export(item)) 49 } 50 return result, nil 51 } 52 53 // GetExport gets an export by id 54 func (mg *MailgunImpl) GetExport(ctx context.Context, id string) (Export, error) { 55 r := newHTTPRequest(generatePublicApiUrl(mg, exportsEndpoint) + "/" + id) 56 r.setClient(mg.Client()) 57 r.setBasicAuth(basicAuthUser, mg.APIKey()) 58 var resp Export 59 err := getResponseFromJSON(ctx, r, &resp) 60 return resp, err 61 } 62 63 // Download an export by ID. This will respond with a '302 Moved' 64 // with the Location header of temporary S3 URL if it is available. 65 func (mg *MailgunImpl) GetExportLink(ctx context.Context, id string) (string, error) { 66 r := newHTTPRequest(generatePublicApiUrl(mg, exportsEndpoint) + "/" + id + "/download_url") 67 c := mg.Client() 68 69 // Ensure the client doesn't attempt to retry 70 c.CheckRedirect = func(req *http.Request, via []*http.Request) error { 71 return errors.New("redirect") 72 } 73 74 r.setClient(mg.Client()) 75 r.setBasicAuth(basicAuthUser, mg.APIKey()) 76 77 r.addHeader("User-Agent", MailgunGoUserAgent) 78 79 req, err := r.NewRequest(ctx, "GET", nil) 80 if err != nil { 81 return "", err 82 } 83 if Debug { 84 fmt.Println(r.curlString(req, nil)) 85 } 86 87 resp, err := r.Client.Do(req) 88 if err != nil { 89 if resp != nil && resp.StatusCode == http.StatusFound { 90 url, err := resp.Location() 91 if err != nil { 92 return "", fmt.Errorf("while parsing 302 redirect url: %s", err) 93 } 94 return url.String(), nil 95 } 96 return "", err 97 } 98 return "", fmt.Errorf("expected a 302 response, API returned a '%d' instead", resp.StatusCode) 99 }