From f4fb20111b95b32da2c01a788f0e28746b794ac8 Mon Sep 17 00:00:00 2001 From: Steve Chaloner Date: Wed, 12 Jul 2023 10:28:28 +0200 Subject: [PATCH 1/2] Workspace authentication SeatsioClient takes an optional parameter specifying the workspace key. If present, a `X-Workspace-Key` header is added to requests --- charts_test/create_chart_test.go | 22 ++++++++++++++++++++++ seatsioclient.go | 16 +++++++++++++--- shared/shared_http.go | 16 ++++++++++++++-- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/charts_test/create_chart_test.go b/charts_test/create_chart_test.go index b17208d..4e57dca 100644 --- a/charts_test/create_chart_test.go +++ b/charts_test/create_chart_test.go @@ -79,5 +79,27 @@ func TestCreateChartWithCategories(t *testing.T) { require.Contains(t, getCategories(drawing), map[string]interface{}{"key": "anotherCat", "label": "Category 2", "color": "#bbbbbb", "accessible": true}) +} + +func TestCreateChartInSpecificWorkspace(t *testing.T) { + t.Parallel() + company := test_util.CreateTestCompany(t) + defaultClient := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl) + + workspace, err := defaultClient.Workspaces.CreateTestWorkspace("anotherWorkspace") + require.NoError(t, err) + + workspaceClient := seatsio.NewSeatsioClient(company.Admin.SecretKey, test_util.BaseUrl, seatsio.ClientSupport.WorkspaceKey(workspace.Key)) + chart, err := workspaceClient.Charts.Create(&charts.CreateChartParams{}) + require.NoError(t, err) + + retrievedDefaultWorkspaceCharts, err := defaultClient.Charts.ListAll() + require.NoError(t, err) + require.Len(t, retrievedDefaultWorkspaceCharts, 0) + + workspaceCharts, err := workspaceClient.Charts.ListAll() + require.NoError(t, err) + require.Len(t, workspaceCharts, 1) + require.Equal(t, chart.Key, workspaceCharts[0].Key) } diff --git a/seatsioclient.go b/seatsioclient.go index 0a5e70f..78230b4 100644 --- a/seatsioclient.go +++ b/seatsioclient.go @@ -9,9 +9,14 @@ import ( "github.com/seatsio/seatsio-go/workspaces" ) +type seatsioClientNS struct{} + +var ClientSupport seatsioClientNS + type SeatsioClient struct { baseUrl string secretKey string + workspaceKey string Workspaces *workspaces.Workspaces Charts *charts.Charts Events *events.Events @@ -21,9 +26,9 @@ type SeatsioClient struct { Channels *events.Channels } -func NewSeatsioClient(secretKey string, baseUrl string) *SeatsioClient { - apiClient := shared.ApiClient(secretKey, baseUrl) - return &SeatsioClient{ +func NewSeatsioClient(secretKey string, baseUrl string, additionalClientConfig ...shared.AdditionalConfig) *SeatsioClient { + apiClient := shared.ApiClient(secretKey, baseUrl, additionalClientConfig...) + client := &SeatsioClient{ baseUrl: baseUrl, secretKey: secretKey, Workspaces: &workspaces.Workspaces{Client: apiClient}, @@ -37,4 +42,9 @@ func NewSeatsioClient(secretKey string, baseUrl string) *SeatsioClient { EventReports: &reports.EventReports{Client: apiClient}, Channels: &events.Channels{Client: apiClient}, } + return client +} + +func (seatsioClientNS) WorkspaceKey(key string) shared.AdditionalConfig { + return shared.AdditionalHeader("X-Workspace-Key", key) } diff --git a/shared/shared_http.go b/shared/shared_http.go index cd2889c..1dc8763 100644 --- a/shared/shared_http.go +++ b/shared/shared_http.go @@ -8,14 +8,20 @@ import ( "time" ) -func ApiClient(secretKey string, baseUrl string) *req.Client { - return req.C().SetBaseURL(baseUrl). +type AdditionalConfig func(client *req.Client) + +func ApiClient(secretKey string, baseUrl string, additionalConfig ...AdditionalConfig) *req.Client { + client := req.C().SetBaseURL(baseUrl). SetCommonBasicAuth(secretKey, ""). SetCommonRetryCount(5). SetCommonRetryBackoffInterval(400*time.Millisecond, 10*time.Second). SetCommonRetryCondition(func(resp *req.Response, err error) bool { return err == nil && resp.StatusCode == 429 }) + for _, opt := range additionalConfig { + opt(client) + } + return client } func AssertOk[T interface{}](result *req.Response, err error, data *T) (*T, error) { @@ -60,3 +66,9 @@ func AssertOkWithoutResult(result *req.Response, err error) error { } return nil } + +func AdditionalHeader(key string, value string) AdditionalConfig { + return func(client *req.Client) { + client.SetCommonHeader(key, value) + } +} From 3b3f5cf387b0fe7b87f3830630551cf92ff212ac Mon Sep 17 00:00:00 2001 From: Steve Chaloner Date: Wed, 12 Jul 2023 10:53:04 +0200 Subject: [PATCH 2/2] Client is no longer exposed to external code --- seatsioclient.go | 8 ++++---- shared/shared_http.go | 18 +++++++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/seatsioclient.go b/seatsioclient.go index 78230b4..bd2aef8 100644 --- a/seatsioclient.go +++ b/seatsioclient.go @@ -26,8 +26,8 @@ type SeatsioClient struct { Channels *events.Channels } -func NewSeatsioClient(secretKey string, baseUrl string, additionalClientConfig ...shared.AdditionalConfig) *SeatsioClient { - apiClient := shared.ApiClient(secretKey, baseUrl, additionalClientConfig...) +func NewSeatsioClient(secretKey string, baseUrl string, additionalHeaders ...shared.AdditionalHeader) *SeatsioClient { + apiClient := shared.ApiClient(secretKey, baseUrl, additionalHeaders...) client := &SeatsioClient{ baseUrl: baseUrl, secretKey: secretKey, @@ -45,6 +45,6 @@ func NewSeatsioClient(secretKey string, baseUrl string, additionalClientConfig . return client } -func (seatsioClientNS) WorkspaceKey(key string) shared.AdditionalConfig { - return shared.AdditionalHeader("X-Workspace-Key", key) +func (seatsioClientNS) WorkspaceKey(key string) shared.AdditionalHeader { + return shared.WithAdditionalHeader("X-Workspace-Key", key) } diff --git a/shared/shared_http.go b/shared/shared_http.go index 1dc8763..4ba442b 100644 --- a/shared/shared_http.go +++ b/shared/shared_http.go @@ -8,9 +8,9 @@ import ( "time" ) -type AdditionalConfig func(client *req.Client) +type AdditionalHeader func(headers *map[string]string) -func ApiClient(secretKey string, baseUrl string, additionalConfig ...AdditionalConfig) *req.Client { +func ApiClient(secretKey string, baseUrl string, additionalHeaders ...AdditionalHeader) *req.Client { client := req.C().SetBaseURL(baseUrl). SetCommonBasicAuth(secretKey, ""). SetCommonRetryCount(5). @@ -18,8 +18,12 @@ func ApiClient(secretKey string, baseUrl string, additionalConfig ...AdditionalC SetCommonRetryCondition(func(resp *req.Response, err error) bool { return err == nil && resp.StatusCode == 429 }) - for _, opt := range additionalConfig { - opt(client) + headers := make(map[string]string) + for _, opt := range additionalHeaders { + opt(&headers) + } + for key, value := range headers { + client.SetCommonHeader(key, value) } return client } @@ -67,8 +71,8 @@ func AssertOkWithoutResult(result *req.Response, err error) error { return nil } -func AdditionalHeader(key string, value string) AdditionalConfig { - return func(client *req.Client) { - client.SetCommonHeader(key, value) +func WithAdditionalHeader(key string, value string) AdditionalHeader { + return func(headers *map[string]string) { + (*headers)[key] = value } }