121 lines
2.9 KiB
Go
121 lines
2.9 KiB
Go
package mailgun
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// Stats on accepted messages
|
|
type Accepted struct {
|
|
Incoming int `json:"incoming"`
|
|
Outgoing int `json:"outgoing"`
|
|
Total int `json:"total"`
|
|
}
|
|
|
|
// Stats on delivered messages
|
|
type Delivered struct {
|
|
Smtp int `json:"smtp"`
|
|
Http int `json:"http"`
|
|
Total int `json:"total"`
|
|
}
|
|
|
|
// Stats on temporary failures
|
|
type Temporary struct {
|
|
Espblock int `json:"espblock"`
|
|
}
|
|
|
|
// Stats on permanent failures
|
|
type Permanent struct {
|
|
SuppressBounce int `json:"suppress-bounce"`
|
|
SuppressUnsubscribe int `json:"suppress-unsubscribe"`
|
|
SuppressComplaint int `json:"suppress-complaint"`
|
|
Bounce int `json:"bounce"`
|
|
DelayedBounce int `json:"delayed-bounce"`
|
|
Total int `json:"total"`
|
|
}
|
|
|
|
// Stats on failed messages
|
|
type Failed struct {
|
|
Temporary Temporary `json:"temporary"`
|
|
Permanent Permanent `json:"permanent"`
|
|
}
|
|
|
|
// Total stats for messages
|
|
type Total struct {
|
|
Total int `json:"total"`
|
|
}
|
|
|
|
// Stats as returned by `GetStats()`
|
|
type Stats struct {
|
|
Time string `json:"time"`
|
|
Accepted Accepted `json:"accepted"`
|
|
Delivered Delivered `json:"delivered"`
|
|
Failed Failed `json:"failed"`
|
|
Stored Total `json:"stored"`
|
|
Opened Total `json:"opened"`
|
|
Clicked Total `json:"clicked"`
|
|
Unsubscribed Total `json:"unsubscribed"`
|
|
Complained Total `json:"complained"`
|
|
}
|
|
|
|
type statsTotalResponse struct {
|
|
End string `json:"end"`
|
|
Resolution string `json:"resolution"`
|
|
Start string `json:"start"`
|
|
Stats []Stats `json:"stats"`
|
|
}
|
|
|
|
// Used by GetStats() to specify the resolution stats are for
|
|
type Resolution string
|
|
|
|
// Indicate which resolution a stat response for request is for
|
|
const (
|
|
ResolutionHour = Resolution("hour")
|
|
ResolutionDay = Resolution("day")
|
|
ResolutionMonth = Resolution("month")
|
|
)
|
|
|
|
// Options for GetStats()
|
|
type GetStatOptions struct {
|
|
Resolution Resolution
|
|
Duration string
|
|
Start time.Time
|
|
End time.Time
|
|
}
|
|
|
|
// GetStats returns total stats for a given domain for the specified time period
|
|
func (mg *MailgunImpl) GetStats(ctx context.Context, events []string, opts *GetStatOptions) ([]Stats, error) {
|
|
r := newHTTPRequest(generateApiUrl(mg, statsTotalEndpoint))
|
|
|
|
if opts != nil {
|
|
if !opts.Start.IsZero() {
|
|
r.addParameter("start", strconv.Itoa(int(opts.Start.Unix())))
|
|
}
|
|
if !opts.End.IsZero() {
|
|
r.addParameter("end", strconv.Itoa(int(opts.End.Unix())))
|
|
}
|
|
if opts.Resolution != "" {
|
|
r.addParameter("resolution", string(opts.Resolution))
|
|
}
|
|
if opts.Duration != "" {
|
|
r.addParameter("duration", opts.Duration)
|
|
}
|
|
}
|
|
|
|
for _, e := range events {
|
|
r.addParameter("event", e)
|
|
}
|
|
|
|
r.setClient(mg.Client())
|
|
r.setBasicAuth(basicAuthUser, mg.APIKey())
|
|
|
|
var res statsTotalResponse
|
|
err := getResponseFromJSON(ctx, r, &res)
|
|
if err != nil {
|
|
return nil, err
|
|
} else {
|
|
return res.Stats, nil
|
|
}
|
|
}
|