소스 검색

Change unsubscribe (click instead of onload) behaviour and language

Kailash Nadh 6 년 전
부모
커밋
0fb9c6aed1
4개의 변경된 파일90개의 추가작업 그리고 53개의 파일을 삭제
  1. 51 20
      public.go
  2. 12 5
      public/static/style.css
  3. 0 14
      public/templates/index.html
  4. 27 14
      public/templates/unsubscribe.html

+ 51 - 20
public.go

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

+ 12 - 5
public/static/style.css

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

+ 0 - 14
public/templates/index.html

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

+ 27 - 14
public/templates/unsubscribe.html

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