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 }