284 lines
8.0 KiB
Go
284 lines
8.0 KiB
Go
package mailgun
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/go-chi/chi"
|
|
)
|
|
|
|
type domainContainer struct {
|
|
Domain Domain `json:"domain"`
|
|
ReceivingDNSRecords []DNSRecord `json:"receiving_dns_records"`
|
|
SendingDNSRecords []DNSRecord `json:"sending_dns_records"`
|
|
Connection *DomainConnection `json:"connection,omitempty"`
|
|
Tracking *DomainTracking `json:"tracking,omitempty"`
|
|
TagLimits *TagLimits `json:"limits,omitempty"`
|
|
}
|
|
|
|
func (ms *MockServer) addDomainRoutes(r chi.Router) {
|
|
|
|
ms.domainList = append(ms.domainList, domainContainer{
|
|
Domain: Domain{
|
|
CreatedAt: RFC2822Time(time.Now().UTC()),
|
|
Name: "mailgun.test",
|
|
SMTPLogin: "postmaster@mailgun.test",
|
|
SMTPPassword: "4rtqo4p6rrx9",
|
|
Wildcard: true,
|
|
SpamAction: SpamActionDisabled,
|
|
State: "active",
|
|
},
|
|
Connection: &DomainConnection{
|
|
RequireTLS: true,
|
|
SkipVerification: true,
|
|
},
|
|
TagLimits: &TagLimits{
|
|
Limit: 50000,
|
|
Count: 5000,
|
|
},
|
|
Tracking: &DomainTracking{
|
|
Click: TrackingStatus{Active: true},
|
|
Open: TrackingStatus{Active: true},
|
|
Unsubscribe: TrackingStatus{
|
|
Active: false,
|
|
HTMLFooter: "\n<br>\n<p><a href=\"%unsubscribe_url%\">unsubscribe</a></p>\n",
|
|
TextFooter: "\n\nTo unsubscribe click: <%unsubscribe_url%>\n\n",
|
|
},
|
|
},
|
|
ReceivingDNSRecords: []DNSRecord{
|
|
{
|
|
Priority: "10",
|
|
RecordType: "MX",
|
|
Valid: "valid",
|
|
Value: "mxa.mailgun.org",
|
|
},
|
|
{
|
|
Priority: "10",
|
|
RecordType: "MX",
|
|
Valid: "valid",
|
|
Value: "mxb.mailgun.org",
|
|
},
|
|
},
|
|
SendingDNSRecords: []DNSRecord{
|
|
{
|
|
RecordType: "TXT",
|
|
Valid: "valid",
|
|
Name: "domain.com",
|
|
Value: "v=spf1 include:mailgun.org ~all",
|
|
},
|
|
{
|
|
RecordType: "TXT",
|
|
Valid: "valid",
|
|
Name: "domain.com",
|
|
Value: "k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUA....",
|
|
},
|
|
{
|
|
RecordType: "CNAME",
|
|
Valid: "valid",
|
|
Name: "email.domain.com",
|
|
Value: "mailgun.org",
|
|
},
|
|
},
|
|
})
|
|
|
|
r.Get("/domains", ms.listDomains)
|
|
r.Post("/domains", ms.createDomain)
|
|
r.Get("/domains/{domain}", ms.getDomain)
|
|
r.Put("/domains/{domain}/verify", ms.getDomain)
|
|
r.Delete("/domains/{domain}", ms.deleteDomain)
|
|
//r.Get("/domains/{domain}/credentials", ms.getCredentials)
|
|
//r.Post("/domains/{domain}/credentials", ms.createCredentials)
|
|
//r.Put("/domains/{domain}/credentials/{login}", ms.updateCredentials)
|
|
//r.Delete("/domains/{domain}/credentials/{login}", ms.deleteCredentials)
|
|
r.Get("/domains/{domain}/connection", ms.getConnection)
|
|
r.Put("/domains/{domain}/connection", ms.updateConnection)
|
|
r.Get("/domains/{domain}/tracking", ms.getTracking)
|
|
r.Put("/domains/{domain}/tracking/click", ms.updateClickTracking)
|
|
r.Put("/domains/{domain}/tracking/open", ms.updateOpenTracking)
|
|
r.Put("/domains/{domain}/tracking/unsubscribe", ms.updateUnsubTracking)
|
|
r.Get("/domains/{domain}/limits/tag", ms.getTagLimits)
|
|
}
|
|
|
|
func (ms *MockServer) listDomains(w http.ResponseWriter, r *http.Request) {
|
|
var list []Domain
|
|
for _, domain := range ms.domainList {
|
|
list = append(list, domain.Domain)
|
|
}
|
|
|
|
skip := stringToInt(r.FormValue("skip"))
|
|
limit := stringToInt(r.FormValue("limit"))
|
|
if limit == 0 {
|
|
limit = 100
|
|
}
|
|
|
|
if skip > len(list) {
|
|
skip = len(list)
|
|
}
|
|
|
|
end := limit + skip
|
|
if end > len(list) {
|
|
end = len(list)
|
|
}
|
|
|
|
// If we are at the end of the list
|
|
if skip == end {
|
|
toJSON(w, domainsListResponse{
|
|
TotalCount: len(list),
|
|
Items: []Domain{},
|
|
})
|
|
return
|
|
}
|
|
|
|
toJSON(w, domainsListResponse{
|
|
TotalCount: len(list),
|
|
Items: list[skip:end],
|
|
})
|
|
}
|
|
|
|
func (ms *MockServer) getDomain(w http.ResponseWriter, r *http.Request) {
|
|
for _, d := range ms.domainList {
|
|
if d.Domain.Name == chi.URLParam(r, "domain") {
|
|
d.Connection = nil
|
|
toJSON(w, d)
|
|
return
|
|
}
|
|
}
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|
|
|
|
func (ms *MockServer) createDomain(w http.ResponseWriter, r *http.Request) {
|
|
ms.domainList = append(ms.domainList, domainContainer{
|
|
Domain: Domain{
|
|
CreatedAt: RFC2822Time(time.Now()),
|
|
Name: r.FormValue("name"),
|
|
SMTPLogin: r.FormValue("smtp_login"),
|
|
SMTPPassword: r.FormValue("smtp_password"),
|
|
Wildcard: stringToBool(r.FormValue("wildcard")),
|
|
SpamAction: SpamAction(r.FormValue("spam_action")),
|
|
State: "active",
|
|
},
|
|
})
|
|
toJSON(w, okResp{Message: "Domain has been created"})
|
|
}
|
|
|
|
func (ms *MockServer) deleteDomain(w http.ResponseWriter, r *http.Request) {
|
|
result := ms.domainList[:0]
|
|
for _, domain := range ms.domainList {
|
|
if domain.Domain.Name == chi.URLParam(r, "domain") {
|
|
continue
|
|
}
|
|
result = append(result, domain)
|
|
}
|
|
|
|
if len(result) != len(ms.domainList) {
|
|
toJSON(w, okResp{Message: "success"})
|
|
ms.domainList = result
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|
|
|
|
func (ms *MockServer) getConnection(w http.ResponseWriter, r *http.Request) {
|
|
for _, d := range ms.domainList {
|
|
if d.Domain.Name == chi.URLParam(r, "domain") {
|
|
resp := domainConnectionResponse{
|
|
Connection: *d.Connection,
|
|
}
|
|
toJSON(w, resp)
|
|
return
|
|
}
|
|
}
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|
|
|
|
func (ms *MockServer) updateConnection(w http.ResponseWriter, r *http.Request) {
|
|
for i, d := range ms.domainList {
|
|
if d.Domain.Name == chi.URLParam(r, "domain") {
|
|
ms.domainList[i].Connection = &DomainConnection{
|
|
RequireTLS: stringToBool(r.FormValue("require_tls")),
|
|
SkipVerification: stringToBool(r.FormValue("skip_verification")),
|
|
}
|
|
toJSON(w, okResp{Message: "Domain connection settings have been updated, may take 10 minutes to fully propagate"})
|
|
return
|
|
}
|
|
}
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|
|
|
|
func (ms *MockServer) getTracking(w http.ResponseWriter, r *http.Request) {
|
|
for _, d := range ms.domainList {
|
|
if d.Domain.Name == chi.URLParam(r, "domain") {
|
|
resp := domainTrackingResponse{
|
|
Tracking: *d.Tracking,
|
|
}
|
|
toJSON(w, resp)
|
|
return
|
|
}
|
|
}
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|
|
|
|
func (ms *MockServer) updateClickTracking(w http.ResponseWriter, r *http.Request) {
|
|
for i, d := range ms.domainList {
|
|
if d.Domain.Name == chi.URLParam(r, "domain") {
|
|
ms.domainList[i].Tracking.Click.Active = stringToBool(r.FormValue("active"))
|
|
toJSON(w, okResp{Message: "Domain tracking settings have been updated"})
|
|
return
|
|
}
|
|
}
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|
|
|
|
func (ms *MockServer) updateOpenTracking(w http.ResponseWriter, r *http.Request) {
|
|
for i, d := range ms.domainList {
|
|
if d.Domain.Name == chi.URLParam(r, "domain") {
|
|
ms.domainList[i].Tracking.Open.Active = stringToBool(r.FormValue("active"))
|
|
toJSON(w, okResp{Message: "Domain tracking settings have been updated"})
|
|
return
|
|
}
|
|
}
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|
|
|
|
func (ms *MockServer) updateUnsubTracking(w http.ResponseWriter, r *http.Request) {
|
|
for i, d := range ms.domainList {
|
|
if d.Domain.Name == chi.URLParam(r, "domain") {
|
|
ms.domainList[i].Tracking.Unsubscribe.Active = stringToBool(r.FormValue("active"))
|
|
if len(r.FormValue("html_footer")) != 0 {
|
|
ms.domainList[i].Tracking.Unsubscribe.HTMLFooter = r.FormValue("html_footer")
|
|
}
|
|
if len(r.FormValue("text_footer")) != 0 {
|
|
ms.domainList[i].Tracking.Unsubscribe.TextFooter = r.FormValue("text_footer")
|
|
}
|
|
toJSON(w, okResp{Message: "Domain tracking settings have been updated"})
|
|
return
|
|
}
|
|
}
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|
|
|
|
func (ms *MockServer) getTagLimits(w http.ResponseWriter, r *http.Request) {
|
|
for _, d := range ms.domainList {
|
|
if d.Domain.Name == chi.URLParam(r, "domain") {
|
|
if d.TagLimits == nil {
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "no limits defined for domain"})
|
|
return
|
|
}
|
|
toJSON(w, d.TagLimits)
|
|
return
|
|
}
|
|
}
|
|
w.WriteHeader(http.StatusNotFound)
|
|
toJSON(w, okResp{Message: "domain not found"})
|
|
}
|