Files
ai-workflow/inbox/internal/httpapi/tasks.go
T

196 lines
6.4 KiB
Go

package httpapi
import (
"net/http"
tasksapp "inbox/internal/app/tasks"
"inbox/internal/base/httpx"
"inbox/internal/domain/task"
)
func (h *Handler) listTasks(w http.ResponseWriter, r *http.Request) {
items, err := h.Tasks.ListByTopic(r.Context(), r.PathValue("topicID"))
if err != nil {
writeStoreError(w, err)
return
}
httpx.WriteJSON(w, http.StatusOK, map[string]any{"tasks": items})
}
func (h *Handler) createTask(w http.ResponseWriter, r *http.Request) {
type dependency struct {
DependsOnTaskID string `json:"depends_on_task_id"`
}
type request struct {
WorkspaceID string `json:"workspace_id"`
LaneID string `json:"lane_id"`
Title string `json:"title"`
BodyMarkdown string `json:"body_markdown"`
AcceptanceMarkdown string `json:"acceptance_markdown"`
Kind string `json:"kind"`
Deliverables []string `json:"deliverables"`
BatchKey string `json:"batch_key"`
Status string `json:"status"`
Priority int `json:"priority"`
TaskOrder int `json:"task_order"`
CreatedByRoleName string `json:"created_by_role_name"`
Dependencies []dependency `json:"dependencies"`
}
var req request
if err := httpx.DecodeJSON(r, &req); err != nil {
httpx.WriteError(w, http.StatusBadRequest, err.Error())
return
}
deps := make([]task.Dependency, 0, len(req.Dependencies))
for _, dep := range req.Dependencies {
deps = append(deps, task.Dependency{
DependsOnTaskID: dep.DependsOnTaskID,
})
}
item, err := h.Tasks.Create(r.Context(), tasksapp.CreateInput{
Task: task.Record{
WorkspaceID: req.WorkspaceID,
TopicID: r.PathValue("topicID"),
LaneID: req.LaneID,
Title: req.Title,
BodyMarkdown: req.BodyMarkdown,
AcceptanceMarkdown: req.AcceptanceMarkdown,
Kind: task.Kind(req.Kind),
Deliverables: req.Deliverables,
BatchKey: req.BatchKey,
Status: task.Status(req.Status),
Priority: req.Priority,
TaskOrder: req.TaskOrder,
CreatedByRoleName: req.CreatedByRoleName,
},
Dependencies: deps,
})
if err != nil {
writeStoreError(w, err)
return
}
httpx.WriteJSON(w, http.StatusCreated, item)
}
func (h *Handler) listLaneTasks(w http.ResponseWriter, r *http.Request) {
items, err := h.Tasks.ListByLane(r.Context(), r.PathValue("laneID"))
if err != nil {
writeStoreError(w, err)
return
}
httpx.WriteJSON(w, http.StatusOK, map[string]any{"tasks": items})
}
func (h *Handler) getTask(w http.ResponseWriter, r *http.Request) {
item, err := h.Tasks.Get(r.Context(), r.PathValue("taskID"))
if err != nil {
writeStoreError(w, err)
return
}
httpx.WriteJSON(w, http.StatusOK, item)
}
func (h *Handler) patchTask(w http.ResponseWriter, r *http.Request) {
type dependency struct {
DependsOnTaskID string `json:"depends_on_task_id"`
}
type request struct {
Title *string `json:"title"`
BodyMarkdown *string `json:"body_markdown"`
AcceptanceMarkdown *string `json:"acceptance_markdown"`
Kind *task.Kind `json:"kind"`
Deliverables *[]string `json:"deliverables"`
BatchKey *string `json:"batch_key"`
Status *task.Status `json:"status"`
Priority *int `json:"priority"`
TaskOrder *int `json:"task_order"`
BlockingReasonMarkdown *string `json:"blocking_reason_markdown"`
ResultSummaryMarkdown *string `json:"result_summary_markdown"`
AssignedRunID *string `json:"assigned_run_id"`
StartedAt *string `json:"started_at"`
CompletedAt *string `json:"completed_at"`
Dependencies *[]dependency `json:"dependencies"`
UpdatedBy string `json:"updated_by"`
}
var req request
if err := httpx.DecodeJSON(r, &req); err != nil {
httpx.WriteError(w, http.StatusBadRequest, err.Error())
return
}
var deps *[]task.Dependency
if req.Dependencies != nil {
items := make([]task.Dependency, 0, len(*req.Dependencies))
for _, dep := range *req.Dependencies {
items = append(items, task.Dependency{
TaskID: r.PathValue("taskID"),
DependsOnTaskID: dep.DependsOnTaskID,
})
}
deps = &items
}
item, err := h.Tasks.Patch(r.Context(), r.PathValue("taskID"), tasksapp.Patch{
Title: req.Title,
BodyMarkdown: req.BodyMarkdown,
AcceptanceMarkdown: req.AcceptanceMarkdown,
Kind: req.Kind,
Deliverables: req.Deliverables,
BatchKey: req.BatchKey,
Status: req.Status,
Priority: req.Priority,
TaskOrder: req.TaskOrder,
BlockingReasonMarkdown: req.BlockingReasonMarkdown,
ResultSummaryMarkdown: req.ResultSummaryMarkdown,
AssignedRunID: req.AssignedRunID,
StartedAt: req.StartedAt,
CompletedAt: req.CompletedAt,
Dependencies: deps,
}, req.UpdatedBy)
if err != nil {
writeStoreError(w, err)
return
}
httpx.WriteJSON(w, http.StatusOK, item)
}
func (h *Handler) listTaskDependencies(w http.ResponseWriter, r *http.Request) {
items, err := h.Tasks.Dependencies(r.Context(), r.PathValue("taskID"))
if err != nil {
writeStoreError(w, err)
return
}
httpx.WriteJSON(w, http.StatusOK, map[string]any{"dependencies": items})
}
func (h *Handler) listTaskEvents(w http.ResponseWriter, r *http.Request) {
items, err := h.Tasks.Events(r.Context(), r.PathValue("taskID"))
if err != nil {
writeStoreError(w, err)
return
}
httpx.WriteJSON(w, http.StatusOK, map[string]any{"events": items})
}
func (h *Handler) appendTaskEvent(w http.ResponseWriter, r *http.Request) {
type request struct {
EventType string `json:"event_type"`
BodyMarkdown string `json:"body_markdown"`
CreatedByRoleName string `json:"created_by_role_name"`
}
var req request
if err := httpx.DecodeJSON(r, &req); err != nil {
httpx.WriteError(w, http.StatusBadRequest, err.Error())
return
}
item, err := h.Tasks.AppendEvent(r.Context(), task.Event{
TaskID: r.PathValue("taskID"),
EventType: req.EventType,
BodyMarkdown: req.BodyMarkdown,
CreatedByRoleName: req.CreatedByRoleName,
})
if err != nil {
writeStoreError(w, err)
return
}
httpx.WriteJSON(w, http.StatusCreated, item)
}