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}