Implement update function

Amolith created

Change summary

update.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)

Detailed changes

update.go 🔗

@@ -0,0 +1,72 @@
+package main
+
+import (
+	"fmt"
+	"log"
+	"net/http"
+	"strings"
+
+	"github.com/dgraph-io/badger/v3"
+)
+
+func (m *model) update(writer http.ResponseWriter, request *http.Request) {
+	query := request.URL.Query()
+
+	token := request.Header.Get("Authorization")
+	token = strings.TrimPrefix(token, "Bearer ")
+
+	if token != m.AccessToken {
+		http.Error(writer, "401 Unauthorized: You do not have permission to edit shortlinks", 403)
+		return
+	}
+
+	name := query.Get("name")
+	new_name := query.Get("new_name")
+	new_url := query.Get("new_url")
+
+	if len(name) == 0 {
+		http.Error(writer, "400 Bad Request: name parameter is required", 400)
+		return
+	}
+
+	if len(new_name) == 0 && len(new_url) == 0 {
+		http.Error(writer, "400 Bad Request: You may update either the entry's URL or name but not both", 400)
+		return
+	}
+
+	if len(new_name) != 0 {
+		if m.nameExists(new_name) {
+			http.Error(writer, "406 Not Acceptable: A shortened URL with this name already exists", 406)
+			return
+		}
+		name = new_name
+	}
+
+	var url string
+	err := m.database.View(func(txn *badger.Txn) error {
+		value, err := txn.Get([]byte(name))
+		if err != nil {
+			return err
+		}
+		url = value.String()
+		return nil
+	})
+	if err != nil {
+		log.Println("Error", err)
+	}
+
+	if len(new_url) != 0 {
+		url = new_url
+	}
+
+	log.Println("Mapping \"" + name + "\" to \"" + url + "\"")
+
+	err = m.database.Update(func(txn *badger.Txn) error {
+		return txn.Set([]byte(name), []byte(url))
+	})
+	if err != nil {
+		log.Println(err)
+	}
+
+	http.Error(writer, fmt.Sprint("\"", name, "\" mapped to \"", url, "\""), 200)
+}