Skip to content

Commit

Permalink
Change unsubscribe (click instead of onload) behaviour and language
Browse files Browse the repository at this point in the history
  • Loading branch information
knadh committed Oct 31, 2018
1 parent 52f8217 commit 0fb9c6a
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 53 deletions.
71 changes: 51 additions & 20 deletions public.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/labstack/echo"
)

// Template wraps a template.Template for echo.
type Template struct {
templates *template.Template
}
Expand All @@ -21,7 +22,8 @@ type publicTpl struct {

type unsubTpl struct {
publicTpl
Blacklisted bool
Unsubscribe bool
Blacklist bool
}

type errorTpl struct {
Expand All @@ -33,8 +35,8 @@ type errorTpl struct {

var regexValidUUID = regexp.MustCompile("^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[8|9|aA|bB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$")

// Render executes and renders a template for echo.
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
// fmt.Println(t.templates.ExecuteTemplate(os.Stdout, name, nil))
return t.templates.ExecuteTemplate(w, name, data)
}

Expand All @@ -44,37 +46,66 @@ func handleUnsubscribePage(c echo.Context) error {
app = c.Get("app").(*App)
campUUID = c.Param("campUUID")
subUUID = c.Param("subUUID")
unsub, _ = strconv.ParseBool(c.FormValue("unsubscribe"))
blacklist, _ = strconv.ParseBool(c.FormValue("blacklist"))

out = unsubTpl{}
)
out.Blacklisted = blacklist
out.Unsubscribe = unsub
out.Blacklist = blacklist
out.Title = "Unsubscribe from mailing list"

if !regexValidUUID.MatchString(campUUID) ||
!regexValidUUID.MatchString(subUUID) {
err := errorTpl{}
err.Title = "Invalid request"
err.ErrorTitle = err.Title
err.ErrorMessage = "The unsubscription request contains invalid IDs. Please make sure to follow the correct link."
return c.Render(http.StatusBadRequest, "error", err)
return c.Render(http.StatusBadRequest, "error",
makeErrorTpl("Invalid request", "",
`The unsubscription request contains invalid IDs.
Please click on the correct link.`))
}

// Unsubscribe.
res, err := app.Queries.Unsubscribe.Exec(campUUID, subUUID, blacklist)
if err != nil {
app.Logger.Printf("Error unsubscribing : %v", err)
return echo.NewHTTPError(http.StatusBadRequest, "Subscription doesn't exist")
}
if unsub {
res, err := app.Queries.Unsubscribe.Exec(campUUID, subUUID, blacklist)
if err != nil {
app.Logger.Printf("Error unsubscribing : %v", err)
return echo.NewHTTPError(http.StatusBadRequest, "There was an internal error while unsubscribing you.")
}

num, err := res.RowsAffected()
if num == 0 {
err := errorTpl{}
err.Title = "Invalid subscription"
err.ErrorTitle = err.Title
err.ErrorMessage = "Looks like you are not subscribed to this mailing list."
return c.Render(http.StatusBadRequest, "error", err)
if !blacklist {
num, _ := res.RowsAffected()
if num == 0 {
return c.Render(http.StatusBadRequest, "error",
makeErrorTpl("Already unsubscribed", "",
`Looks like you are not subscribed to this mailing list.
You may have already unsubscribed.`))
}
}
}

return c.Render(http.StatusOK, "unsubscribe", out)
}

// handleLinkRedirect handles link UUID to real link redirection.
func handleLinkRedirect(c echo.Context) error {
var (
app = c.Get("app").(*App)
linkUUID = c.Param("linkUUID")
campUUID = c.Param("campUUID")
subUUID = c.Param("subUUID")
)
if !regexValidUUID.MatchString(linkUUID) ||
!regexValidUUID.MatchString(campUUID) ||
!regexValidUUID.MatchString(subUUID) {
return c.Render(http.StatusBadRequest, "error",
makeErrorTpl("Invalid link", "", "The link you clicked is invalid."))
}

var url string
if err := app.Queries.RegisterLinkClick.Get(&url, linkUUID, campUUID, subUUID); err != nil {
app.Logger.Printf("error fetching redirect link: %s", err)
return c.Render(http.StatusInternalServerError, "error",
makeErrorTpl("Error opening link", "", "There was an error opening the link. Please try later."))
}

return c.Redirect(http.StatusTemporaryRedirect, url)
}
17 changes: 12 additions & 5 deletions public/static/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,25 @@ h1, h2, h3, h4 {
}

.button {
border: 0;
background: transparent;
background: #7f2aff;
padding: 10px 30px;
border-radius: 3px;
border: 1px solid #ddd;
border: 0;
cursor: pointer;
text-decoration: none;
color: #111;
color: #ffff;
display: inline-block;
}
.button:hover {
background: #f3f3f3;
background: #333;
}
.button .button-outline {
background: transparent;
border: 1px solid #ddd;
color: #444'
}
.button .button-outline:hover {
color: #111;
}

.wrap {
Expand Down
14 changes: 0 additions & 14 deletions public/templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,6 @@
Powered by <a target="_blank" href="https://listmonk.app">listmonk</a>
</footer>
</div>


<script>
function unsubAll(e) {
if(!confirm("Are you sure?")) {
e.preventDefault();
return false;
}
}

(function() {
document.querySelector("#btn-unsuball").onclick = unsubAll
})();
</script>
</body>
</html>
{{ end }}
41 changes: 27 additions & 14 deletions public/templates/unsubscribe.html
Original file line number Diff line number Diff line change
@@ -1,21 +1,34 @@
{{ define "unsubscribe" }}
{{ template "header" .}}

<h2>You have been unsubscribed</h2>
{{ if not .Blacklisted }}
<div class="unsub-all">
<p>
Unsubscribe from all future communications?
</p>
<form method="post">
<div>
<input type="hidden" name="blacklist" value="true" />
<button type="submit" class="button" id="btn-unsuball">Unsubscribe all</button>
{{ if not .Unsubscribe }}
<h2>Unsubscribe</h2>
<p>Do you wish to unsubscribe from this mailing list?</p>
<form method="post">
<div>
<input type="hidden" name="unsubscribe" value="true" />
<button type="submit" class="button" id="btn-unsub">Unsubscribe</button>
</div>
</form>
{{ else }}
<h2>You have been unsubscribed</h2>

{{ if not .Blacklist }}
<div class="unsub-all">
<p>
Unsubscribe from all future communications?
</p>
<form method="post">
<div>
<input type="hidden" name="unsubscribe" value="true" />
<input type="hidden" name="blacklist" value="true" />
<button type="submit" class="button button-inline" id="btn-unsuball">Unsubscribe all</button>
</div>
</form>
</div>
</form>
</div>
{{ else }}
<p>You've been unsubscribed from all future communications.</p>
{{ else }}
<p>You've been unsubscribed from all future communications.</p>
{{ end }}
{{ end }}

{{ template "footer" .}}
Expand Down

0 comments on commit 0fb9c6a

Please sign in to comment.