apps/cellar/main.go 1.6 K raw
1
package main
2
3
import (
4
	"log"
5
	"log/slog"
6
	"net/http"
7
	"os"
8
	"strings"
9
10
	"github.com/stevedylandev/andromeda/pkg/auth"
11
	"github.com/stevedylandev/andromeda/pkg/config"
12
	"github.com/stevedylandev/andromeda/pkg/sqlite"
13
)
14
15
func main() {
16
	config.LoadDotEnv(".env")
17
	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
18
19
	dbPath := config.Getenv("CELLAR_DB_PATH", "cellar.sqlite")
20
	db, err := sqlite.Open(dbPath, cellarSchema)
21
	if err != nil {
22
		log.Fatal(err)
23
	}
24
	defer db.Close()
25
26
	password := os.Getenv("CELLAR_PASSWORD")
27
	if password == "" {
28
		logger.Warn("CELLAR_PASSWORD not set, using default 'changeme'")
29
		password = "changeme"
30
	}
31
32
	sessions := &auth.Store{DB: db, CookieName: "session", CookieSecure: config.GetenvBool("COOKIE_SECURE", false)}
33
	if err := sessions.EnsureSchema(); err != nil {
34
		log.Fatal(err)
35
	}
36
	sessions.PruneExpired()
37
38
	tmpl, err := buildTemplates()
39
	if err != nil {
40
		log.Fatal(err)
41
	}
42
	app := &App{
43
		DB:              db,
44
		Log:             logger,
45
		Templates:       tmpl,
46
		Sessions:        sessions,
47
		AppPassword:     password,
48
		CookieSecure:    sessions.CookieSecure,
49
		AnthropicAPIKey: os.Getenv("ANTHROPIC_API_KEY"),
50
		SiteURL:         strings.TrimRight(config.Getenv("SITE_URL", "http://localhost:3000"), "/"),
51
		SiteTitle:       config.Getenv("SITE_TITLE", "Cellar"),
52
		SiteDescription: config.Getenv("SITE_DESCRIPTION", "Personal wine tasting log"),
53
	}
54
55
	addr := config.Getenv("HOST", "127.0.0.1") + ":" + config.Getenv("PORT", "3000")
56
	logger.Info("cellar server running", "addr", addr)
57
	if err := http.ListenAndServe(addr, app.routes()); err != nil {
58
		log.Fatal(err)
59
	}
60
}