109 lines
2.1 KiB
Go
109 lines
2.1 KiB
Go
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
|
||
|
|
}
|