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