Add server-side workflows with YAML files, task freeze and lead tools
This commit is contained in:
@@ -20,6 +20,7 @@ import (
|
||||
"g.fc.run/misc/byre/internal/git"
|
||||
"g.fc.run/misc/byre/internal/store"
|
||||
"g.fc.run/misc/byre/internal/todo"
|
||||
"g.fc.run/misc/byre/internal/workflow"
|
||||
)
|
||||
|
||||
type Server struct {
|
||||
@@ -275,9 +276,14 @@ func (s *Server) CreateTask(w http.ResponseWriter, r *http.Request, projectID st
|
||||
return
|
||||
}
|
||||
|
||||
t, err := s.agents.CreateTask(r.Context(), p, req.Title, actor(r), p.DefaultBranch, actor(r))
|
||||
workflowName := ""
|
||||
if req.Workflow != nil {
|
||||
workflowName = *req.Workflow
|
||||
}
|
||||
|
||||
t, err := s.agents.CreateTask(r.Context(), p, req.Title, actor(r), p.DefaultBranch, actor(r), workflowName)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, err)
|
||||
writeAgentError(w, err)
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusCreated, t)
|
||||
@@ -326,7 +332,7 @@ func (s *Server) StartTodoItem(w http.ResponseWriter, r *http.Request, projectID
|
||||
model = *req.Model
|
||||
}
|
||||
|
||||
t, err := s.agents.StartTodo(r.Context(), p, u, req.Title, model, u.Login)
|
||||
t, err := s.agents.StartTodo(r.Context(), p, u, req.Title, model, u.Login, "")
|
||||
if err != nil {
|
||||
writeAgentError(w, err)
|
||||
return
|
||||
@@ -694,7 +700,7 @@ func writeAgentError(w http.ResponseWriter, err error) {
|
||||
writeError(w, http.StatusNotFound, err)
|
||||
case errors.Is(err, agents.ErrConflict):
|
||||
writeError(w, http.StatusConflict, err)
|
||||
case errors.Is(err, agents.ErrInvalid), errors.Is(err, agents.ErrNoGitIdentity):
|
||||
case errors.Is(err, agents.ErrInvalid), errors.Is(err, agents.ErrNoGitIdentity), errors.Is(err, workflow.ErrInvalid):
|
||||
writeError(w, http.StatusBadRequest, err)
|
||||
default:
|
||||
writeError(w, http.StatusInternalServerError, err)
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
||||
"g.fc.run/misc/byre/internal/workflow"
|
||||
)
|
||||
|
||||
const maxWorkflowFileBytes = 1 << 20
|
||||
|
||||
func (s *Server) ListWorkflows(w http.ResponseWriter, r *http.Request) {
|
||||
workflows, err := s.store.ListWorkflows(r.Context())
|
||||
if err != nil {
|
||||
writeStoreError(w, err)
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, workflows)
|
||||
}
|
||||
|
||||
func (s *Server) GetWorkflow(w http.ResponseWriter, r *http.Request, name string) {
|
||||
file, err := s.agents.WorkflowFile(r.Context(), name)
|
||||
if err != nil {
|
||||
writeAgentError(w, err)
|
||||
return
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/yaml")
|
||||
w.Header().Set("Content-Disposition", "attachment; filename*=UTF-8''"+url.PathEscape(workflow.Filename(name)))
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Write(file)
|
||||
}
|
||||
|
||||
func (s *Server) PutWorkflow(w http.ResponseWriter, r *http.Request, name string) {
|
||||
file, err := io.ReadAll(http.MaxBytesReader(w, r.Body, maxWorkflowFileBytes))
|
||||
if err != nil {
|
||||
writeError(w, http.StatusBadRequest, fmt.Errorf("read workflow file: %w", err))
|
||||
return
|
||||
}
|
||||
summary, err := s.agents.SaveWorkflow(r.Context(), name, file, actor(r))
|
||||
if err != nil {
|
||||
writeAgentError(w, err)
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, summary)
|
||||
}
|
||||
|
||||
func (s *Server) DeleteWorkflow(w http.ResponseWriter, r *http.Request, name string) {
|
||||
err := s.store.DeleteWorkflow(r.Context(), name, actor(r))
|
||||
if err != nil {
|
||||
writeStoreError(w, err)
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func (s *Server) GetTaskWorkflow(w http.ResponseWriter, r *http.Request, taskID string) {
|
||||
tw, err := s.agents.TaskWorkflow(r.Context(), taskID)
|
||||
if err != nil {
|
||||
writeStoreError(w, err)
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, tw)
|
||||
}
|
||||
Reference in New Issue
Block a user