Files
poimen-workflows/internal/external/task_importer.go
T

109 lines
2.1 KiB
Go
Raw Normal View History

package external
import (
"fmt"
"sync"
)
// ExternalTask represents an imported task from external systems
type ExternalTask struct {
ID string
Source string // "github", "linear", "jira"
ExternalID string
Title string
Status string
Body string
Labels []string
Assignee string
}
// TaskImporter imports tasks from external systems
type TaskImporter struct {
mu sync.RWMutex
tasks map[string]*ExternalTask
}
// NewTaskImporter creates a new task importer
func NewTaskImporter() *TaskImporter {
return &TaskImporter{
tasks: make(map[string]*ExternalTask),
}
}
// Import imports a task from external source
func (ti *TaskImporter) Import(task *ExternalTask) error {
if task.ID == "" {
return fmt.Errorf("task ID required")
}
ti.mu.Lock()
defer ti.mu.Unlock()
ti.tasks[task.ID] = task
return nil
}
// GetTask retrieves an imported task
func (ti *TaskImporter) GetTask(id string) (*ExternalTask, bool) {
ti.mu.RLock()
defer ti.mu.RUnlock()
task, exists := ti.tasks[id]
return task, exists
}
// ListTasks lists all imported tasks
func (ti *TaskImporter) ListTasks() map[string]*ExternalTask {
ti.mu.RLock()
defer ti.mu.RUnlock()
result := make(map[string]*ExternalTask)
for id, task := range ti.tasks {
result[id] = task
}
return result
}
// UpdateStatus updates task status
func (ti *TaskImporter) UpdateStatus(id string, status string) error {
ti.mu.Lock()
defer ti.mu.Unlock()
task, exists := ti.tasks[id]
if !exists {
return fmt.Errorf("task not found: %s", id)
}
task.Status = status
return nil
}
// GetBySource lists tasks from a specific source
func (ti *TaskImporter) GetBySource(source string) []*ExternalTask {
ti.mu.RLock()
defer ti.mu.RUnlock()
result := make([]*ExternalTask, 0)
for _, task := range ti.tasks {
if task.Source == source {
result = append(result, task)
}
}
return result
}
// Remove removes a task
func (ti *TaskImporter) Remove(id string) error {
ti.mu.Lock()
defer ti.mu.Unlock()
if _, exists := ti.tasks[id]; !exists {
return fmt.Errorf("task not found: %s", id)
}
delete(ti.tasks, id)
return nil
}