d9414e4cba
Full DAG engine app with CLI subcommands (run, list, status, validate, server) and React/Mantine web frontend. Uses net/http + embedded Vite build. SQLite store for run history. Scheduler with cron_ticker for automated execution. Compatible with existing dagu YAML format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
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})
|
|
}
|