package main import ( "log" "net/http" "time" "github.com/domagojzecevic/cammonitor/internal/auth" "github.com/domagojzecevic/cammonitor/internal/config" "github.com/domagojzecevic/cammonitor/internal/db" "github.com/domagojzecevic/cammonitor/internal/footage" "github.com/domagojzecevic/cammonitor/internal/web" ) func main() { cfg, err := config.Load() if err != nil { log.Fatalf("load config: %v", err) } database, err := db.Open(cfg.DBPath) if err != nil { log.Fatalf("open database: %v", err) } defer database.Close() authStore := auth.NewStore(database) if err := authStore.EnsureAdmin(cfg.AdminUser, cfg.AdminPass); err != nil { log.Fatalf("ensure admin: %v", err) } go purgeExpiredSessions(authStore) footageIndex := footage.NewIndex(cfg.FootageRoot, cfg.ScanInterval) defer footageIndex.Close() router := web.NewRouter(cfg, database, footageIndex) log.Printf("listening on %s", cfg.ListenAddr) if err := http.ListenAndServe(cfg.ListenAddr, router); err != nil { log.Fatalf("server stopped: %v", err) } } func purgeExpiredSessions(store *auth.Store) { ticker := time.NewTicker(time.Hour) defer ticker.Stop() for range ticker.C { if err := store.PurgeExpiredSessions(); err != nil { log.Printf("purge expired sessions: %v", err) } } }