diff options
-rw-r--r-- | srv/src/http/api.go | 2 | ||||
-rw-r--r-- | srv/src/http/tpl/finalize.html | 45 | ||||
-rw-r--r-- | srv/src/http/tpl/unsubscribe.html | 44 | ||||
-rw-r--r-- | srv/src/mailinglist/mailinglist.go | 4 |
4 files changed, 93 insertions, 2 deletions
diff --git a/srv/src/http/api.go b/srv/src/http/api.go index 3cb4ba5..19a65d9 100644 --- a/srv/src/http/api.go +++ b/srv/src/http/api.go @@ -216,6 +216,8 @@ func (a *api) blogHandler() http.Handler { mux.Handle("/static/", http.FileServer(http.FS(staticFS))) mux.Handle("/follow", a.renderDumbTplHandler("follow.html")) + mux.Handle("/mailinglist/unsubscribe", a.renderDumbTplHandler("unsubscribe.html")) + mux.Handle("/mailinglist/finalize", a.renderDumbTplHandler("finalize.html")) mux.Handle("/feed.xml", a.renderFeedHandler()) mux.Handle("/", a.renderIndexHandler()) diff --git a/srv/src/http/tpl/finalize.html b/srv/src/http/tpl/finalize.html new file mode 100644 index 0000000..8bdfceb --- /dev/null +++ b/srv/src/http/tpl/finalize.html @@ -0,0 +1,45 @@ +{{ define "body" }} + +<script async type="module" src="{{ StaticURL "api.js" }}"></script> + +<style> +#result.success { color: green; } +#result.fail { color: red; } +</style> + +<span id="result"></span> + +<script> + +(async () => { + + const resultSpan = document.getElementById("result"); + + try { + + const urlParams = new URLSearchParams(window.location.search); + const subToken = urlParams.get('subToken'); + + if (!subToken) throw "No subscription token provided"; + + const api = await import("{{ StaticURL "api.js" }}"); + + await api.call('/api/mailinglist/finalize', { + body: { subToken }, + }); + + resultSpan.className = "success"; + resultSpan.innerHTML = "Your email subscription has been finalized! Please go on about your day."; + + } catch (e) { + resultSpan.className = "fail"; + resultSpan.innerHTML = e; + } + +})(); + +</script> + +{{ end }} + +{{ template "base.html" . }} diff --git a/srv/src/http/tpl/unsubscribe.html b/srv/src/http/tpl/unsubscribe.html new file mode 100644 index 0000000..ad01735 --- /dev/null +++ b/srv/src/http/tpl/unsubscribe.html @@ -0,0 +1,44 @@ +{{ define "body" }} + +<script async type="module" src="{{ StaticURL "api.js" }}"></script> + +<style> +#result.success { color: green; } +#result.fail { color: red; } +</style> + +<span id="result"></span> + +<script> + +(async () => { + + const resultSpan = document.getElementById("result"); + + try { + const urlParams = new URLSearchParams(window.location.search); + const unsubToken = urlParams.get('unsubToken'); + + if (!unsubToken) throw "No unsubscribe token provided"; + + const api = await import("{{ StaticURL "api.js" }}"); + + await api.call('/api/mailinglist/unsubscribe', { + body: { unsubToken }, + }); + + resultSpan.className = "success"; + resultSpan.innerHTML = "You have been unsubscribed! Please go on about your day."; + + } catch (e) { + resultSpan.className = "fail"; + resultSpan.innerHTML = e; + } + +})(); + +</script> + +{{ end }} + +{{ template "base.html" . }} diff --git a/srv/src/mailinglist/mailinglist.go b/srv/src/mailinglist/mailinglist.go index 28b44b0..d9bdcc0 100644 --- a/srv/src/mailinglist/mailinglist.go +++ b/srv/src/mailinglist/mailinglist.go @@ -126,7 +126,7 @@ func (m *mailingList) BeginSubscription(email string) error { SubLink string }{ SubLink: fmt.Sprintf( - "%s/mailinglist/finalize.html?subToken=%s", + "%s/mailinglist/finalize?subToken=%s", m.params.PublicURL.String(), emailRecord.SubToken, ), @@ -242,7 +242,7 @@ func (m *mailingList) Publish(postTitle, postURL string) error { PostTitle: postTitle, PostURL: postURL, UnsubURL: fmt.Sprintf( - "%s/mailinglist/unsubscribe.html?unsubToken=%s", + "%s/mailinglist/unsubscribe?unsubToken=%s", m.params.PublicURL.String(), emailRecord.UnsubToken, ), |