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	if err == nil {
 64		return true
 65	}
 66	return false
 67}
 68
 69// unauthenticated serves the unauthenticated home page to the visitor
 70func unauthenticated() string {
 71	home, err := templates.ReadFile("templates/home_unauthenticated.html")
 72	if err != nil {
 73		log.Fatalln(err)
 74	}
 75	return string(home)
 76}
 77
 78// authenticated serves the authenticated dashboard to the user
 79func (m model) authenticated() string {
 80	dash, err := templates.ReadFile("templates/home_authenticated.html")
 81	if err != nil {
 82		log.Fatalln(err)
 83	}
 84	tmpl, err := template.New("authenticated").Parse(string(dash))
 85	page := new(strings.Builder)
 86	tmpl.Execute(page, m.genTable())
 87	return page.String()
 88}
 89
 90type EditFields struct {
 91	URL  string
 92	Name string
 93}
 94
 95// update serves the editing interface to the user
 96func (m model) edit(name string, url string) string {
 97	fields := EditFields{url, name}
 98	editPage, err := templates.ReadFile("templates/edit.html")
 99	if err != nil {
100		log.Fatalln(err)
101	}
102	tmpl, err := template.New("editPage").Parse(string(editPage))
103	page := new(strings.Builder)
104	tmpl.Execute(page, fields)
105	return page.String()
106}