package api import ( "context" "encoding/json" "fmt" "net/http" "time" "task-dashboard/internal/models" ) type ClaudomatorHTTPClient struct { BaseURL string HTTPClient *http.Client } func NewClaudomatorClient(baseURL string) *ClaudomatorHTTPClient { return &ClaudomatorHTTPClient{ BaseURL: baseURL, HTTPClient: &http.Client{Timeout: 5 * time.Second}, } } func (c *ClaudomatorHTTPClient) GetActiveStories(ctx context.Context) ([]models.ClaudomatorStory, error) { req, err := http.NewRequestWithContext(ctx, "GET", c.BaseURL+"/api/stories", nil) if err != nil { return nil, err } httpClient := c.HTTPClient if httpClient == nil { httpClient = http.DefaultClient } resp, err := httpClient.Do(req) if err != nil { return nil, fmt.Errorf("claudomator: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("claudomator: unexpected status %d", resp.StatusCode) } var all []models.ClaudomatorStory if err := json.NewDecoder(resp.Body).Decode(&all); err != nil { return nil, err } active := make([]models.ClaudomatorStory, 0, len(all)) for _, s := range all { switch s.Status { case "IN_PROGRESS", "REVIEW_READY", "NEEDS_FIX": active = append(active, s) } } return active, nil }