Add /get route that returns JSON

Amolith created

Change summary

getlinks.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
main.go     |  1 +
2 files changed, 52 insertions(+)

Detailed changes

getlinks.go 🔗

@@ -0,0 +1,51 @@
+package main
+
+import (
+	"encoding/json"
+	"log"
+	"net/http"
+	"strings"
+
+	"github.com/dgraph-io/badger/v3"
+)
+
+func (m model) getLinks(writer http.ResponseWriter, request *http.Request) {
+	token := request.Header.Get("Authorization")
+	token = strings.TrimPrefix(token, "Bearer ")
+	cookie, _ := request.Cookie("access_token")
+
+	if token != m.AccessToken && cookie.Value != m.AccessToken {
+		http.Error(writer, "401 Unauthorized: You do not have permission to view shortlinks", 403)
+		return
+	}
+
+	links := make(map[string]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 {
+				links[string(k)] = string(v)
+				return nil
+			})
+			if err != nil {
+				return err
+			}
+		}
+		return nil
+	})
+	if err != nil {
+		log.Println(err)
+	}
+
+	json, err := json.Marshal(links)
+	if err != nil {
+		log.Println(err)
+	}
+	writer.Write(json)
+}

main.go 🔗

@@ -58,6 +58,7 @@ func main() {
 	mux.HandleFunc("/create", m.create)
 	mux.HandleFunc("/delete", m.delete)
 	mux.HandleFunc("/edit", m.edit)
+	mux.HandleFunc("/get", m.getLinks)
 
 	if err = httpServer.ListenAndServe(); err == http.ErrServerClosed {
 		log.Println("Web server closed")