124 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package mailgun
 | |
| 
 | |
| import (
 | |
| 	"net/http"
 | |
| 	"net/mail"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/go-chi/chi"
 | |
| 	"github.com/mailgun/mailgun-go/v3/events"
 | |
| )
 | |
| 
 | |
| func (ms *MockServer) addMessagesRoutes(r chi.Router) {
 | |
| 	r.Post("/{domain}/messages", ms.createMessages)
 | |
| 
 | |
| 	// This path is made up; it could be anything as the storage url could change over time
 | |
| 	r.Get("/se.storage.url/messages/{id}", ms.getStoredMessages)
 | |
| 	r.Post("/se.storage.url/messages/{id}", ms.sendStoredMessages)
 | |
| }
 | |
| 
 | |
| // TODO: This implementation doesn't support multiple recipients
 | |
| func (ms *MockServer) createMessages(w http.ResponseWriter, r *http.Request) {
 | |
| 	to, err := mail.ParseAddress(r.FormValue("to"))
 | |
| 	if err != nil {
 | |
| 		w.WriteHeader(http.StatusBadRequest)
 | |
| 		toJSON(w, okResp{Message: "invalid 'to' address"})
 | |
| 		return
 | |
| 	}
 | |
| 	id := randomString(16, "ID-")
 | |
| 
 | |
| 	switch to.Address {
 | |
| 	case "stored@mailgun.test":
 | |
| 		stored := new(events.Stored)
 | |
| 		stored.Name = events.EventStored
 | |
| 		stored.Timestamp = TimeToFloat(time.Now().UTC())
 | |
| 		stored.ID = id
 | |
| 		stored.Storage.URL = ms.URL() + "/se.storage.url/messages/" + id
 | |
| 		stored.Storage.Key = id
 | |
| 		stored.Message.Headers = events.MessageHeaders{
 | |
| 			Subject:   r.FormValue("subject"),
 | |
| 			From:      r.FormValue("from"),
 | |
| 			To:        to.Address,
 | |
| 			MessageID: id,
 | |
| 		}
 | |
| 		stored.Message.Recipients = []string{
 | |
| 			r.FormValue("to"),
 | |
| 		}
 | |
| 		stored.Message.Size = 10
 | |
| 		stored.Flags = events.Flags{
 | |
| 			IsTestMode: false,
 | |
| 		}
 | |
| 		ms.events = append(ms.events, stored)
 | |
| 	default:
 | |
| 		accepted := new(events.Accepted)
 | |
| 		accepted.Name = events.EventAccepted
 | |
| 		accepted.ID = id
 | |
| 		accepted.Timestamp = TimeToFloat(time.Now().UTC())
 | |
| 		accepted.Message.Headers.From = r.FormValue("from")
 | |
| 		accepted.Message.Headers.To = r.FormValue("to")
 | |
| 		accepted.Message.Headers.MessageID = accepted.ID
 | |
| 		accepted.Message.Headers.Subject = r.FormValue("subject")
 | |
| 
 | |
| 		accepted.Recipient = r.FormValue("to")
 | |
| 		accepted.RecipientDomain = strings.Split(to.Address, "@")[1]
 | |
| 		accepted.Flags = events.Flags{
 | |
| 			IsAuthenticated: true,
 | |
| 		}
 | |
| 		ms.events = append(ms.events, accepted)
 | |
| 	}
 | |
| 
 | |
| 	toJSON(w, okResp{ID: "<" + id + ">", Message: "Queued. Thank you."})
 | |
| }
 | |
| 
 | |
| func (ms *MockServer) getStoredMessages(w http.ResponseWriter, r *http.Request) {
 | |
| 	id := chi.URLParam(r, "id")
 | |
| 
 | |
| 	// Find our stored event
 | |
| 	var stored *events.Stored
 | |
| 	for _, event := range ms.events {
 | |
| 		if event.GetID() == id {
 | |
| 			stored = event.(*events.Stored)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if stored == nil {
 | |
| 		w.WriteHeader(http.StatusNotFound)
 | |
| 		toJSON(w, okResp{Message: "not found"})
 | |
| 	}
 | |
| 
 | |
| 	toJSON(w, StoredMessage{
 | |
| 		Recipients: strings.Join(stored.Message.Recipients, ","),
 | |
| 		Sender:     stored.Message.Headers.From,
 | |
| 		Subject:    stored.Message.Headers.Subject,
 | |
| 		From:       stored.Message.Headers.From,
 | |
| 		MessageHeaders: [][]string{
 | |
| 			{"Sender", stored.Message.Headers.From},
 | |
| 			{"To", stored.Message.Headers.To},
 | |
| 			{"Subject", stored.Message.Headers.Subject},
 | |
| 			{"Content-Type", "text/plain"},
 | |
| 		},
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func (ms *MockServer) sendStoredMessages(w http.ResponseWriter, r *http.Request) {
 | |
| 	id := chi.URLParam(r, "id")
 | |
| 
 | |
| 	// Find our stored event
 | |
| 	var stored *events.Stored
 | |
| 	for _, event := range ms.events {
 | |
| 		if event.GetID() == id {
 | |
| 			stored = event.(*events.Stored)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if stored == nil {
 | |
| 		w.WriteHeader(http.StatusNotFound)
 | |
| 		toJSON(w, okResp{Message: "not found"})
 | |
| 	}
 | |
| 
 | |
| 	// DO NOTHING
 | |
| 
 | |
| 	toJSON(w, okResp{ID: "<" + id + ">", Message: "Queued. Thank you."})
 | |
| }
 |