package api import ( "database/sql" "github.com/thepeterstone/claudomator/internal/deployment" "github.com/thepeterstone/claudomator/internal/task" ) // taskView wraps a task with computed fields that are derived from execution // history and deployment state. It is used as the JSON response type for task // list and get endpoints so that callers receive enriched data in one request. type taskView struct { *task.Task Changestats *task.Changestats `json:"changestats,omitempty"` DeploymentStatus *deployment.Status `json:"deployment_status,omitempty"` ErrorMsg string `json:"error_msg,omitempty"` } var failedStates = map[task.State]bool{ task.StateFailed: true, task.StateBudgetExceeded: true, task.StateTimedOut: true, } // enrichTask fetches the latest execution for the given task and attaches // changestats, deployment_status, and error_msg fields. func (s *Server) enrichTask(tk *task.Task) *taskView { view := &taskView{Task: tk} exec, err := s.store.GetLatestExecution(tk.ID) if err != nil { if err == sql.ErrNoRows && tk.State == task.StateReady { view.DeploymentStatus = deployment.Check(nil, tk.RepositoryURL) } return view } if failedStates[tk.State] && exec.ErrorMsg != "" { view.ErrorMsg = exec.ErrorMsg } if tk.State == task.StateReady { view.Changestats = exec.Changestats view.DeploymentStatus = deployment.Check(exec.Commits, tk.RepositoryURL) } return view }