apps/library/main.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
	"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("LIBRARY_DB_PATH", "library.sqlite")
20
	db, err := sqlite.Open(dbPath, booksSchema)
21
	if err != nil {
22
		log.Fatal(err)
23
	}
24
	defer db.Close()
25
26
	sessions := &auth.Store{DB: db, CookieName: "session", CookieSecure: config.GetenvBool("COOKIE_SECURE", false)}
27
	if err := sessions.EnsureSchema(); err != nil {
28
		log.Fatal(err)
29
	}
30
	sessions.PruneExpired()
31
32
	tmpl := template.Must(template.ParseFS(appFS, "templates/*.html"))
33
	app := &App{
34
		DB:             db,
35
		Log:            logger,
36
		Templates:      tmpl,
37
		Sessions:       sessions,
38
		AdminPassword:  os.Getenv("ADMIN_PASSWORD"),
39
		GoogleBooksKey: os.Getenv("GOOGLE_BOOKS_API_KEY"),
40
		CookieSecure:   sessions.CookieSecure,
41
		BaseURL:        config.Getenv("BASE_URL", "http://localhost:3000"),
42
		DisplayMode:    parseDisplayMode(config.Getenv("LIBRARY_DISPLAY_MODE", "inline")),
43
	}
44
45
	addr := config.Getenv("HOST", "0.0.0.0") + ":" + config.Getenv("PORT", "3000")
46
	logger.Info("library server running", "addr", addr)
47
	if err := http.ListenAndServe(addr, app.routes()); err != nil {
48
		log.Fatal(err)
49
	}
50
}