apps/quotes/main.go 1.8 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("QUOTES_DB_PATH", "quotes.sqlite")
20
21
	// Seed subcommand: `quotes seed <csv>` imports classic-literature quotes
22
	// from a Goodreads-style CSV and exits. Not part of normal boot.
23
	if len(os.Args) > 1 && os.Args[1] == "seed" {
24
		csvPath := "quotes.csv"
25
		if len(os.Args) > 2 {
26
			csvPath = os.Args[2]
27
		}
28
		if err := runSeed(logger, dbPath, csvPath); err != nil {
29
			log.Fatal(err)
30
		}
31
		return
32
	}
33
34
	db, err := sqlite.Open(dbPath, quotesSchema)
35
	if err != nil {
36
		log.Fatal(err)
37
	}
38
	defer db.Close()
39
40
	sessions := &auth.Store{DB: db, CookieName: "session", CookieSecure: config.GetenvBool("COOKIE_SECURE", false)}
41
	if err := sessions.EnsureSchema(); err != nil {
42
		log.Fatal(err)
43
	}
44
	sessions.PruneExpired()
45
46
	adminPassword := config.Getenv("QUOTES_PASSWORD", "")
47
	if adminPassword == "" {
48
		logger.Warn("QUOTES_PASSWORD not set; admin login is disabled")
49
	}
50
51
	tmpl := template.Must(template.ParseFS(appFS, "templates/*.html"))
52
	app := &App{
53
		DB:            db,
54
		Log:           logger,
55
		Templates:     tmpl,
56
		Sessions:      sessions,
57
		AdminPassword: adminPassword,
58
		APIKey:        config.Getenv("QUOTES_API_KEY", ""),
59
		CookieSecure:  sessions.CookieSecure,
60
		BaseURL:       config.Getenv("BASE_URL", "http://localhost:3000"),
61
	}
62
63
	addr := config.Getenv("HOST", "0.0.0.0") + ":" + config.Getenv("PORT", "3000")
64
	logger.Info("quotes server running", "addr", addr)
65
	if err := http.ListenAndServe(addr, app.routes()); err != nil {
66
		log.Fatal(err)
67
	}
68
}