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