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