refactor and limit number of URLs on dashboard

Amolith created

Change summary

helperfuncs.go | 26 +++++++++++++++++++++-
root.go        | 59 +++++++++++++++++++++++----------------------------
2 files changed, 51 insertions(+), 34 deletions(-)

Detailed changes

helperfuncs.go 🔗

@@ -8,6 +8,8 @@ import (
 	"errors"
 	"fmt"
 	"log"
+	"net/url"
+	"sort"
 	"strings"
 	"text/template"
 
@@ -136,7 +138,7 @@ func unauthenticated() string {
 }
 
 // authenticated serves the authenticated dashboard to the user
-func (m model) authenticated() string {
+func (m model) authenticated(links map[string]string) string {
 	dash, err := templates.ReadFile("templates/home_authenticated.html")
 	if err != nil {
 		log.Fatalln(err)
@@ -145,8 +147,28 @@ func (m model) authenticated() string {
 	if err != nil {
 		log.Println(err)
 	}
+
+	// Maps have no order so we're making an array containing the keys
+	linksArray := make([]string, 0, len(links))
+	for k := range links {
+		linksArray = append(linksArray, k)
+	}
+	// Then sorting them
+	sort.Sort(sort.StringSlice(linksArray))
+
+	// And ranging through the keys to pull ordered values from the map
+	var table string
+	for _, k := range linksArray {
+		v := links[k]
+		table = table + fmt.Sprintf(`<tr>
+	<td><p>%s</p></td>
+	<td><p>%s</p></td>
+	<td><a class="button" href="/?action=edit&name=%s&url=%s">Edit</a><a class="button" href="/?action=delete&name=%s">Delete</a></td>
+</tr>`, k, v, k, url.QueryEscape(string(v)), k)
+	}
+
 	page := new(strings.Builder)
-	err = tmpl.Execute(page, m.genTable())
+	err = tmpl.Execute(page, table)
 	if err != nil {
 		log.Println(err)
 	}

root.go 🔗

@@ -5,11 +5,11 @@
 package main
 
 import (
-	"fmt"
 	"io"
 	"log"
 	"net/http"
 	"net/url"
+	"strconv"
 	"strings"
 
 	"github.com/dchest/uniuri"
@@ -54,7 +54,32 @@ func (m model) root(writer http.ResponseWriter, request *http.Request) {
 
 	action := query.Get("action")
 	if len(action) == 0 {
-		_, err = io.WriteString(writer, m.authenticated())
+		start := query.Get("start")
+		end := query.Get("end")
+
+		if len(start) > 0 && len(end) > 0 {
+			http.Error(writer, "Submit either start OR end parameter, not both", 400)
+		}
+
+		countQuery := query.Get("count")
+		var count int
+		if len(countQuery) == 0 {
+			count = 20
+		} else {
+			count, err = strconv.Atoi(countQuery)
+			if err != nil {
+				http.Error(writer, err.Error(), 400)
+				return
+			}
+		}
+
+		links, err := m.read(start, end, count)
+		if err != nil {
+			http.Error(writer, err.Error(), 400)
+			return
+		}
+
+		_, err = io.WriteString(writer, m.authenticated(links))
 		if err != nil {
 			log.Println(err)
 		}
@@ -139,33 +164,3 @@ func (m model) root(writer http.ResponseWriter, request *http.Request) {
 		http.Redirect(writer, request, "/?message="+message, 302)
 	}
 }
-
-func (m model) genTable() string {
-	var table string
-	err := m.database.View(func(txn *badger.Txn) error {
-		opts := badger.DefaultIteratorOptions
-		opts.PrefetchSize = 10
-		iterator := txn.NewIterator(opts)
-		defer iterator.Close()
-		for iterator.Rewind(); iterator.Valid(); iterator.Next() {
-			item := iterator.Item()
-			k := item.Key()
-			err := item.Value(func(v []byte) error {
-				table = table + fmt.Sprintf(`<tr>
-	<td><p>%s</p></td>
-	<td><p>%s</p></td>
-	<td><a class="button" href="/?action=edit&name=%s&url=%s">Edit</a><a class="button" href="/?action=delete&name=%s">Delete</a></td>
-</tr>`, k, v, k, url.QueryEscape(string(v)), k)
-				return nil
-			})
-			if err != nil {
-				return err
-			}
-		}
-		return nil
-	})
-	if err != nil {
-		return err.Error()
-	}
-	return table
-}