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