From 76c518b82b298debe5126d18fc65e5593674e83a Mon Sep 17 00:00:00 2001 From: Amolith Date: Sat, 5 Feb 2022 01:30:20 -0500 Subject: [PATCH] Implement update function --- update.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 update.go diff --git a/update.go b/update.go new file mode 100644 index 0000000000000000000000000000000000000000..80d0eb825f91e92434a5f004f1b70cc47a09e711 --- /dev/null +++ b/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) +}