summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--srv/src/http/api.go2
-rw-r--r--srv/src/http/tpl/finalize.html45
-rw-r--r--srv/src/http/tpl/unsubscribe.html44
-rw-r--r--srv/src/mailinglist/mailinglist.go4
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,
),