1package main
 2
 3import (
 4	"fmt"
 5	"io"
 6	"log"
 7	"net/http"
 8	"strings"
 9	"text/template"
10
11	"github.com/dgraph-io/badger/v3"
12)
13
14func (m model) root(writer http.ResponseWriter, request *http.Request) {
15	path := request.URL.Path
16	if path != "/" {
17		destinationKey := strings.TrimPrefix(path, "/")
18		err := m.database.View(func(txn *badger.Txn) error {
19			destinationEntry, err := txn.Get([]byte(destinationKey))
20			if err == nil {
21				destinationValue, err := destinationEntry.ValueCopy(nil)
22				if err != nil {
23					return err
24				}
25				log.Println("Redirecting visitor to \"" + string(destinationValue) + "\"")
26				http.Redirect(writer, request, string(destinationValue), 302)
27			}
28			return err
29		})
30		if err != nil {
31			io.WriteString(writer, string(err.Error()))
32		}
33		return
34	}
35
36	cookie, err := request.Cookie("access_token")
37	if err != nil {
38		home, err := templates.ReadFile("templates/home_unauthenticated.html")
39		if err != nil {
40			log.Fatalln(err)
41		}
42		io.WriteString(writer, string(home))
43		return
44	}
45
46	if cookie.Value == m.AccessToken {
47		dash, err := templates.ReadFile("templates/home_authenticated.html")
48		if err != nil {
49			log.Fatalln(err)
50		}
51		tmpl, err := template.New("authenticated").Parse(string(dash))
52		tmpl.Execute(writer, m.genTable())
53	}
54}
55
56func (m model) genTable() string {
57	var table string
58	err := m.database.View(func(txn *badger.Txn) error {
59		opts := badger.DefaultIteratorOptions
60		opts.PrefetchSize = 10
61		iterator := txn.NewIterator(opts)
62		defer iterator.Close()
63		for iterator.Rewind(); iterator.Valid(); iterator.Next() {
64			item := iterator.Item()
65			k := item.Key()
66			err := item.Value(func(v []byte) error {
67				table = table + fmt.Sprintf(`<tr>
68	<td><p>%s</p></td>
69	<td><p>%s</p></td>
70	<td><button>Edit</button><button>Delete</button></td>
71</tr>`, k, v)
72				return nil
73			})
74			if err != nil {
75				return err
76			}
77		}
78		return nil
79	})
80	if err != nil {
81		return err.Error()
82	}
83	return table
84}