Change unsubscribe (click instead of onload) behaviour and language

This commit is contained in:
Kailash Nadh 2018-10-31 18:22:54 +05:30
parent 52f8217b77
commit 0fb9c6aed1
4 changed files with 90 additions and 53 deletions

View File

@ -10,6 +10,7 @@ import (
"github.com/labstack/echo"
)
// Template wraps a template.Template for echo.
type Template struct {
templates *template.Template
}
@ -21,7 +22,8 @@ type publicTpl struct {
type unsubTpl struct {
publicTpl
Blacklisted bool
Unsubscribe bool
Blacklist bool
}
type errorTpl struct {
@ -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)
}
@ -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)
}

View File

@ -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 {

View File

@ -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 }}

View File

@ -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" .}}