go-mockid/vendor/github.com/mailgun/mailgun-go/v3/mock_domains.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"})
}