apps/habbits/main.go 1.5 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
	"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("HABBITS_DB_PATH", "habbits.sqlite")
20
21
	db, err := sqlite.Open(dbPath, habbitsSchema)
22
	if err != nil {
23
		log.Fatal(err)
24
	}
25
	defer db.Close()
26
27
	sessions := &auth.Store{DB: db, CookieName: "session", CookieSecure: config.GetenvBool("COOKIE_SECURE", false)}
28
	if err := sessions.EnsureSchema(); err != nil {
29
		log.Fatal(err)
30
	}
31
	sessions.PruneExpired()
32
33
	adminPassword := config.Getenv("HABBITS_PASSWORD", "")
34
	if adminPassword == "" {
35
		logger.Warn("HABBITS_PASSWORD not set; admin login is disabled")
36
	}
37
38
	tmpl := template.Must(template.ParseFS(appFS, "templates/*.html"))
39
	app := &App{
40
		DB:            db,
41
		Log:           logger,
42
		Templates:     tmpl,
43
		Sessions:      sessions,
44
		AdminPassword: adminPassword,
45
		APIKey:        config.Getenv("HABBITS_API_KEY", ""),
46
		CookieSecure:  sessions.CookieSecure,
47
		BaseURL:       config.Getenv("BASE_URL", "http://localhost:3000"),
48
	}
49
50
	addr := config.Getenv("HOST", "0.0.0.0") + ":" + config.Getenv("PORT", "3000")
51
	logger.Info("habbits server running", "addr", addr)
52
	if err := http.ListenAndServe(addr, app.routes()); err != nil {
53
		log.Fatal(err)
54
	}
55
}