1package main
2
3import (
4 "fmt"
5 "log"
6 "strings"
7 "text/template"
8
9 "github.com/dgraph-io/badger/v3"
10)
11
12// Create shortens a given URL with an optional name. If a name is provided,
13// that name will be used. Otherwise, 4-character string will be generated and
14// used instead.
15func (m model) create(name string, url string) string {
16 err := m.database.Update(func(txn *badger.Txn) error {
17 return txn.Set([]byte(name), []byte(url))
18 })
19 if err != nil {
20 return fmt.Sprint(err)
21 }
22
23 log.Println("\"" + url + "\" mapped to \"" + name + "\"")
24 return fmt.Sprint("URL mapped to ", name, "\n")
25}
26
27// Update modifies a shortened link
28func (m model) update(name string, url string, oldName string) string {
29 m.create(name, url)
30 if name != oldName {
31 m.delete(oldName)
32 }
33 return fmt.Sprint("\"" + url + "\" mapped to \"" + name + "\"")
34}
35
36// Delete removes a shortened URL from the database given its name.
37func (m model) delete(name string) string {
38 err := m.database.Update(func(txn *badger.Txn) error {
39 return txn.Delete([]byte(name))
40 })
41 if err != nil {
42 return fmt.Sprint(err)
43 }
44
45 log.Println("\"" + name + "\" has been deleted")
46 return fmt.Sprint("\"" + name + "\" has been deleted\n")
47}
48
49// nameExists returns true if the provided name is already stored in the
50// database and false if it's not.
51func (m model) nameExists(name string) bool {
52 err := m.database.View(func(txn *badger.Txn) error {
53 _, err := txn.Get([]byte(name))
54 if err != nil {
55 return err
56 }
57 return nil
58 })
59 if err == nil {
60 return true
61 }
62 return false
63}
64
65// unauthenticated serves the unauthenticated home page to the visitor
66func unauthenticated() string {
67 home, err := templates.ReadFile("templates/home_unauthenticated.html")
68 if err != nil {
69 log.Fatalln(err)
70 }
71 return string(home)
72}
73
74// authenticated serves the authenticated dashboard to the user
75func (m model) authenticated() string {
76 dash, err := templates.ReadFile("templates/home_authenticated.html")
77 if err != nil {
78 log.Fatalln(err)
79 }
80 tmpl, err := template.New("authenticated").Parse(string(dash))
81 page := new(strings.Builder)
82 tmpl.Execute(page, m.genTable())
83 return page.String()
84}
85
86type EditFields struct {
87 URL string
88 Name string
89}
90
91// update serves the editing interface to the user
92func (m model) edit(name string, url string) string {
93 fields := EditFields{url, name}
94 editPage, err := templates.ReadFile("templates/edit.html")
95 if err != nil {
96 log.Fatalln(err)
97 }
98 tmpl, err := template.New("editPage").Parse(string(editPage))
99 page := new(strings.Builder)
100 tmpl.Execute(page, fields)
101 return page.String()
102}