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	cookie, err := request.Cookie("access_token")
19
20	if token != m.AccessToken && cookie.Value != m.AccessToken {
21		http.Error(writer, "401 Unauthorized: You do not have permission to create shortlinks", 403)
22		return
23	}
24
25	url := query.Get("url")
26	if len(url) == 0 {
27		http.Error(writer, "400 Bad Request: URL parameter is required", 400)
28		return
29	}
30
31	name := query.Get("name")
32	if len(name) == 0 {
33		for {
34			name = uniuri.NewLen(4)
35			if !m.nameExists(name) {
36				break
37			}
38		}
39	} else if m.nameExists(name) {
40		http.Error(writer, "406 Not Acceptable: A shortened URL with this name already exists", 406)
41		return
42	}
43
44	log.Println("Saving \"" + url + "\" mapped to \"" + name + "\"")
45
46	err := m.database.Update(func(txn *badger.Txn) error {
47		return txn.Set([]byte(name), []byte(url))
48	})
49	if err != nil {
50		log.Fatal(err)
51	}
52
53	http.Error(writer, fmt.Sprint("URL mapped to "+name), 200)
54}
55
56func (m model) nameExists(name string) bool {
57	err := m.database.View(func(txn *badger.Txn) error {
58		_, err := txn.Get([]byte(name))
59		if err != nil {
60			return err
61		}
62		return nil
63	})
64	if err != nil {
65		return true
66	}
67	return false
68}