go-mockid/vendor/github.com/mailgun/mailgun-go/v3/mock_mailing_list.go

390 lines
10 KiB
Go

package mailgun
import (
"encoding/json"
"net/http"
"net/url"
"time"
"github.com/go-chi/chi"
)
type mailingListContainer struct {
MailingList MailingList
Members []Member
}
func (ms *MockServer) addMailingListRoutes(r chi.Router) {
r.Get("/lists/pages", ms.listMailingLists)
r.Get("/lists/{address}", ms.getMailingList)
r.Post("/lists", ms.createMailingList)
r.Put("/lists/{address}", ms.updateMailingList)
r.Delete("/lists/{address}", ms.deleteMailingList)
r.Get("/lists/{address}/members/pages", ms.listMembers)
r.Get("/lists/{address}/members/{member}", ms.getMember)
r.Post("/lists/{address}/members", ms.createMember)
r.Put("/lists/{address}/members/{member}", ms.updateMember)
r.Delete("/lists/{address}/members/{member}", ms.deleteMember)
r.Post("/lists/{address}/members.json", ms.bulkCreate)
ms.mailingList = append(ms.mailingList, mailingListContainer{
MailingList: MailingList{
AccessLevel: "everyone",
Address: "foo@mailgun.test",
CreatedAt: RFC2822Time(time.Now().UTC()),
Description: "Mailgun developers list",
MembersCount: 1,
Name: "",
},
Members: []Member{
{
Address: "dev@samples.mailgun.org",
Name: "Developer",
},
},
})
}
func (ms *MockServer) listMailingLists(w http.ResponseWriter, r *http.Request) {
var list []MailingList
var idx []string
for _, ml := range ms.mailingList {
list = append(list, ml.MailingList)
idx = append(idx, ml.MailingList.Address)
}
limit := stringToInt(r.FormValue("limit"))
if limit == 0 {
limit = 100
}
start, end := pageOffsets(idx, r.FormValue("page"), r.FormValue("address"), limit)
results := list[start:end]
if len(results) == 0 {
toJSON(w, listsResponse{})
return
}
resp := listsResponse{
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{results[len(results)-1].Address},
}),
Previous: getPageURL(r, url.Values{
"page": []string{"prev"},
"address": []string{results[0].Address},
}),
},
Items: results,
}
toJSON(w, resp)
}
func (ms *MockServer) getMailingList(w http.ResponseWriter, r *http.Request) {
for _, ml := range ms.mailingList {
if ml.MailingList.Address == chi.URLParam(r, "address") {
toJSON(w, mailingListResponse{MailingList: ml.MailingList})
return
}
}
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
}
func (ms *MockServer) deleteMailingList(w http.ResponseWriter, r *http.Request) {
result := ms.mailingList[:0]
for _, ml := range ms.mailingList {
if ml.MailingList.Address == chi.URLParam(r, "address") {
continue
}
result = append(result, ml)
}
if len(result) != len(ms.mailingList) {
toJSON(w, okResp{Message: "success"})
ms.mailingList = result
return
}
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
}
func (ms *MockServer) updateMailingList(w http.ResponseWriter, r *http.Request) {
for i, d := range ms.mailingList {
if d.MailingList.Address == chi.URLParam(r, "address") {
if r.FormValue("address") != "" {
ms.mailingList[i].MailingList.Address = r.FormValue("address")
}
if r.FormValue("name") != "" {
ms.mailingList[i].MailingList.Name = r.FormValue("name")
}
if r.FormValue("description") != "" {
ms.mailingList[i].MailingList.Description = r.FormValue("description")
}
if r.FormValue("access_level") != "" {
ms.mailingList[i].MailingList.AccessLevel = AccessLevel(r.FormValue("access_level"))
}
toJSON(w, okResp{Message: "Mailing list member has been updated"})
return
}
}
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
}
func (ms *MockServer) createMailingList(w http.ResponseWriter, r *http.Request) {
ms.mailingList = append(ms.mailingList, mailingListContainer{
MailingList: MailingList{
CreatedAt: RFC2822Time(time.Now().UTC()),
Name: r.FormValue("name"),
Address: r.FormValue("address"),
Description: r.FormValue("description"),
AccessLevel: AccessLevel(r.FormValue("access_level")),
},
})
toJSON(w, okResp{Message: "Mailing list has been created"})
}
func (ms *MockServer) listMembers(w http.ResponseWriter, r *http.Request) {
var list []Member
var idx []string
var found bool
for _, ml := range ms.mailingList {
if ml.MailingList.Address == chi.URLParam(r, "address") {
found = true
for _, member := range ml.Members {
list = append(list, member)
idx = append(idx, member.Address)
}
}
}
if !found {
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
return
}
limit := stringToInt(r.FormValue("limit"))
if limit == 0 {
limit = 100
}
start, end := pageOffsets(idx, r.FormValue("page"), r.FormValue("address"), limit)
results := list[start:end]
if len(results) == 0 {
toJSON(w, memberListResponse{})
return
}
resp := memberListResponse{
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{results[len(results)-1].Address},
}),
Previous: getPageURL(r, url.Values{
"page": []string{"prev"},
"address": []string{results[0].Address},
}),
},
Lists: results,
}
toJSON(w, resp)
}
func (ms *MockServer) getMember(w http.ResponseWriter, r *http.Request) {
var found bool
for _, ml := range ms.mailingList {
if ml.MailingList.Address == chi.URLParam(r, "address") {
found = true
for _, member := range ml.Members {
if member.Address == chi.URLParam(r, "member") {
toJSON(w, memberResponse{Member: member})
return
}
}
}
}
if !found {
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
return
}
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "member not found"})
}
func (ms *MockServer) deleteMember(w http.ResponseWriter, r *http.Request) {
idx := -1
for i, ml := range ms.mailingList {
if ml.MailingList.Address == chi.URLParam(r, "address") {
idx = i
}
}
if idx == -1 {
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
return
}
result := ms.mailingList[idx].Members[:0]
for _, m := range ms.mailingList[idx].Members {
if m.Address == chi.URLParam(r, "member") {
continue
}
result = append(result, m)
}
if len(result) != len(ms.mailingList[idx].Members) {
toJSON(w, okResp{Message: "Mailing list member has been deleted"})
ms.mailingList[idx].Members = result
return
}
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "member not found"})
}
func (ms *MockServer) updateMember(w http.ResponseWriter, r *http.Request) {
idx := -1
for i, ml := range ms.mailingList {
if ml.MailingList.Address == chi.URLParam(r, "address") {
idx = i
}
}
if idx == -1 {
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
return
}
for i, m := range ms.mailingList[idx].Members {
if m.Address == chi.URLParam(r, "member") {
if r.FormValue("address") != "" {
ms.mailingList[idx].Members[i].Address = parseAddress(r.FormValue("address"))
}
if r.FormValue("name") != "" {
ms.mailingList[idx].Members[i].Name = r.FormValue("name")
}
if r.FormValue("vars") != "" {
ms.mailingList[idx].Members[i].Vars = stringToMap(r.FormValue("vars"))
}
if r.FormValue("subscribed") != "" {
sub := stringToBool(r.FormValue("subscribed"))
ms.mailingList[idx].Members[i].Subscribed = &sub
}
toJSON(w, okResp{Message: "Mailing list member has been updated"})
return
}
}
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "member not found"})
}
func (ms *MockServer) createMember(w http.ResponseWriter, r *http.Request) {
idx := -1
for i, ml := range ms.mailingList {
if ml.MailingList.Address == chi.URLParam(r, "address") {
idx = i
}
}
if idx == -1 {
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
return
}
sub := stringToBool(r.FormValue("subscribed"))
if len(ms.mailingList[idx].Members) != 0 {
for i, m := range ms.mailingList[idx].Members {
if m.Address == r.FormValue("address") {
if !stringToBool(r.FormValue("upsert")) {
w.WriteHeader(http.StatusConflict)
toJSON(w, okResp{Message: "member already exists"})
return
}
ms.mailingList[idx].Members[i].Address = parseAddress(r.FormValue("address"))
ms.mailingList[idx].Members[i].Name = r.FormValue("name")
ms.mailingList[idx].Members[i].Vars = stringToMap(r.FormValue("vars"))
ms.mailingList[idx].Members[i].Subscribed = &sub
break
}
}
}
ms.mailingList[idx].Members = append(ms.mailingList[idx].Members, Member{
Name: r.FormValue("name"),
Address: parseAddress(r.FormValue("address")),
Vars: stringToMap(r.FormValue("vars")),
Subscribed: &sub,
})
toJSON(w, okResp{Message: "Mailing list member has been created"})
}
func (ms *MockServer) bulkCreate(w http.ResponseWriter, r *http.Request) {
idx := -1
for i, ml := range ms.mailingList {
if ml.MailingList.Address == chi.URLParam(r, "address") {
idx = i
}
}
if idx == -1 {
w.WriteHeader(http.StatusNotFound)
toJSON(w, okResp{Message: "mailing list not found"})
return
}
var bulkList []Member
if err := json.Unmarshal([]byte(r.FormValue("members")), &bulkList); err != nil {
w.WriteHeader(http.StatusInternalServerError)
toJSON(w, okResp{Message: "while un-marshalling 'members' param - " + err.Error()})
return
}
BULK:
for _, member := range bulkList {
member.Address = parseAddress(member.Address)
if len(ms.mailingList[idx].Members) != 0 {
for i, m := range ms.mailingList[idx].Members {
if m.Address == member.Address {
if !stringToBool(r.FormValue("upsert")) {
w.WriteHeader(http.StatusConflict)
toJSON(w, okResp{Message: "member already exists"})
return
}
ms.mailingList[idx].Members[i] = member
continue BULK
}
}
}
ms.mailingList[idx].Members = append(ms.mailingList[idx].Members, member)
}
toJSON(w, okResp{Message: "Mailing list has been updated"})
}