140 lines
3.8 KiB
Go
140 lines
3.8 KiB
Go
package task
|
|
|
|
import "fmt"
|
|
|
|
type Status string
|
|
|
|
const (
|
|
StatusDraft Status = "draft"
|
|
StatusReady Status = "ready"
|
|
StatusRunning Status = "running"
|
|
StatusBlocked Status = "blocked"
|
|
StatusSucceeded Status = "succeeded"
|
|
StatusFailed Status = "failed"
|
|
StatusCancelled Status = "cancelled"
|
|
)
|
|
|
|
type Kind string
|
|
|
|
const (
|
|
KindExecution Kind = "execution"
|
|
KindGate Kind = "gate"
|
|
KindVerification Kind = "verification"
|
|
KindMilestone Kind = "milestone"
|
|
)
|
|
|
|
type Record struct {
|
|
ID string `json:"id"`
|
|
WorkspaceID string `json:"workspace_id"`
|
|
TopicID string `json:"topic_id"`
|
|
LaneID string `json:"lane_id"`
|
|
Title string `json:"title"`
|
|
BodyMarkdown string `json:"body_markdown"`
|
|
AcceptanceMarkdown string `json:"acceptance_markdown,omitempty"`
|
|
Kind Kind `json:"kind"`
|
|
Deliverables []string `json:"deliverables,omitempty"`
|
|
BatchKey string `json:"batch_key,omitempty"`
|
|
Status Status `json:"status"`
|
|
Priority int `json:"priority"`
|
|
TaskOrder int `json:"task_order"`
|
|
CreatedByRoleName string `json:"created_by_role_name"`
|
|
BlockingReasonMarkdown string `json:"blocking_reason_markdown,omitempty"`
|
|
ResultSummaryMarkdown string `json:"result_summary_markdown,omitempty"`
|
|
AssignedRunID string `json:"assigned_run_id,omitempty"`
|
|
CreatedAt string `json:"created_at"`
|
|
UpdatedAt string `json:"updated_at"`
|
|
StartedAt string `json:"started_at,omitempty"`
|
|
CompletedAt string `json:"completed_at,omitempty"`
|
|
}
|
|
|
|
type Dependency struct {
|
|
TaskID string `json:"task_id"`
|
|
DependsOnTaskID string `json:"depends_on_task_id"`
|
|
}
|
|
|
|
type Event struct {
|
|
ID string `json:"id"`
|
|
TaskID string `json:"task_id"`
|
|
EventType string `json:"event_type"`
|
|
BodyMarkdown string `json:"body_markdown,omitempty"`
|
|
CreatedByRoleName string `json:"created_by_role_name"`
|
|
CreatedAt string `json:"created_at"`
|
|
}
|
|
|
|
func ValidateStatus(value Status) error {
|
|
switch value {
|
|
case StatusDraft, StatusReady, StatusRunning, StatusBlocked, StatusSucceeded, StatusFailed, StatusCancelled:
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("invalid task status %q", value)
|
|
}
|
|
}
|
|
|
|
func ValidateKind(value Kind) error {
|
|
switch value {
|
|
case KindExecution, KindGate, KindVerification, KindMilestone:
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("invalid task kind %q", value)
|
|
}
|
|
}
|
|
|
|
func NormalizeRecord(value Record) Record {
|
|
if value.Kind == "" {
|
|
value.Kind = KindExecution
|
|
}
|
|
return value
|
|
}
|
|
|
|
func (r Record) Validate() error {
|
|
r = NormalizeRecord(r)
|
|
if r.WorkspaceID == "" {
|
|
return fmt.Errorf("workspace id is required")
|
|
}
|
|
if r.TopicID == "" {
|
|
return fmt.Errorf("topic id is required")
|
|
}
|
|
if r.LaneID == "" {
|
|
return fmt.Errorf("lane id is required")
|
|
}
|
|
if r.Title == "" {
|
|
return fmt.Errorf("task title is required")
|
|
}
|
|
if r.BodyMarkdown == "" {
|
|
return fmt.Errorf("task body is required")
|
|
}
|
|
if r.CreatedByRoleName == "" {
|
|
return fmt.Errorf("created by role is required")
|
|
}
|
|
if err := ValidateKind(r.Kind); err != nil {
|
|
return err
|
|
}
|
|
return ValidateStatus(r.Status)
|
|
}
|
|
|
|
func (d Dependency) Validate() error {
|
|
if d.TaskID == "" {
|
|
return fmt.Errorf("task id is required")
|
|
}
|
|
if d.DependsOnTaskID == "" {
|
|
return fmt.Errorf("depends_on task id is required")
|
|
}
|
|
if d.TaskID == d.DependsOnTaskID {
|
|
return fmt.Errorf("task cannot depend on itself")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e Event) Validate() error {
|
|
if e.TaskID == "" {
|
|
return fmt.Errorf("task id is required")
|
|
}
|
|
if e.EventType == "" {
|
|
return fmt.Errorf("event type is required")
|
|
}
|
|
if e.CreatedByRoleName == "" {
|
|
return fmt.Errorf("created by role is required")
|
|
}
|
|
return nil
|
|
}
|