diff --git a/internal/statusreport/statusreport_add_update.go b/internal/statusreport/statusreport_add_update.go index 250e579..f37bb71 100644 --- a/internal/statusreport/statusreport_add_update.go +++ b/internal/statusreport/statusreport_add_update.go @@ -16,8 +16,17 @@ import ( output "github.com/openstatusHQ/cli/internal/cli" ) -func AddStatusReportUpdate(ctx context.Context, client status_reportv1connect.StatusReportServiceClient, reportId, status, message, date string, notify bool, s *output.Spinner) error { - if reportId == "" { +type AddStatusReportUpdateParams struct { + ReportID string + Status string + Message string + Date string + ComponentImpacts []*status_reportv1.ComponentImpact + Notify bool +} + +func AddStatusReportUpdate(ctx context.Context, client status_reportv1connect.StatusReportServiceClient, p AddStatusReportUpdateParams, s *output.Spinner) error { + if p.ReportID == "" { output.StopSpinner(s) fmt.Fprintln(os.Stderr, "Usage: openstatus status-report add-update --status --message ") fmt.Fprintln(os.Stderr, "") @@ -25,45 +34,49 @@ func AddStatusReportUpdate(ctx context.Context, client status_reportv1connect.St return fmt.Errorf("report ID is required") } - sdkStatus, err := statusToSDK(status) + sdkStatus, err := statusToSDK(p.Status) if err != nil { output.StopSpinner(s) return err } req := &status_reportv1.AddStatusReportUpdateRequest{ - StatusReportId: reportId, + StatusReportId: p.ReportID, Status: sdkStatus, - Message: message, + Message: p.Message, + } + + if p.Date != "" { + req.SetDate(p.Date) } - if date != "" { - req.SetDate(date) + if len(p.ComponentImpacts) > 0 { + req.SetComponentImpacts(p.ComponentImpacts) } - if notify { + if p.Notify { req.SetNotify(true) } resp, err := client.AddStatusReportUpdate(ctx, req) output.StopSpinner(s) if err != nil { - return output.FormatError(err, "status-report", reportId) + return output.FormatError(err, "status-report", p.ReportID) } report := resp.GetStatusReport() fmt.Printf("Status report %s updated to %s\n", report.GetId(), statusColor(statusToString(report.GetStatus()))) - if status == "resolved" { + if p.Status == "resolved" { fmt.Println("Report resolved.") } return nil } -func AddStatusReportUpdateWithHTTPClient(ctx context.Context, httpClient *http.Client, apiKey string, reportId, status, message, date string, notify bool) error { +func AddStatusReportUpdateWithHTTPClient(ctx context.Context, httpClient *http.Client, apiKey string, p AddStatusReportUpdateParams) error { client := NewStatusReportClientWithHTTPClient(httpClient, apiKey) - return AddStatusReportUpdate(ctx, client, reportId, status, message, date, notify, nil) + return AddStatusReportUpdate(ctx, client, p, nil) } func GetStatusReportAddUpdateCmd() *cli.Command { @@ -138,16 +151,13 @@ func GetStatusReportAddUpdateCmd() *cli.Command { s := output.StartSpinner("Adding update...") client := NewStatusReportClient(apiKey) - err = AddStatusReportUpdate( - ctx, - client, - inputs.ReportID, - inputs.Status, - inputs.Message, - date, - inputs.Notify, - s, - ) + err = AddStatusReportUpdate(ctx, client, AddStatusReportUpdateParams{ + ReportID: inputs.ReportID, + Status: inputs.Status, + Message: inputs.Message, + Date: date, + Notify: inputs.Notify, + }, s) if err != nil { return cli.Exit(err.Error(), 1) } diff --git a/internal/statusreport/statusreport_add_update_test.go b/internal/statusreport/statusreport_add_update_test.go index 7806072..b77eae9 100644 --- a/internal/statusreport/statusreport_add_update_test.go +++ b/internal/statusreport/statusreport_add_update_test.go @@ -31,7 +31,12 @@ func Test_AddStatusReportUpdate(t *testing.T) { err := statusreport.AddStatusReportUpdateWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "1", "identified", "Root cause found", "2026-03-20T10:30:00Z", false, + statusreport.AddStatusReportUpdateParams{ + ReportID: "1", + Status: "identified", + Message: "Root cause found", + Date: "2026-03-20T10:30:00Z", + }, ) if err != nil { t.Errorf("Expected no error, got %v", err) @@ -56,7 +61,12 @@ func Test_AddStatusReportUpdate(t *testing.T) { err := statusreport.AddStatusReportUpdateWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "1", "resolved", "Issue resolved", "", true, + statusreport.AddStatusReportUpdateParams{ + ReportID: "1", + Status: "resolved", + Message: "Issue resolved", + Notify: true, + }, ) if err != nil { t.Errorf("Expected no error, got %v", err) @@ -77,7 +87,11 @@ func Test_AddStatusReportUpdate(t *testing.T) { err := statusreport.AddStatusReportUpdateWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "1", "invalid", "Message", "", false, + statusreport.AddStatusReportUpdateParams{ + ReportID: "1", + Status: "invalid", + Message: "Message", + }, ) if err == nil { t.Error("Expected error for invalid status, got nil") @@ -98,7 +112,10 @@ func Test_AddStatusReportUpdate(t *testing.T) { err := statusreport.AddStatusReportUpdateWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "", "investigating", "Message", "", false, + statusreport.AddStatusReportUpdateParams{ + Status: "investigating", + Message: "Message", + }, ) if err == nil { t.Error("Expected error for empty report ID, got nil") @@ -123,7 +140,11 @@ func Test_AddStatusReportUpdate(t *testing.T) { err := statusreport.AddStatusReportUpdateWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "999", "investigating", "Message", "", false, + statusreport.AddStatusReportUpdateParams{ + ReportID: "999", + Status: "investigating", + Message: "Message", + }, ) if err == nil { t.Error("Expected error, got nil") diff --git a/internal/statusreport/statusreport_create.go b/internal/statusreport/statusreport_create.go index 7e14e51..aed70b4 100644 --- a/internal/statusreport/statusreport_create.go +++ b/internal/statusreport/statusreport_create.go @@ -15,25 +15,40 @@ import ( output "github.com/openstatusHQ/cli/internal/cli" ) -func CreateStatusReport(ctx context.Context, client status_reportv1connect.StatusReportServiceClient, title, status, message, date, pageId string, componentIds []string, notify bool) (string, error) { - sdkStatus, err := statusToSDK(status) +type CreateStatusReportParams struct { + Title string + Status string + Message string + Date string + PageID string + ComponentIDs []string + ComponentImpacts []*status_reportv1.ComponentImpact + Notify bool +} + +func CreateStatusReport(ctx context.Context, client status_reportv1connect.StatusReportServiceClient, p CreateStatusReportParams) (string, error) { + sdkStatus, err := statusToSDK(p.Status) if err != nil { return "", err } req := &status_reportv1.CreateStatusReportRequest{ - Title: title, + Title: p.Title, Status: sdkStatus, - Message: message, - Date: date, - PageId: pageId, + Message: p.Message, + Date: p.Date, + PageId: p.PageID, + } + + if len(p.ComponentIDs) > 0 { + req.SetPageComponentIds(p.ComponentIDs) } - if len(componentIds) > 0 { - req.SetPageComponentIds(componentIds) + if len(p.ComponentImpacts) > 0 { + req.SetComponentImpacts(p.ComponentImpacts) } - if notify { + if p.Notify { req.SetNotify(true) } @@ -45,9 +60,9 @@ func CreateStatusReport(ctx context.Context, client status_reportv1connect.Statu return resp.GetStatusReport().GetId(), nil } -func CreateStatusReportWithHTTPClient(ctx context.Context, httpClient *http.Client, apiKey string, title, status, message, date, pageId string, componentIds []string, notify bool) (string, error) { +func CreateStatusReportWithHTTPClient(ctx context.Context, httpClient *http.Client, apiKey string, p CreateStatusReportParams) (string, error) { client := NewStatusReportClientWithHTTPClient(httpClient, apiKey) - return CreateStatusReport(ctx, client, title, status, message, date, pageId, componentIds, notify) + return CreateStatusReport(ctx, client, p) } func GetStatusReportCreateCmd() *cli.Command { @@ -141,17 +156,15 @@ func GetStatusReportCreateCmd() *cli.Command { client := NewStatusReportClient(apiKey) s := output.StartSpinner("Creating status report...") - id, err := CreateStatusReport( - ctx, - client, - inputs.Title, - inputs.Status, - inputs.Message, - date, - inputs.PageID, - inputs.ComponentIDs, - inputs.Notify, - ) + id, err := CreateStatusReport(ctx, client, CreateStatusReportParams{ + Title: inputs.Title, + Status: inputs.Status, + Message: inputs.Message, + Date: date, + PageID: inputs.PageID, + ComponentIDs: inputs.ComponentIDs, + Notify: inputs.Notify, + }) output.StopSpinner(s) if err != nil { return cli.Exit(err.Error(), 1) diff --git a/internal/statusreport/statusreport_create_test.go b/internal/statusreport/statusreport_create_test.go index 2dcf008..be2f378 100644 --- a/internal/statusreport/statusreport_create_test.go +++ b/internal/statusreport/statusreport_create_test.go @@ -34,8 +34,13 @@ func Test_CreateStatusReport(t *testing.T) { id, err := statusreport.CreateStatusReportWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "API Outage", "investigating", "Investigating the issue", - "2026-03-20T10:00:00Z", "page-1", nil, false, + statusreport.CreateStatusReportParams{ + Title: "API Outage", + Status: "investigating", + Message: "Investigating the issue", + Date: "2026-03-20T10:00:00Z", + PageID: "page-1", + }, ) if err != nil { t.Errorf("Expected no error, got %v", err) @@ -63,8 +68,15 @@ func Test_CreateStatusReport(t *testing.T) { id, err := statusreport.CreateStatusReportWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "DB Issue", "investigating", "Looking into DB issues", - "2026-03-20T10:00:00Z", "page-1", []string{"c1", "c2"}, true, + statusreport.CreateStatusReportParams{ + Title: "DB Issue", + Status: "investigating", + Message: "Looking into DB issues", + Date: "2026-03-20T10:00:00Z", + PageID: "page-1", + ComponentIDs: []string{"c1", "c2"}, + Notify: true, + }, ) if err != nil { t.Errorf("Expected no error, got %v", err) @@ -88,8 +100,13 @@ func Test_CreateStatusReport(t *testing.T) { _, err := statusreport.CreateStatusReportWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "Title", "invalid-status", "Message", - "2026-03-20T10:00:00Z", "page-1", nil, false, + statusreport.CreateStatusReportParams{ + Title: "Title", + Status: "invalid-status", + Message: "Message", + Date: "2026-03-20T10:00:00Z", + PageID: "page-1", + }, ) if err == nil { t.Error("Expected error for invalid status, got nil") @@ -114,8 +131,13 @@ func Test_CreateStatusReport(t *testing.T) { _, err := statusreport.CreateStatusReportWithHTTPClient( context.Background(), interceptor.GetHTTPClient(), "test-token", - "Title", "investigating", "Message", - "2026-03-20T10:00:00Z", "page-1", nil, false, + statusreport.CreateStatusReportParams{ + Title: "Title", + Status: "investigating", + Message: "Message", + Date: "2026-03-20T10:00:00Z", + PageID: "page-1", + }, ) if err == nil { t.Error("Expected error, got nil")