1package main
2
3import (
4 "fmt"
5 "log"
6 "net/http"
7 "strings"
8
9 "github.com/dgraph-io/badger/v3"
10)
11
12func (m *model) updateHandler(writer http.ResponseWriter, request *http.Request) {
13 query := request.URL.Query()
14
15 token := request.Header.Get("Authorization")
16 token = strings.TrimPrefix(token, "Bearer ")
17
18 if token != m.AccessToken {
19 http.Error(writer, "401 Unauthorized: You do not have permission to edit shortlinks", 403)
20 return
21 }
22
23 name := query.Get("name")
24 new_name := query.Get("new_name")
25 new_url := query.Get("new_url")
26
27 if len(name) == 0 {
28 http.Error(writer, "400 Bad Request: name parameter is required", 400)
29 return
30 }
31
32 if len(new_name) == 0 && len(new_url) == 0 {
33 http.Error(writer, "400 Bad Request: You may update either the entry's URL or name but not both", 400)
34 return
35 }
36
37 if len(new_name) != 0 {
38 if m.nameExists(new_name) {
39 http.Error(writer, "406 Not Acceptable: A shortened URL with this name already exists", 406)
40 return
41 }
42 name = new_name
43 }
44
45 var url string
46 err := m.database.View(func(txn *badger.Txn) error {
47 value, err := txn.Get([]byte(name))
48 if err != nil {
49 return err
50 }
51 url = value.String()
52 return nil
53 })
54 if err != nil {
55 log.Println("Error", err)
56 }
57
58 if len(new_url) != 0 {
59 url = new_url
60 }
61
62 log.Println("Mapping \"" + name + "\" to \"" + url + "\"")
63
64 err = m.database.Update(func(txn *badger.Txn) error {
65 return txn.Set([]byte(name), []byte(url))
66 })
67 if err != nil {
68 log.Println(err)
69 }
70
71 http.Error(writer, fmt.Sprint("\"", name, "\" mapped to \"", url, "\""), 200)
72}