apps/jotts/cmd_server.go 1.4 K raw
1
package main
2
3
import (
4
	"html/template"
5
	"log"
6
	"log/slog"
7
	"net/http"
8
	"os"
9
10
	"github.com/stevedylandev/andromeda/pkg/auth"
11
	"github.com/stevedylandev/andromeda/pkg/config"
12
)
13
14
func runServer(args []string) {
15
	config.LoadDotEnv(".env")
16
	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
17
18
	dbPath := config.Getenv("JOTTS_DB_PATH", "jotts.sqlite")
19
	db, err := openDB(dbPath)
20
	if err != nil {
21
		log.Fatal(err)
22
	}
23
	defer db.Close()
24
25
	sessions := &auth.Store{DB: db, CookieName: "session", CookieSecure: config.GetenvBool("COOKIE_SECURE", false)}
26
	if err := sessions.EnsureSchema(); err != nil {
27
		log.Fatal(err)
28
	}
29
	sessions.PruneExpired()
30
31
	tmpl := template.Must(template.ParseFS(appFS, "templates/*.html"))
32
33
	password := os.Getenv("JOTTS_PASSWORD")
34
	if password == "" {
35
		logger.Warn("JOTTS_PASSWORD not set, using default 'changeme'")
36
		password = "changeme"
37
	}
38
	apiKey := os.Getenv("JOTTS_API_KEY")
39
	if apiKey == "" {
40
		logger.Info("JOTTS_API_KEY not set, /api/* will return 403")
41
	}
42
43
	app := &App{
44
		DB:           db,
45
		Log:          logger,
46
		Templates:    tmpl,
47
		Sessions:     sessions,
48
		Password:     password,
49
		APIKey:       apiKey,
50
		CookieSecure: sessions.CookieSecure,
51
	}
52
53
	addr := config.Getenv("HOST", "127.0.0.1") + ":" + config.Getenv("PORT", "3000")
54
	logger.Info("jotts server running", "addr", addr)
55
	if err := http.ListenAndServe(addr, app.routes()); err != nil {
56
		log.Fatal(err)
57
	}
58
}