apps/feeds/main.go 1.9 K raw
1
package main
2
3
import (
4
	"context"
5
	"html/template"
6
	"log"
7
	"log/slog"
8
	"net/http"
9
	"os"
10
11
	"github.com/stevedylandev/andromeda/pkg/auth"
12
	"github.com/stevedylandev/andromeda/pkg/config"
13
	"github.com/stevedylandev/andromeda/pkg/sqlite"
14
15
	_ "golang.org/x/crypto/x509roots/fallback"
16
)
17
18
func main() {
19
	config.LoadDotEnv(".env")
20
	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
21
22
	dbPath := config.Getenv("FEEDS_DB_PATH", "feeds.sqlite")
23
	db, err := sqlite.Open(dbPath, feedsSchema)
24
	if err != nil {
25
		log.Fatal(err)
26
	}
27
	defer db.Close()
28
29
	defaultPoll := config.GetenvInt("DEFAULT_POLL_MINUTES", 30)
30
	itemCap := config.GetenvInt("ITEM_CAP_PER_FEED", 200)
31
	if err := seedSettings(db, defaultPoll); err != nil {
32
		log.Fatal(err)
33
	}
34
35
	sessions := &auth.Store{DB: db, CookieName: "feeds_session", CookieSecure: config.GetenvBool("COOKIE_SECURE", false)}
36
	if err := sessions.EnsureSchema(); err != nil {
37
		log.Fatal(err)
38
	}
39
	sessions.PruneExpired()
40
41
	tmpl := template.Must(template.New("").Funcs(template.FuncMap{"safeURL": func(s string) string { return s }}).ParseFS(appFS, "templates/*.html"))
42
	app := &App{
43
		DB:                 db,
44
		Log:                logger,
45
		Templates:          tmpl,
46
		Sessions:           sessions,
47
		AdminPassword:      os.Getenv("ADMIN_PASSWORD"),
48
		APIKey:             os.Getenv("API_KEY"),
49
		CookieSecure:       sessions.CookieSecure,
50
		BaseURL:            config.Getenv("BASE_URL", "http://localhost:3000"),
51
		DefaultPollMinutes: defaultPoll,
52
		ItemCap:            itemCap,
53
	}
54
	if app.APIKey == "" {
55
		logger.Warn("API_KEY is not set; API requires session cookie only")
56
	}
57
	go app.poller(context.Background())
58
59
	addr := config.Getenv("HOST", "0.0.0.0") + ":" + config.Getenv("PORT", "3000")
60
	logger.Info("feeds server running", "addr", addr)
61
	if err := http.ListenAndServe(addr, app.routes()); err != nil {
62
		log.Fatal(err)
63
	}
64
}