1// SPDX-FileCopyrightText: 2022 Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: BSD-2-Clause
 4
 5package main
 6
 7import (
 8	"embed"
 9	"log"
10	"net/http"
11
12	"github.com/dgraph-io/badger/v3"
13	flag "github.com/spf13/pflag"
14)
15
16//go:embed templates
17var templates embed.FS
18
19var flagConfig *string = flag.StringP("config", "c", "config.yaml", "Path to config file")
20
21type model struct {
22	Listen       string `yaml:"listen"`
23	AccessToken  string `yaml:"accessToken"`
24	DatabasePath string `yaml:"databasePath"`
25	database     *badger.DB
26}
27
28func (m *model) init() {
29	flag.Parse()
30	log.Println("Reading config at", *flagConfig)
31	m.parseConfig(&*flagConfig)
32	log.Println("Listening on", m.Listen)
33	if m.AccessToken == "CHANGEME" {
34		log.Fatalln("Access token *must* be changed.")
35	} else if m.AccessToken == "" {
36		log.Fatalln("Access token *must* be defined.")
37	}
38	log.Println("Reading database at", m.DatabasePath+"/")
39}
40
41func main() {
42	m := model{}
43	m.init()
44
45	db, err := badger.Open(badger.DefaultOptions(m.DatabasePath))
46	m.database = db
47	if err != nil {
48		log.Fatal(err)
49	}
50	defer m.database.Close()
51
52	mux := http.NewServeMux()
53
54	httpServer := &http.Server{
55		Addr:    m.Listen,
56		Handler: mux,
57	}
58
59	mux.HandleFunc("/", m.root)
60	mux.HandleFunc("/login", m.login)
61	mux.HandleFunc("/logout", m.logout)
62	mux.HandleFunc("/create", m.createHandler)
63	mux.HandleFunc("/read", m.readHandler)
64	mux.HandleFunc("/delete", m.deleteHandler)
65	mux.HandleFunc("/update", m.updateHandler)
66
67	if err = httpServer.ListenAndServe(); err == http.ErrServerClosed {
68		log.Println("Web server closed")
69	} else {
70		log.Fatalln(err)
71	}
72}