create.go

 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		name = uniuri.NewLen(4)
34		for !m.nameExists(name) {
35			name = uniuri.NewLen(4)
36			log.Println("Generated new name:", name)
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	writer.Write([]byte(fmt.Sprint("URL mapped to ", name, "\n")))
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}