helperfuncs.go

  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}