243 lines
6.4 KiB
Go
243 lines
6.4 KiB
Go
package mailgun
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
|
|
"github.com/go-chi/chi"
|
|
"github.com/mailgun/mailgun-go/v3/events"
|
|
)
|
|
|
|
func (ms *MockServer) addEventRoutes(r chi.Router) {
|
|
r.Get("/{domain}/events", ms.listEvents)
|
|
|
|
var (
|
|
tags = []string{"tag1", "tag2"}
|
|
recipients = []string{"one@mailgun.test", "two@mailgun.test"}
|
|
recipientDomain = "mailgun.test"
|
|
timeStamp = TimeToFloat(time.Now().UTC())
|
|
ipAddress = "192.168.1.1"
|
|
message = events.Message{Headers: events.MessageHeaders{MessageID: "1234"}}
|
|
clientInfo = events.ClientInfo{
|
|
AcceptLanguage: "EN",
|
|
ClientName: "Firefox",
|
|
ClientOS: "OS X",
|
|
ClientType: "browser",
|
|
DeviceType: "desktop",
|
|
IP: "8.8.8.8",
|
|
UserAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:54.0) Gecko/20100101 Firefox/54.0",
|
|
}
|
|
geoLocation = events.GeoLocation{
|
|
City: "San Antonio",
|
|
Country: "US",
|
|
Region: "TX",
|
|
}
|
|
)
|
|
|
|
// AcceptedNoAuth
|
|
accepted := new(events.Accepted)
|
|
accepted.ID = randomString(16, "ID-")
|
|
accepted.Message.Headers.MessageID = accepted.ID
|
|
accepted.Name = events.EventAccepted
|
|
accepted.Tags = tags
|
|
accepted.Timestamp = timeStamp
|
|
accepted.Recipient = recipients[0]
|
|
accepted.RecipientDomain = recipientDomain
|
|
accepted.Flags = events.Flags{
|
|
IsAuthenticated: false,
|
|
}
|
|
ms.events = append(ms.events, accepted)
|
|
|
|
// AcceptedAuth
|
|
accepted = new(events.Accepted)
|
|
accepted.ID = randomString(16, "ID-")
|
|
accepted.Message.Headers.MessageID = accepted.ID
|
|
accepted.Name = events.EventAccepted
|
|
accepted.Tags = tags
|
|
accepted.Timestamp = timeStamp
|
|
accepted.Recipient = recipients[0]
|
|
accepted.RecipientDomain = recipientDomain
|
|
accepted.Campaigns = []events.Campaign{
|
|
{ID: "test-id", Name: "test"},
|
|
}
|
|
accepted.Flags = events.Flags{
|
|
IsAuthenticated: true,
|
|
}
|
|
ms.events = append(ms.events, accepted)
|
|
|
|
// DeliveredSMTP
|
|
delivered := new(events.Delivered)
|
|
delivered.ID = randomString(16, "ID-")
|
|
delivered.Message.Headers.MessageID = delivered.ID
|
|
delivered.Name = events.EventDelivered
|
|
delivered.Tags = tags
|
|
delivered.Timestamp = timeStamp
|
|
delivered.Recipient = recipients[0]
|
|
delivered.RecipientDomain = recipientDomain
|
|
delivered.DeliveryStatus.Message = "We sent an email Yo"
|
|
delivered.Envelope = events.Envelope{
|
|
Transport: "smtp",
|
|
SendingIP: ipAddress,
|
|
}
|
|
delivered.Flags = events.Flags{
|
|
IsAuthenticated: true,
|
|
}
|
|
ms.events = append(ms.events, delivered)
|
|
|
|
// DeliveredHTTP
|
|
delivered = new(events.Delivered)
|
|
delivered.ID = randomString(16, "ID-")
|
|
delivered.Message.Headers.MessageID = delivered.ID
|
|
delivered.Name = events.EventDelivered
|
|
delivered.Tags = tags
|
|
delivered.Timestamp = timeStamp
|
|
delivered.Recipient = recipients[0]
|
|
delivered.RecipientDomain = recipientDomain
|
|
delivered.DeliveryStatus.Message = "We sent an email Yo"
|
|
delivered.Envelope = events.Envelope{
|
|
Transport: "http",
|
|
SendingIP: ipAddress,
|
|
}
|
|
delivered.Flags = events.Flags{
|
|
IsAuthenticated: true,
|
|
}
|
|
ms.events = append(ms.events, delivered)
|
|
|
|
// Stored
|
|
stored := new(events.Stored)
|
|
stored.ID = randomString(16, "ID-")
|
|
stored.Name = events.EventStored
|
|
stored.Tags = tags
|
|
stored.Timestamp = timeStamp
|
|
stored.Storage.URL = "http://mailgun.text/some/url"
|
|
ms.events = append(ms.events, stored)
|
|
|
|
// Clicked
|
|
for _, recipient := range recipients {
|
|
clicked := new(events.Clicked)
|
|
clicked.ID = randomString(16, "ID-")
|
|
clicked.Name = events.EventClicked
|
|
clicked.Message = message
|
|
clicked.Tags = tags
|
|
clicked.Recipient = recipient
|
|
clicked.ClientInfo = clientInfo
|
|
clicked.GeoLocation = geoLocation
|
|
clicked.Timestamp = timeStamp
|
|
ms.events = append(ms.events, clicked)
|
|
}
|
|
|
|
clicked := new(events.Clicked)
|
|
clicked.ID = randomString(16, "ID-")
|
|
clicked.Name = events.EventClicked
|
|
clicked.Message = message
|
|
clicked.Tags = tags
|
|
clicked.Recipient = recipients[0]
|
|
clicked.ClientInfo = clientInfo
|
|
clicked.GeoLocation = geoLocation
|
|
clicked.Timestamp = timeStamp
|
|
ms.events = append(ms.events, clicked)
|
|
|
|
// Opened
|
|
for _, recipient := range recipients {
|
|
opened := new(events.Opened)
|
|
opened.ID = randomString(16, "ID-")
|
|
opened.Name = events.EventOpened
|
|
opened.Message = message
|
|
opened.Tags = tags
|
|
opened.Recipient = recipient
|
|
opened.ClientInfo = clientInfo
|
|
opened.GeoLocation = geoLocation
|
|
opened.Timestamp = timeStamp
|
|
ms.events = append(ms.events, opened)
|
|
}
|
|
|
|
opened := new(events.Opened)
|
|
opened.ID = randomString(16, "ID-")
|
|
opened.Name = events.EventOpened
|
|
opened.Message = message
|
|
opened.Tags = tags
|
|
opened.Recipient = recipients[0]
|
|
opened.ClientInfo = clientInfo
|
|
opened.GeoLocation = geoLocation
|
|
opened.Timestamp = timeStamp
|
|
ms.events = append(ms.events, opened)
|
|
|
|
// Unsubscribed
|
|
for _, recipient := range recipients {
|
|
unsub := new(events.Unsubscribed)
|
|
unsub.ID = randomString(16, "ID-")
|
|
unsub.Name = events.EventUnsubscribed
|
|
unsub.Tags = tags
|
|
unsub.Recipient = recipient
|
|
unsub.ClientInfo = clientInfo
|
|
unsub.GeoLocation = geoLocation
|
|
unsub.Timestamp = timeStamp
|
|
ms.events = append(ms.events, unsub)
|
|
}
|
|
|
|
// Complained
|
|
for _, recipient := range recipients {
|
|
complained := new(events.Complained)
|
|
complained.ID = randomString(16, "ID-")
|
|
complained.Name = events.EventComplained
|
|
complained.Tags = tags
|
|
complained.Recipient = recipient
|
|
complained.Timestamp = timeStamp
|
|
ms.events = append(ms.events, complained)
|
|
}
|
|
}
|
|
|
|
type eventsResponse struct {
|
|
Items []Event `json:"items"`
|
|
Paging Paging `json:"paging"`
|
|
}
|
|
|
|
func (ms *MockServer) listEvents(w http.ResponseWriter, r *http.Request) {
|
|
var idx []string
|
|
|
|
for _, e := range ms.events {
|
|
idx = append(idx, e.GetID())
|
|
}
|
|
|
|
limit := stringToInt(r.FormValue("limit"))
|
|
if limit == 0 {
|
|
limit = 100
|
|
}
|
|
start, end := pageOffsets(idx, r.FormValue("page"), r.FormValue("address"), limit)
|
|
|
|
var nextAddress, prevAddress string
|
|
var results []Event
|
|
|
|
if start != end {
|
|
results = ms.events[start:end]
|
|
nextAddress = results[len(results)-1].GetID()
|
|
prevAddress = results[0].GetID()
|
|
} else {
|
|
results = []Event{}
|
|
nextAddress = r.FormValue("address")
|
|
prevAddress = r.FormValue("address")
|
|
}
|
|
|
|
resp := eventsResponse{
|
|
Paging: Paging{
|
|
First: getPageURL(r, url.Values{
|
|
"page": []string{"first"},
|
|
}),
|
|
Last: getPageURL(r, url.Values{
|
|
"page": []string{"last"},
|
|
}),
|
|
Next: getPageURL(r, url.Values{
|
|
"page": []string{"next"},
|
|
"address": []string{nextAddress},
|
|
}),
|
|
Previous: getPageURL(r, url.Values{
|
|
"page": []string{"prev"},
|
|
"address": []string{prevAddress},
|
|
}),
|
|
},
|
|
Items: results,
|
|
}
|
|
toJSON(w, resp)
|
|
}
|