update.go

 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) update(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}