package report import ( "encoding/json" "fmt" "io" "net/http" "strings" "time" ) // PullInfraBackup fetches the infrastructure backup from the Hub. // Returns nil, nil if no backup exists for this customer. func PullInfraBackup(hubURL, apiKey, customerID string) (*InfraBackup, error) { url := strings.TrimRight(hubURL, "/") + "/api/v1/infra-backup/" + customerID client := &http.Client{Timeout: 30 * time.Second} req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return nil, err } if apiKey != "" { req.Header.Set("Authorization", "Bearer "+apiKey) } resp, err := client.Do(req) if err != nil { return nil, fmt.Errorf("hub request failed: %w", err) } defer resp.Body.Close() if resp.StatusCode == http.StatusNotFound { return nil, nil // no backup for this customer } if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("hub returned HTTP %d", resp.StatusCode) } body, err := io.ReadAll(io.LimitReader(resp.Body, 5<<20)) // 5MB limit if err != nil { return nil, fmt.Errorf("reading response: %w", err) } var ib InfraBackup if err := json.Unmarshal(body, &ib); err != nil { return nil, fmt.Errorf("parsing infra backup: %w", err) } return &ib, nil }