package api import ( "context" "net/http" "time" ) // getHealth handles GET /api/health. func (s *Server) getHealth(w http.ResponseWriter, r *http.Request) { ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) defer cancel() now := time.Now().UTC().Format(time.RFC3339) result := map[string]any{ "checked_at": now, } // Check database connectivity. if err := s.store.DB().PingContext(ctx); err != nil { result["database"] = map[string]any{"connected": false, "error": "database unreachable"} } else { result["database"] = map[string]any{"connected": true} } // Check Docker connectivity. if s.docker == nil { result["docker"] = map[string]any{ "connected": false, "error": "docker client not initialized", } } else if err := s.docker.Ping(ctx); err != nil { result["docker"] = map[string]any{ "connected": false, "error": err.Error(), } } else { result["docker"] = map[string]any{"connected": true} } // Check NPM connectivity if configured. if s.npm != nil { if err := s.npm.Ping(ctx); err != nil { result["npm"] = map[string]any{"connected": false, "error": "NPM unreachable"} } else { result["npm"] = map[string]any{"connected": true} } } respondJSON(w, http.StatusOK, result) }