diff options
author | Brian Picciano <mediocregopher@gmail.com> | 2021-08-07 20:38:37 -0600 |
---|---|---|
committer | Brian Picciano <mediocregopher@gmail.com> | 2021-08-07 20:38:37 -0600 |
commit | 0197d9cd493b5785bca05f476856540ec64da64a (patch) | |
tree | db19ac4bfa602b1e0b001769c57d6b7c37d96fc4 /srv/api/mailinglist.go | |
parent | dce39b836a0fd6e37ab2499c2e0e232572c17ad6 (diff) |
split configuration parsing out into separate packages, split api out as well
Diffstat (limited to 'srv/api/mailinglist.go')
-rw-r--r-- | srv/api/mailinglist.go | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/srv/api/mailinglist.go b/srv/api/mailinglist.go new file mode 100644 index 0000000..2ddfbe6 --- /dev/null +++ b/srv/api/mailinglist.go @@ -0,0 +1,87 @@ +package api + +import ( + "errors" + "net/http" + "strings" + + "github.com/mediocregopher/blog.mediocregopher.com/srv/mailinglist" +) + +func (a *api) mailingListSubscribeHandler() http.Handler { + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + email := r.PostFormValue("email") + if parts := strings.Split(email, "@"); len(parts) != 2 || + parts[0] == "" || + parts[1] == "" || + len(email) >= 512 { + badRequest(rw, r, errors.New("invalid email")) + return + } + + err := a.params.MailingList.BeginSubscription(email) + + if errors.Is(err, mailinglist.ErrAlreadyVerified) { + // just eat the error, make it look to the user like the + // verification email was sent. + } else if err != nil { + internalServerError(rw, r, err) + return + } + + jsonResult(rw, r, struct{}{}) + }) +} + +func (a *api) mailingListFinalizeHandler() http.Handler { + var errInvalidSubToken = errors.New("invalid subToken") + + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + subToken := r.PostFormValue("subToken") + if l := len(subToken); l == 0 || l > 128 { + badRequest(rw, r, errInvalidSubToken) + return + } + + err := a.params.MailingList.FinalizeSubscription(subToken) + + if errors.Is(err, mailinglist.ErrNotFound) { + badRequest(rw, r, errInvalidSubToken) + return + + } else if errors.Is(err, mailinglist.ErrAlreadyVerified) { + // no problem + + } else if err != nil { + internalServerError(rw, r, err) + return + } + + jsonResult(rw, r, struct{}{}) + }) +} + +func (a *api) mailingListUnsubscribeHandler() http.Handler { + var errInvalidUnsubToken = errors.New("invalid unsubToken") + + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + unsubToken := r.PostFormValue("unsubToken") + if l := len(unsubToken); l == 0 || l > 128 { + badRequest(rw, r, errInvalidUnsubToken) + return + } + + err := a.params.MailingList.Unsubscribe(unsubToken) + + if errors.Is(err, mailinglist.ErrNotFound) { + badRequest(rw, r, errInvalidUnsubToken) + return + + } else if err != nil { + internalServerError(rw, r, err) + return + } + + jsonResult(rw, r, struct{}{}) + }) +} |