package main import ( "embed" "log" "net/http" "os" "strconv" "strings" "gocheck/handlers" "gocheck/static" ) //go:embed all:frontend/dist var staticFiles embed.FS func main() { // Ensure data directory exists if err := os.MkdirAll("data", 0755); err != nil { log.Fatalf("Failed to create data directory: %v", err) } // Start the lock expiry daemon handlers.StartLockExpiryDaemon() // Register API handlers first http.HandleFunc("/api/checklists", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { handlers.HandleCreateChecklist(w, r) } else { http.NotFound(w, r) } }) http.HandleFunc("/api/checklists/", func(w http.ResponseWriter, r *http.Request) { path := r.URL.Path log.Printf("API request: %s %s", r.Method, path) switch { case strings.HasSuffix(path, "/name") && r.Method == "PATCH": log.Printf("Handling PATCH checklist name") handlers.HandleUpdateChecklistName(w, r) case strings.HasSuffix(path, "/items") && r.Method == "GET": log.Printf("Handling GET items") handlers.HandleGetItems(w, r) case strings.HasSuffix(path, "/items") && r.Method == "POST": log.Printf("Handling POST items") handlers.HandleAddItem(w, r) case strings.Contains(path, "/items/") && strings.HasSuffix(path, "/lock") && r.Method == "POST": log.Printf("Handling lock item") handlers.HandleLockItem(w, r) case strings.Contains(path, "/items/") && r.Method == "PATCH": log.Printf("Handling PATCH item") handlers.HandleUpdateItem(w, r) case strings.Contains(path, "/items/") && r.Method == "DELETE": log.Printf("Handling DELETE item") handlers.HandleDeleteItem(w, r) case strings.HasSuffix(path, "/sse") && r.Method == "GET": log.Printf("Handling SSE") handlers.HandleSSE(w, r) default: log.Printf("No handler found for %s %s", r.Method, path) http.NotFound(w, r) } }) // Serve static files from embedded filesystem (register last) http.Handle("/", static.CompressionFileServer(staticFiles)) port := strings.TrimSpace(os.Getenv("PORT")) if port == "" { port = "8080" } parsedPort, err := strconv.Atoi(port) if err != nil { log.Fatalf("Invalid PORT environment variable: %v", err) } log.Printf("Listening on :%d", parsedPort) log.Printf("Frontend available at: http://localhost:%d", parsedPort) log.Fatal(http.ListenAndServe(":"+port, nil)) }