diff --git a/cmd/goondex/main.go b/cmd/goondex/main.go index f9c54ac..fe01ffc 100644 --- a/cmd/goondex/main.go +++ b/cmd/goondex/main.go @@ -480,7 +480,7 @@ var webCmd = &cobra.Command{ } defer database.Close() - server, err := web.NewServer(database, addr) + server, err := web.NewServer(database, addr, dbPath) if err != nil { return fmt.Errorf("failed to create web server: %w", err) } diff --git a/internal/web/server.go b/internal/web/server.go index cc4ec19..0723985 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -9,6 +9,7 @@ import ( "io/fs" "log" "net/http" + "os" "strconv" "strings" "time" @@ -33,9 +34,10 @@ type Server struct { db *db.DB templates *template.Template addr string + dbPath string } -func NewServer(database *db.DB, addr string) (*Server, error) { +func NewServer(database *db.DB, addr string, dbPath string) (*Server, error) { tmpl, err := template.ParseFS(content, "templates/*.html") if err != nil { return nil, fmt.Errorf("failed to parse templates: %w", err) @@ -45,6 +47,7 @@ func NewServer(database *db.DB, addr string) (*Server, error) { db: database, templates: tmpl, addr: addr, + dbPath: dbPath, }, nil } @@ -91,6 +94,7 @@ func (s *Server) Start() error { // Settings endpoints mux.HandleFunc("/api/settings/api-keys", s.handleAPISettingsKeys) + mux.HandleFunc("/api/settings/database", s.handleAPIDatabase) // API mux.HandleFunc("/api/import/performer", s.handleAPIImportPerformer) @@ -1369,6 +1373,7 @@ func (s *Server) handleSettingsPage(w http.ResponseWriter, r *http.Request) { data := map[string]interface{}{ "PageTitle": "Settings", "ActivePage": "settings", + "DBPath": s.dbPath, } s.render(w, "settings.html", data) @@ -1427,3 +1432,40 @@ func (s *Server) handleAPISettingsKeys(w http.ResponseWriter, r *http.Request) { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } } + +// Database management +func (s *Server) handleAPIDatabase(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodGet: + info := map[string]interface{}{ + "path": s.dbPath, + } + if stat, err := os.Stat(s.dbPath); err == nil { + info["size_bytes"] = stat.Size() + info["size_mb"] = float64(stat.Size()) / (1024 * 1024) + } + json.NewEncoder(w).Encode(APIResponse{ + Success: true, + Message: "OK", + Data: info, + }) + case http.MethodDelete: + // Close and recreate + if s.db != nil { + _ = s.db.Close() + } + _ = os.Remove(s.dbPath) + newDB, err := db.Open(s.dbPath) + if err != nil { + json.NewEncoder(w).Encode(APIResponse{Success: false, Message: fmt.Sprintf("Failed to recreate DB: %v", err)}) + return + } + s.db = newDB + json.NewEncoder(w).Encode(APIResponse{ + Success: true, + Message: "Database deleted and recreated.", + }) + default: + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + } +} diff --git a/internal/web/templates/settings.html b/internal/web/templates/settings.html index 01b5686..e73ab49 100644 --- a/internal/web/templates/settings.html +++ b/internal/web/templates/settings.html @@ -34,6 +34,16 @@
+ +Current database: {{.DBPath}}