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
 | |
| }
 |