package main import ( "context" "flag" "log" "net/http" "os" "path/filepath" "donniemarko/internal/render" "donniemarko/internal/scanner" "donniemarko/internal/service" "donniemarko/internal/storage" "donniemarko/internal/web" ) func main() { // Define command line flags var help bool rootFolder := flag.String("root", ".", "Root folder to serve files from") listenAddr := flag.String("addr", "localhost:5555", "Address to listen on") dbPath := flag.String("db", "", "SQLite database path (empty uses ~/.local/share/donniemarko/notes.db)") logPath := flag.String("log", "/var/log/donniemarko.log", "Log file path") flag.BoolVar(&help, "help", false, "display this program usage") flag.Parse() if help { flag.PrintDefaults() return } // Initialize storage var noteStorage storage.Storage var sqliteStorage *storage.SQLiteStorage resolvedDBPath := *dbPath if resolvedDBPath == "" { homeDir, err := os.UserHomeDir() if err != nil { log.Fatalf("failed to resolve home directory: %v", err) } resolvedDBPath = filepath.Join(homeDir, ".local", "share", "donniemarko", "notes.db") } if err := os.MkdirAll(filepath.Dir(resolvedDBPath), 0o700); err != nil { log.Fatalf("failed to create database directory: %v", err) } var err error sqliteStorage, err = storage.NewSQLiteStorage(resolvedDBPath) if err != nil { log.Fatalf("failed to open sqlite db: %v", err) } defer func() { if err := sqliteStorage.Close(); err != nil { log.Printf("failed to close sqlite db: %v", err) } }() noteStorage = sqliteStorage if f, err := os.OpenFile(*logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644); err == nil { log.SetOutput(f) } else { log.Printf("failed to open log file %s: %v", *logPath, err) } // Initialize scanner monitor := scanner.NewScanner(*rootFolder) monitor.SeedExisting(noteStorage.GetAll()) // Initialize notes handler for scanner notesHandler := scanner.NewNotesHandler(noteStorage, *rootFolder) monitor.SetHandler(notesHandler) // Initialize service noteService := service.NewNoteService() noteService.SetStorage(noteStorage) // Start scanner in background ctx := context.Background() go monitor.Monitor(ctx) // log.Println("WE GET THERE", len(noteStorage.Index)) // Initialize template manager tm := render.NewTemplateManagerFS(web.TemplatesFS(), "") // Initialize web handler handler := web.NewHandler(noteService, tm) // Setup routes handler.SetupRoutes() log.Printf("Serving on http://%s", *listenAddr) log.Fatal(http.ListenAndServe(*listenAddr, nil)) }