From 43a467567dba9b8db8abffd3ee48d4a4f89b3a78 Mon Sep 17 00:00:00 2001 From: Kenzo Tanaka Date: Tue, 29 Sep 2026 19:54:38 +0900 Subject: [PATCH] Send si=true when reading and updating an SSO integration - GetSSOIntegration and UpdateSSOIntegration always send si=true; without it SendGrid omits completed_integration and it decodes as false - GetSSOIntegrations now actually puts si in the query string The SendGrid API reference describes the si query parameter as "If this parameter is set to `true`, the response will include the `completed_integration` field." It is defined for GET /v3/sso/integrations, GET /v3/sso/integrations/{id} and PATCH /v3/sso/integrations/{id}. - https://www.twilio.com/docs/sendgrid/api-reference/single-sign-on-settings/get-an-sso-integration - https://github.com/twilio/sendgrid-oai/blob/8898f95ba784888ec9c29cfd6fab26806eed408c/spec/json/tsg_sso_v3.json#L414-L500 Co-Authored-By: Claude Opus 5.5 --- sso_integration.go | 11 +++++++++-- sso_integration_test.go | 9 +++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/sso_integration.go b/sso_integration.go index 6ddbb86..d78f67f 100644 --- a/sso_integration.go +++ b/sso_integration.go @@ -20,9 +20,12 @@ type OutputGetSSOIntegration struct { AudienceURL string `json:"audience_url,omitempty"` } +// GetSSOIntegration always sends si=true: without it SendGrid omits +// completed_integration from the response, which would decode as false. +// // see: https://docs.sendgrid.com/api-reference/single-sign-on-settings/get-an-sso-integration func (c *Client) GetSSOIntegration(ctx context.Context, id string) (*OutputGetSSOIntegration, error) { - path := fmt.Sprintf("/sso/integrations/%s", id) + path := fmt.Sprintf("/sso/integrations/%s?si=true", id) req, err := c.NewRequest("GET", path, nil) if err != nil { @@ -62,6 +65,7 @@ func (c *Client) GetSSOIntegrations(ctx context.Context, input *InputGetSSOInteg if input.Si { q.Set("si", strconv.FormatBool(input.Si)) } + u.RawQuery = q.Encode() req, err := c.NewRequest("GET", u.String(), nil) if err != nil { @@ -135,9 +139,12 @@ type OutputUpdateSSOIntegration struct { AudienceURL string `json:"audience_url,omitempty"` } +// UpdateSSOIntegration always sends si=true so that the response includes +// completed_integration, as GetSSOIntegration does. +// // see: https://docs.sendgrid.com/api-reference/single-sign-on-settings/update-an-sso-integration func (c *Client) UpdateSSOIntegration(ctx context.Context, id string, input *InputUpdateSSOIntegration) (*OutputUpdateSSOIntegration, error) { - path := fmt.Sprintf("/sso/integrations/%s", id) + path := fmt.Sprintf("/sso/integrations/%s?si=true", id) req, err := c.NewRequest("PATCH", path, input) if err != nil { diff --git a/sso_integration_test.go b/sso_integration_test.go index aef2e13..32949e9 100644 --- a/sso_integration_test.go +++ b/sso_integration_test.go @@ -18,6 +18,9 @@ func TestGetSSOIntegration(t *testing.T) { defer teardown() mux.HandleFunc("/sso/integrations/abcdef", func(w http.ResponseWriter, r *http.Request) { + if got := r.URL.Query().Get("si"); got != "true" { + t.Errorf("si query = %q, want %q", got, "true") + } if _, err := fmt.Fprint(w, `{ "id": "abcdef", "name": "dummy", @@ -77,6 +80,9 @@ func TestGetSSOIntegrations(t *testing.T) { defer teardown() mux.HandleFunc("/sso/integrations", func(w http.ResponseWriter, r *http.Request) { + if got := r.URL.Query().Get("si"); got != "true" { + t.Errorf("si query = %q, want %q", got, "true") + } if _, err := fmt.Fprint(w, `[ { "id": "abcdef", @@ -213,6 +219,9 @@ func TestUpdateSSOIntegration(t *testing.T) { defer teardown() mux.HandleFunc("/sso/integrations/abcdef", func(w http.ResponseWriter, r *http.Request) { + if got := r.URL.Query().Get("si"); got != "true" { + t.Errorf("si query = %q, want %q", got, "true") + } if _, err := fmt.Fprint(w, `{ "id": "abcdef", "name": "dummy",