package main import ( "context" "encoding/json" "net/http" ) func handleListDags(executor *Executor) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { dags, err := executor.ListDAGs() if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, dags) } } func handleGetDag(executor *Executor) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") info, dag, validation, err := executor.GetDAG(name) if err != nil { writeError(w, http.StatusNotFound, err.Error()) return } // Get recent runs. runs, _, _ := executor.store.ListRuns(dag.Name, 10, 0) resp := map[string]interface{}{ "info": info, "dag": dag, "validation": validation, "runs": runs, } writeJSON(w, http.StatusOK, resp) } } func handleRunDag(executor *Executor) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") info, _, _, err := executor.GetDAG(name) if err != nil { writeError(w, http.StatusNotFound, err.Error()) return } // Execute asynchronously. go func() { ctx := context.Background() executor.ExecuteDAG(ctx, info.FilePath, "api") }() // Return run acknowledgment. writeJSON(w, http.StatusAccepted, map[string]string{ "status": "accepted", "dag": name, "message": "DAG execution started", }) } } // --- JSON helpers --- func writeJSON(w http.ResponseWriter, status int, data interface{}) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) json.NewEncoder(w).Encode(data) } func writeError(w http.ResponseWriter, status int, msg string) { writeJSON(w, status, map[string]string{"error": msg}) }