github.com/mailgun/mailgun-go/v3@v3.6.4/mock_mailing_list.go (about)

     1  package mailgun
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"net/url"
     7  	"time"
     8  
     9  	"github.com/go-chi/chi"
    10  )
    11  
    12  type mailingListContainer struct {
    13  	MailingList MailingList
    14  	Members     []Member
    15  }
    16  
    17  func (ms *MockServer) addMailingListRoutes(r chi.Router) {
    18  	r.Get("/lists/pages", ms.listMailingLists)
    19  	r.Get("/lists/{address}", ms.getMailingList)
    20  	r.Post("/lists", ms.createMailingList)
    21  	r.Put("/lists/{address}", ms.updateMailingList)
    22  	r.Delete("/lists/{address}", ms.deleteMailingList)
    23  
    24  	r.Get("/lists/{address}/members/pages", ms.listMembers)
    25  	r.Get("/lists/{address}/members/{member}", ms.getMember)
    26  	r.Post("/lists/{address}/members", ms.createMember)
    27  	r.Put("/lists/{address}/members/{member}", ms.updateMember)
    28  	r.Delete("/lists/{address}/members/{member}", ms.deleteMember)
    29  	r.Post("/lists/{address}/members.json", ms.bulkCreate)
    30  
    31  	ms.mailingList = append(ms.mailingList, mailingListContainer{
    32  		MailingList: MailingList{
    33  			AccessLevel:  "everyone",
    34  			Address:      "foo@mailgun.test",
    35  			CreatedAt:    RFC2822Time(time.Now().UTC()),
    36  			Description:  "Mailgun developers list",
    37  			MembersCount: 1,
    38  			Name:         "",
    39  		},
    40  		Members: []Member{
    41  			{
    42  				Address: "dev@samples.mailgun.org",
    43  				Name:    "Developer",
    44  			},
    45  		},
    46  	})
    47  }
    48  
    49  func (ms *MockServer) listMailingLists(w http.ResponseWriter, r *http.Request) {
    50  	var list []MailingList
    51  	var idx []string
    52  
    53  	for _, ml := range ms.mailingList {
    54  		list = append(list, ml.MailingList)
    55  		idx = append(idx, ml.MailingList.Address)
    56  	}
    57  
    58  	limit := stringToInt(r.FormValue("limit"))
    59  	if limit == 0 {
    60  		limit = 100
    61  	}
    62  	start, end := pageOffsets(idx, r.FormValue("page"), r.FormValue("address"), limit)
    63  	results := list[start:end]
    64  
    65  	if len(results) == 0 {
    66  		toJSON(w, listsResponse{})
    67  		return
    68  	}
    69  
    70  	resp := listsResponse{
    71  		Paging: Paging{
    72  			First: getPageURL(r, url.Values{
    73  				"page": []string{"first"},
    74  			}),
    75  			Last: getPageURL(r, url.Values{
    76  				"page": []string{"last"},
    77  			}),
    78  			Next: getPageURL(r, url.Values{
    79  				"page":    []string{"next"},
    80  				"address": []string{results[len(results)-1].Address},
    81  			}),
    82  			Previous: getPageURL(r, url.Values{
    83  				"page":    []string{"prev"},
    84  				"address": []string{results[0].Address},
    85  			}),
    86  		},
    87  		Items: results,
    88  	}
    89  	toJSON(w, resp)
    90  }
    91  
    92  func (ms *MockServer) getMailingList(w http.ResponseWriter, r *http.Request) {
    93  	for _, ml := range ms.mailingList {
    94  		if ml.MailingList.Address == chi.URLParam(r, "address") {
    95  			toJSON(w, mailingListResponse{MailingList: ml.MailingList})
    96  			return
    97  		}
    98  	}
    99  	w.WriteHeader(http.StatusNotFound)
   100  	toJSON(w, okResp{Message: "mailing list not found"})
   101  }
   102  
   103  func (ms *MockServer) deleteMailingList(w http.ResponseWriter, r *http.Request) {
   104  	result := ms.mailingList[:0]
   105  	for _, ml := range ms.mailingList {
   106  		if ml.MailingList.Address == chi.URLParam(r, "address") {
   107  			continue
   108  		}
   109  		result = append(result, ml)
   110  	}
   111  
   112  	if len(result) != len(ms.mailingList) {
   113  		toJSON(w, okResp{Message: "success"})
   114  		ms.mailingList = result
   115  		return
   116  	}
   117  
   118  	w.WriteHeader(http.StatusNotFound)
   119  	toJSON(w, okResp{Message: "mailing list not found"})
   120  }
   121  
   122  func (ms *MockServer) updateMailingList(w http.ResponseWriter, r *http.Request) {
   123  	for i, d := range ms.mailingList {
   124  		if d.MailingList.Address == chi.URLParam(r, "address") {
   125  			if r.FormValue("address") != "" {
   126  				ms.mailingList[i].MailingList.Address = r.FormValue("address")
   127  			}
   128  			if r.FormValue("name") != "" {
   129  				ms.mailingList[i].MailingList.Name = r.FormValue("name")
   130  			}
   131  			if r.FormValue("description") != "" {
   132  				ms.mailingList[i].MailingList.Description = r.FormValue("description")
   133  			}
   134  			if r.FormValue("access_level") != "" {
   135  				ms.mailingList[i].MailingList.AccessLevel = AccessLevel(r.FormValue("access_level"))
   136  			}
   137  			toJSON(w, okResp{Message: "Mailing list member has been updated"})
   138  			return
   139  		}
   140  	}
   141  	w.WriteHeader(http.StatusNotFound)
   142  	toJSON(w, okResp{Message: "mailing list not found"})
   143  }
   144  
   145  func (ms *MockServer) createMailingList(w http.ResponseWriter, r *http.Request) {
   146  	ms.mailingList = append(ms.mailingList, mailingListContainer{
   147  		MailingList: MailingList{
   148  			CreatedAt:   RFC2822Time(time.Now().UTC()),
   149  			Name:        r.FormValue("name"),
   150  			Address:     r.FormValue("address"),
   151  			Description: r.FormValue("description"),
   152  			AccessLevel: AccessLevel(r.FormValue("access_level")),
   153  		},
   154  	})
   155  	toJSON(w, okResp{Message: "Mailing list has been created"})
   156  }
   157  
   158  func (ms *MockServer) listMembers(w http.ResponseWriter, r *http.Request) {
   159  	var list []Member
   160  	var idx []string
   161  	var found bool
   162  
   163  	for _, ml := range ms.mailingList {
   164  		if ml.MailingList.Address == chi.URLParam(r, "address") {
   165  			found = true
   166  			for _, member := range ml.Members {
   167  				list = append(list, member)
   168  				idx = append(idx, member.Address)
   169  			}
   170  		}
   171  	}
   172  
   173  	if !found {
   174  		w.WriteHeader(http.StatusNotFound)
   175  		toJSON(w, okResp{Message: "mailing list not found"})
   176  		return
   177  	}
   178  
   179  	limit := stringToInt(r.FormValue("limit"))
   180  	if limit == 0 {
   181  		limit = 100
   182  	}
   183  	start, end := pageOffsets(idx, r.FormValue("page"), r.FormValue("address"), limit)
   184  	results := list[start:end]
   185  
   186  	if len(results) == 0 {
   187  		toJSON(w, memberListResponse{})
   188  		return
   189  	}
   190  
   191  	resp := memberListResponse{
   192  		Paging: Paging{
   193  			First: getPageURL(r, url.Values{
   194  				"page": []string{"first"},
   195  			}),
   196  			Last: getPageURL(r, url.Values{
   197  				"page": []string{"last"},
   198  			}),
   199  			Next: getPageURL(r, url.Values{
   200  				"page":    []string{"next"},
   201  				"address": []string{results[len(results)-1].Address},
   202  			}),
   203  			Previous: getPageURL(r, url.Values{
   204  				"page":    []string{"prev"},
   205  				"address": []string{results[0].Address},
   206  			}),
   207  		},
   208  		Lists: results,
   209  	}
   210  	toJSON(w, resp)
   211  }
   212  
   213  func (ms *MockServer) getMember(w http.ResponseWriter, r *http.Request) {
   214  	var found bool
   215  	for _, ml := range ms.mailingList {
   216  		if ml.MailingList.Address == chi.URLParam(r, "address") {
   217  			found = true
   218  			for _, member := range ml.Members {
   219  				if member.Address == chi.URLParam(r, "member") {
   220  					toJSON(w, memberResponse{Member: member})
   221  					return
   222  				}
   223  			}
   224  		}
   225  	}
   226  
   227  	if !found {
   228  		w.WriteHeader(http.StatusNotFound)
   229  		toJSON(w, okResp{Message: "mailing list not found"})
   230  		return
   231  	}
   232  
   233  	w.WriteHeader(http.StatusNotFound)
   234  	toJSON(w, okResp{Message: "member not found"})
   235  }
   236  
   237  func (ms *MockServer) deleteMember(w http.ResponseWriter, r *http.Request) {
   238  	idx := -1
   239  	for i, ml := range ms.mailingList {
   240  		if ml.MailingList.Address == chi.URLParam(r, "address") {
   241  			idx = i
   242  		}
   243  	}
   244  
   245  	if idx == -1 {
   246  		w.WriteHeader(http.StatusNotFound)
   247  		toJSON(w, okResp{Message: "mailing list not found"})
   248  		return
   249  	}
   250  
   251  	result := ms.mailingList[idx].Members[:0]
   252  	for _, m := range ms.mailingList[idx].Members {
   253  		if m.Address == chi.URLParam(r, "member") {
   254  			continue
   255  		}
   256  		result = append(result, m)
   257  	}
   258  
   259  	if len(result) != len(ms.mailingList[idx].Members) {
   260  		toJSON(w, okResp{Message: "Mailing list member has been deleted"})
   261  		ms.mailingList[idx].Members = result
   262  		return
   263  	}
   264  
   265  	w.WriteHeader(http.StatusNotFound)
   266  	toJSON(w, okResp{Message: "member not found"})
   267  }
   268  
   269  func (ms *MockServer) updateMember(w http.ResponseWriter, r *http.Request) {
   270  	idx := -1
   271  	for i, ml := range ms.mailingList {
   272  		if ml.MailingList.Address == chi.URLParam(r, "address") {
   273  			idx = i
   274  		}
   275  	}
   276  
   277  	if idx == -1 {
   278  		w.WriteHeader(http.StatusNotFound)
   279  		toJSON(w, okResp{Message: "mailing list not found"})
   280  		return
   281  	}
   282  
   283  	for i, m := range ms.mailingList[idx].Members {
   284  		if m.Address == chi.URLParam(r, "member") {
   285  			if r.FormValue("address") != "" {
   286  				ms.mailingList[idx].Members[i].Address = parseAddress(r.FormValue("address"))
   287  			}
   288  			if r.FormValue("name") != "" {
   289  				ms.mailingList[idx].Members[i].Name = r.FormValue("name")
   290  			}
   291  			if r.FormValue("vars") != "" {
   292  				ms.mailingList[idx].Members[i].Vars = stringToMap(r.FormValue("vars"))
   293  			}
   294  			if r.FormValue("subscribed") != "" {
   295  				sub := stringToBool(r.FormValue("subscribed"))
   296  				ms.mailingList[idx].Members[i].Subscribed = &sub
   297  			}
   298  			toJSON(w, okResp{Message: "Mailing list member has been updated"})
   299  			return
   300  		}
   301  	}
   302  	w.WriteHeader(http.StatusNotFound)
   303  	toJSON(w, okResp{Message: "member not found"})
   304  }
   305  
   306  func (ms *MockServer) createMember(w http.ResponseWriter, r *http.Request) {
   307  	idx := -1
   308  	for i, ml := range ms.mailingList {
   309  		if ml.MailingList.Address == chi.URLParam(r, "address") {
   310  			idx = i
   311  		}
   312  	}
   313  
   314  	if idx == -1 {
   315  		w.WriteHeader(http.StatusNotFound)
   316  		toJSON(w, okResp{Message: "mailing list not found"})
   317  		return
   318  	}
   319  
   320  	sub := stringToBool(r.FormValue("subscribed"))
   321  
   322  	if len(ms.mailingList[idx].Members) != 0 {
   323  		for i, m := range ms.mailingList[idx].Members {
   324  			if m.Address == r.FormValue("address") {
   325  				if !stringToBool(r.FormValue("upsert")) {
   326  					w.WriteHeader(http.StatusConflict)
   327  					toJSON(w, okResp{Message: "member already exists"})
   328  					return
   329  				}
   330  
   331  				ms.mailingList[idx].Members[i].Address = parseAddress(r.FormValue("address"))
   332  				ms.mailingList[idx].Members[i].Name = r.FormValue("name")
   333  				ms.mailingList[idx].Members[i].Vars = stringToMap(r.FormValue("vars"))
   334  				ms.mailingList[idx].Members[i].Subscribed = &sub
   335  				break
   336  			}
   337  		}
   338  	}
   339  
   340  	ms.mailingList[idx].Members = append(ms.mailingList[idx].Members, Member{
   341  		Name:       r.FormValue("name"),
   342  		Address:    parseAddress(r.FormValue("address")),
   343  		Vars:       stringToMap(r.FormValue("vars")),
   344  		Subscribed: &sub,
   345  	})
   346  	toJSON(w, okResp{Message: "Mailing list member has been created"})
   347  }
   348  
   349  func (ms *MockServer) bulkCreate(w http.ResponseWriter, r *http.Request) {
   350  	idx := -1
   351  	for i, ml := range ms.mailingList {
   352  		if ml.MailingList.Address == chi.URLParam(r, "address") {
   353  			idx = i
   354  		}
   355  	}
   356  
   357  	if idx == -1 {
   358  		w.WriteHeader(http.StatusNotFound)
   359  		toJSON(w, okResp{Message: "mailing list not found"})
   360  		return
   361  	}
   362  
   363  	var bulkList []Member
   364  	if err := json.Unmarshal([]byte(r.FormValue("members")), &bulkList); err != nil {
   365  		w.WriteHeader(http.StatusInternalServerError)
   366  		toJSON(w, okResp{Message: "while un-marshalling 'members' param - " + err.Error()})
   367  		return
   368  	}
   369  
   370  BULK:
   371  	for _, member := range bulkList {
   372  		member.Address = parseAddress(member.Address)
   373  		if len(ms.mailingList[idx].Members) != 0 {
   374  			for i, m := range ms.mailingList[idx].Members {
   375  				if m.Address == member.Address {
   376  					if !stringToBool(r.FormValue("upsert")) {
   377  						w.WriteHeader(http.StatusConflict)
   378  						toJSON(w, okResp{Message: "member already exists"})
   379  						return
   380  					}
   381  					ms.mailingList[idx].Members[i] = member
   382  					continue BULK
   383  				}
   384  			}
   385  		}
   386  		ms.mailingList[idx].Members = append(ms.mailingList[idx].Members, member)
   387  	}
   388  	toJSON(w, okResp{Message: "Mailing list has been updated"})
   389  }