Change unsubscribe (click instead of onload) behaviour and language
This commit is contained in:
parent
52f8217b77
commit
0fb9c6aed1
4 changed files with 90 additions and 53 deletions
71
public.go
71
public.go
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/labstack/echo"
|
"github.com/labstack/echo"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Template wraps a template.Template for echo.
|
||||||
type Template struct {
|
type Template struct {
|
||||||
templates *template.Template
|
templates *template.Template
|
||||||
}
|
}
|
||||||
|
@ -21,7 +22,8 @@ type publicTpl struct {
|
||||||
|
|
||||||
type unsubTpl struct {
|
type unsubTpl struct {
|
||||||
publicTpl
|
publicTpl
|
||||||
Blacklisted bool
|
Unsubscribe bool
|
||||||
|
Blacklist bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type errorTpl struct {
|
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}$")
|
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 {
|
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)
|
return t.templates.ExecuteTemplate(w, name, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,37 +46,66 @@ func handleUnsubscribePage(c echo.Context) error {
|
||||||
app = c.Get("app").(*App)
|
app = c.Get("app").(*App)
|
||||||
campUUID = c.Param("campUUID")
|
campUUID = c.Param("campUUID")
|
||||||
subUUID = c.Param("subUUID")
|
subUUID = c.Param("subUUID")
|
||||||
|
unsub, _ = strconv.ParseBool(c.FormValue("unsubscribe"))
|
||||||
blacklist, _ = strconv.ParseBool(c.FormValue("blacklist"))
|
blacklist, _ = strconv.ParseBool(c.FormValue("blacklist"))
|
||||||
|
|
||||||
out = unsubTpl{}
|
out = unsubTpl{}
|
||||||
)
|
)
|
||||||
out.Blacklisted = blacklist
|
out.Unsubscribe = unsub
|
||||||
|
out.Blacklist = blacklist
|
||||||
out.Title = "Unsubscribe from mailing list"
|
out.Title = "Unsubscribe from mailing list"
|
||||||
|
|
||||||
if !regexValidUUID.MatchString(campUUID) ||
|
if !regexValidUUID.MatchString(campUUID) ||
|
||||||
!regexValidUUID.MatchString(subUUID) {
|
!regexValidUUID.MatchString(subUUID) {
|
||||||
err := errorTpl{}
|
return c.Render(http.StatusBadRequest, "error",
|
||||||
err.Title = "Invalid request"
|
makeErrorTpl("Invalid request", "",
|
||||||
err.ErrorTitle = err.Title
|
`The unsubscription request contains invalid IDs.
|
||||||
err.ErrorMessage = "The unsubscription request contains invalid IDs. Please make sure to follow the correct link."
|
Please click on the correct link.`))
|
||||||
return c.Render(http.StatusBadRequest, "error", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unsubscribe.
|
// Unsubscribe.
|
||||||
res, err := app.Queries.Unsubscribe.Exec(campUUID, subUUID, blacklist)
|
if unsub {
|
||||||
if err != nil {
|
res, err := app.Queries.Unsubscribe.Exec(campUUID, subUUID, blacklist)
|
||||||
app.Logger.Printf("Error unsubscribing : %v", err)
|
if err != nil {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "Subscription doesn't exist")
|
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 !blacklist {
|
||||||
if num == 0 {
|
num, _ := res.RowsAffected()
|
||||||
err := errorTpl{}
|
if num == 0 {
|
||||||
err.Title = "Invalid subscription"
|
return c.Render(http.StatusBadRequest, "error",
|
||||||
err.ErrorTitle = err.Title
|
makeErrorTpl("Already unsubscribed", "",
|
||||||
err.ErrorMessage = "Looks like you are not subscribed to this mailing list."
|
`Looks like you are not subscribed to this mailing list.
|
||||||
return c.Render(http.StatusBadRequest, "error", err)
|
You may have already unsubscribed.`))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Render(http.StatusOK, "unsubscribe", out)
|
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)
|
||||||
|
}
|
||||||
|
|
|
@ -18,18 +18,25 @@ h1, h2, h3, h4 {
|
||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
border: 0;
|
background: #7f2aff;
|
||||||
background: transparent;
|
|
||||||
padding: 10px 30px;
|
padding: 10px 30px;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
border: 1px solid #ddd;
|
border: 0;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: #111;
|
color: #ffff;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
.button:hover {
|
.button:hover {
|
||||||
background: #f3f3f3;
|
background: #333;
|
||||||
|
}
|
||||||
|
.button .button-outline {
|
||||||
|
background: transparent;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
color: #444'
|
||||||
|
}
|
||||||
|
.button .button-outline:hover {
|
||||||
|
color: #111;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wrap {
|
.wrap {
|
||||||
|
|
|
@ -27,20 +27,6 @@
|
||||||
Powered by <a target="_blank" href="https://listmonk.app">listmonk</a>
|
Powered by <a target="_blank" href="https://listmonk.app">listmonk</a>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<script>
|
|
||||||
function unsubAll(e) {
|
|
||||||
if(!confirm("Are you sure?")) {
|
|
||||||
e.preventDefault();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
document.querySelector("#btn-unsuball").onclick = unsubAll
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
|
@ -1,21 +1,34 @@
|
||||||
{{ define "unsubscribe" }}
|
{{ define "unsubscribe" }}
|
||||||
{{ template "header" .}}
|
{{ template "header" .}}
|
||||||
|
|
||||||
<h2>You have been unsubscribed</h2>
|
{{ if not .Unsubscribe }}
|
||||||
{{ if not .Blacklisted }}
|
<h2>Unsubscribe</h2>
|
||||||
<div class="unsub-all">
|
<p>Do you wish to unsubscribe from this mailing list?</p>
|
||||||
<p>
|
<form method="post">
|
||||||
Unsubscribe from all future communications?
|
<div>
|
||||||
</p>
|
<input type="hidden" name="unsubscribe" value="true" />
|
||||||
<form method="post">
|
<button type="submit" class="button" id="btn-unsub">Unsubscribe</button>
|
||||||
<div>
|
</div>
|
||||||
<input type="hidden" name="blacklist" value="true" />
|
</form>
|
||||||
<button type="submit" class="button" id="btn-unsuball">Unsubscribe all</button>
|
{{ 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>
|
</div>
|
||||||
</form>
|
{{ else }}
|
||||||
</div>
|
<p>You've been unsubscribed from all future communications.</p>
|
||||||
{{ else }}
|
{{ end }}
|
||||||
<p>You've been unsubscribed from all future communications.</p>
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
{{ template "footer" .}}
|
{{ template "footer" .}}
|
||||||
|
|
Loading…
Reference in a new issue