181 lines
5.4 KiB
Go
181 lines
5.4 KiB
Go
|
package mailgun
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
type Unsubscribe struct {
|
||
|
CreatedAt RFC2822Time `json:"created_at"`
|
||
|
Tags []string `json:"tags"`
|
||
|
ID string `json:"id"`
|
||
|
Address string `json:"address"`
|
||
|
}
|
||
|
|
||
|
type unsubscribesResponse struct {
|
||
|
Paging Paging `json:"paging"`
|
||
|
Items []Unsubscribe `json:"items"`
|
||
|
}
|
||
|
|
||
|
// Fetches the list of unsubscribes
|
||
|
func (mg *MailgunImpl) ListUnsubscribes(opts *ListOptions) *UnsubscribesIterator {
|
||
|
r := newHTTPRequest(generateApiUrl(mg, unsubscribesEndpoint))
|
||
|
r.setClient(mg.Client())
|
||
|
r.setBasicAuth(basicAuthUser, mg.APIKey())
|
||
|
if opts != nil {
|
||
|
if opts.Limit != 0 {
|
||
|
r.addParameter("limit", strconv.Itoa(opts.Limit))
|
||
|
}
|
||
|
}
|
||
|
url, err := r.generateUrlWithParameters()
|
||
|
return &UnsubscribesIterator{
|
||
|
mg: mg,
|
||
|
unsubscribesResponse: unsubscribesResponse{Paging: Paging{Next: url, First: url}},
|
||
|
err: err,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type UnsubscribesIterator struct {
|
||
|
unsubscribesResponse
|
||
|
mg Mailgun
|
||
|
err error
|
||
|
}
|
||
|
|
||
|
// If an error occurred during iteration `Err()` will return non nil
|
||
|
func (ci *UnsubscribesIterator) Err() error {
|
||
|
return ci.err
|
||
|
}
|
||
|
|
||
|
// Next retrieves the next page of items from the api. Returns false when there
|
||
|
// no more pages to retrieve or if there was an error. Use `.Err()` to retrieve
|
||
|
// the error
|
||
|
func (ci *UnsubscribesIterator) Next(ctx context.Context, items *[]Unsubscribe) bool {
|
||
|
if ci.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
ci.err = ci.fetch(ctx, ci.Paging.Next)
|
||
|
if ci.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
cpy := make([]Unsubscribe, len(ci.Items))
|
||
|
copy(cpy, ci.Items)
|
||
|
*items = cpy
|
||
|
if len(ci.Items) == 0 {
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// First retrieves the first page of items from the api. Returns false if there
|
||
|
// was an error. It also sets the iterator object to the first page.
|
||
|
// Use `.Err()` to retrieve the error.
|
||
|
func (ci *UnsubscribesIterator) First(ctx context.Context, items *[]Unsubscribe) bool {
|
||
|
if ci.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
ci.err = ci.fetch(ctx, ci.Paging.First)
|
||
|
if ci.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
cpy := make([]Unsubscribe, len(ci.Items))
|
||
|
copy(cpy, ci.Items)
|
||
|
*items = cpy
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// Last retrieves the last page of items from the api.
|
||
|
// Calling Last() is invalid unless you first call First() or Next()
|
||
|
// Returns false if there was an error. It also sets the iterator object
|
||
|
// to the last page. Use `.Err()` to retrieve the error.
|
||
|
func (ci *UnsubscribesIterator) Last(ctx context.Context, items *[]Unsubscribe) bool {
|
||
|
if ci.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
ci.err = ci.fetch(ctx, ci.Paging.Last)
|
||
|
if ci.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
cpy := make([]Unsubscribe, len(ci.Items))
|
||
|
copy(cpy, ci.Items)
|
||
|
*items = cpy
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// Previous retrieves the previous page of items from the api. Returns false when there
|
||
|
// no more pages to retrieve or if there was an error. Use `.Err()` to retrieve
|
||
|
// the error if any
|
||
|
func (ci *UnsubscribesIterator) Previous(ctx context.Context, items *[]Unsubscribe) bool {
|
||
|
if ci.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
if ci.Paging.Previous == "" {
|
||
|
return false
|
||
|
}
|
||
|
ci.err = ci.fetch(ctx, ci.Paging.Previous)
|
||
|
if ci.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
cpy := make([]Unsubscribe, len(ci.Items))
|
||
|
copy(cpy, ci.Items)
|
||
|
*items = cpy
|
||
|
if len(ci.Items) == 0 {
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
func (ci *UnsubscribesIterator) fetch(ctx context.Context, url string) error {
|
||
|
r := newHTTPRequest(url)
|
||
|
r.setClient(ci.mg.Client())
|
||
|
r.setBasicAuth(basicAuthUser, ci.mg.APIKey())
|
||
|
|
||
|
return getResponseFromJSON(ctx, r, &ci.unsubscribesResponse)
|
||
|
}
|
||
|
|
||
|
// Retreives a single unsubscribe record. Can be used to check if a given address is present in the list of unsubscribed users.
|
||
|
func (mg *MailgunImpl) GetUnsubscribe(ctx context.Context, address string) (Unsubscribe, error) {
|
||
|
r := newHTTPRequest(generateApiUrlWithTarget(mg, unsubscribesEndpoint, address))
|
||
|
r.setClient(mg.Client())
|
||
|
r.setBasicAuth(basicAuthUser, mg.APIKey())
|
||
|
|
||
|
envelope := Unsubscribe{}
|
||
|
err := getResponseFromJSON(ctx, r, &envelope)
|
||
|
|
||
|
return envelope, err
|
||
|
}
|
||
|
|
||
|
// Unsubscribe adds an e-mail address to the domain's unsubscription table.
|
||
|
func (mg *MailgunImpl) CreateUnsubscribe(ctx context.Context, address, tag string) error {
|
||
|
r := newHTTPRequest(generateApiUrl(mg, unsubscribesEndpoint))
|
||
|
r.setClient(mg.Client())
|
||
|
r.setBasicAuth(basicAuthUser, mg.APIKey())
|
||
|
p := newUrlEncodedPayload()
|
||
|
p.addValue("address", address)
|
||
|
p.addValue("tag", tag)
|
||
|
_, err := makePostRequest(ctx, r, p)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// DeleteUnsubscribe removes the e-mail address given from the domain's unsubscription table.
|
||
|
// If passing in an ID (discoverable from, e.g., ListUnsubscribes()), the e-mail address associated
|
||
|
// with the given ID will be removed.
|
||
|
func (mg *MailgunImpl) DeleteUnsubscribe(ctx context.Context, address string) error {
|
||
|
r := newHTTPRequest(generateApiUrlWithTarget(mg, unsubscribesEndpoint, address))
|
||
|
r.setClient(mg.Client())
|
||
|
r.setBasicAuth(basicAuthUser, mg.APIKey())
|
||
|
_, err := makeDeleteRequest(ctx, r)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// DeleteUnsubscribeWithTag removes the e-mail address given from the domain's unsubscription table with a matching tag.
|
||
|
// If passing in an ID (discoverable from, e.g., ListUnsubscribes()), the e-mail address associated
|
||
|
// with the given ID will be removed.
|
||
|
func (mg *MailgunImpl) DeleteUnsubscribeWithTag(ctx context.Context, a, t string) error {
|
||
|
r := newHTTPRequest(generateApiUrlWithTarget(mg, unsubscribesEndpoint, a))
|
||
|
r.setClient(mg.Client())
|
||
|
r.setBasicAuth(basicAuthUser, mg.APIKey())
|
||
|
r.addParameter("tag", t)
|
||
|
_, err := makeDeleteRequest(ctx, r)
|
||
|
return err
|
||
|
}
|