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}