From 084f4e264c9875cb65e63841b38797771ff9a199 Mon Sep 17 00:00:00 2001 From: Zachary Greenfield Date: Sat, 21 Feb 2026 22:19:52 -0600 Subject: [PATCH 1/5] fix: Use full endpoint route on api requests --- internal/client/request.go | 3 ++- internal/client/request_test.go | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/internal/client/request.go b/internal/client/request.go index 7b0103df..d9c043cf 100644 --- a/internal/client/request.go +++ b/internal/client/request.go @@ -23,6 +23,7 @@ import ( "io" "net/http" "net/url" + "path" ) // Request wrap the http.Request configuration providing functions for configure it in an easier and contained way @@ -134,7 +135,7 @@ func (r *Request) Error() error { func (r *Request) URL() *url.URL { url := *r.restClient.baseURL - url.Path = r.apiPath + url.Path = path.Join(url.Path, r.apiPath) url.RawQuery = r.params.Encode() return &url diff --git a/internal/client/request_test.go b/internal/client/request_test.go index d06fb0fd..684bba2f 100644 --- a/internal/client/request_test.go +++ b/internal/client/request_test.go @@ -98,6 +98,40 @@ func TestSetParams(t *testing.T) { assert.Equal(t, url.Values{"foo": []string{"bar"}, "baz": []string{"1", "2"}}, r.params) } +func TestRequestURL(t *testing.T) { + testCases := map[string]struct { + baseURL string + apiPath string + expectedURL string + }{ + "no base path": { + baseURL: "http://host/", + apiPath: "/api/backend/projects/", + expectedURL: "http://host/api/backend/projects/", + }, + "with base path prefix": { + baseURL: "http://host/mia/", + apiPath: "/api/backend/projects/", + expectedURL: "http://host/mia/api/backend/projects/", + }, + "base path without trailing slash": { + baseURL: "http://host/mia", + apiPath: "/api/backend/projects/", + expectedURL: "http://host/mia/api/backend/projects/", + }, + } + + for testName, testCase := range testCases { + t.Run(testName, func(t *testing.T) { + baseURL, err := url.Parse(testCase.baseURL) + require.NoError(t, err) + client := newAPIClient(baseURL, contentConfig{}, http.DefaultClient) + requestURL := NewRequest(client).APIPath(testCase.apiPath).URL() + assert.Equal(t, testCase.expectedURL, requestURL.String()) + }) + } +} + func TestSetAPIPath(t *testing.T) { r := (&Request{}) From 4a824a5de36c1e407c9dcea8be1d524adc592a93 Mon Sep 17 00:00:00 2001 From: Zachary Greenfield Date: Sat, 21 Feb 2026 22:34:07 -0600 Subject: [PATCH 2/5] refactor: linting --- internal/authorization/serviceaccount_authenticator.go | 2 +- internal/cliconfig/api/types.go | 2 +- internal/client/config.go | 2 +- internal/client/request.go | 6 +++--- internal/resources/requests.go | 2 +- internal/resources/responses.go | 6 +++--- internal/resources/utils.go | 2 +- internal/transport/round_trippers.go | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/internal/authorization/serviceaccount_authenticator.go b/internal/authorization/serviceaccount_authenticator.go index f029790a..b8ff03f9 100644 --- a/internal/authorization/serviceaccount_authenticator.go +++ b/internal/authorization/serviceaccount_authenticator.go @@ -149,7 +149,7 @@ func getJWTToken(ctx context.Context, apiClient client.Interface, keyID, clientI } type tempToken struct { - AccessToken string `json:"access_token"` //nolint: tagliatelle + AccessToken string `json:"access_token"` //nolint:gosec,tagliatelle TokenTipe string `json:"token_type"` //nolint: tagliatelle ExpiresIn int `json:"expires_in"` //nolint: tagliatelle } diff --git a/internal/cliconfig/api/types.go b/internal/cliconfig/api/types.go index 2eafb46f..449ef81c 100644 --- a/internal/cliconfig/api/types.go +++ b/internal/cliconfig/api/types.go @@ -33,7 +33,7 @@ type ContextConfig struct { type AuthConfig struct { ClientID string `yaml:"client-id,omitempty"` //nolint:tagliatelle - ClientSecret string `yaml:"client-secret,omitempty"` //nolint:tagliatelle + ClientSecret string `yaml:"client-secret,omitempty"` //nolint:gosec,tagliatelle JWTKeyID string `yaml:"key-id,omitempty"` //nolint:tagliatelle JWTPrivateKeyData string `yaml:"private-key-data,omitempty"` //nolint:tagliatelle } diff --git a/internal/client/config.go b/internal/client/config.go index cbb645d0..e55b541e 100644 --- a/internal/client/config.go +++ b/internal/client/config.go @@ -67,7 +67,7 @@ type TLSClientConfig struct { // AuthConfig contains settings for settign up authentication for the http requests type AuthConfig struct { ClientID string - ClientSecret string + ClientSecret string //nolint:gosec JWTKeyID string JWTPrivateKeyData string } diff --git a/internal/client/request.go b/internal/client/request.go index d9c043cf..a5800523 100644 --- a/internal/client/request.go +++ b/internal/client/request.go @@ -23,7 +23,7 @@ import ( "io" "net/http" "net/url" - "path" + "strings" ) // Request wrap the http.Request configuration providing functions for configure it in an easier and contained way @@ -135,7 +135,7 @@ func (r *Request) Error() error { func (r *Request) URL() *url.URL { url := *r.restClient.baseURL - url.Path = path.Join(url.Path, r.apiPath) + url.Path = strings.TrimSuffix(url.Path, "/") + r.apiPath url.RawQuery = r.params.Encode() return &url @@ -212,7 +212,7 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp return err } - response, err := r.restClient.client.Do(httpRequest) + response, err := r.restClient.client.Do(httpRequest) //nolint:gosec func() { if response != nil { fn(httpRequest, response) diff --git a/internal/resources/requests.go b/internal/resources/requests.go index 8161cda3..a66b0518 100644 --- a/internal/resources/requests.go +++ b/internal/resources/requests.go @@ -21,7 +21,7 @@ type JWTTokenRequest struct { } type RefreshTokenRequest struct { - RefreshToken string `json:"refreshToken"` + RefreshToken string `json:"refreshToken"` //nolint:gosec } type ServiceAccountRequest struct { diff --git a/internal/resources/responses.go b/internal/resources/responses.go index c0d4f4a2..8cf68e1a 100644 --- a/internal/resources/responses.go +++ b/internal/resources/responses.go @@ -42,8 +42,8 @@ type AuthProvider struct { } type UserToken struct { - AccessToken string `json:"accessToken"` - RefreshToken string `json:"refreshToken"` + AccessToken string `json:"accessToken"` //nolint:gosec + RefreshToken string `json:"refreshToken"` //nolint:gosec ExpiresAt int64 `json:"expiresAt"` } @@ -137,7 +137,7 @@ type CreateJob struct { type ServiceAccount struct { ClientID string `json:"clientId"` - ClientSecret string `json:"clientSecret"` + ClientSecret string `json:"clientSecret"` //nolint:gosec ClientIDIssuedAt int64 `json:"clientIdIssuedAt"` Company string `json:"company"` } diff --git a/internal/resources/utils.go b/internal/resources/utils.go index dffdeef3..92251a6a 100644 --- a/internal/resources/utils.go +++ b/internal/resources/utils.go @@ -116,6 +116,6 @@ func EncodeResourceToJSON(obj interface{}) ([]byte, error) { type JWTServiceAccountJSON struct { Type string `json:"type"` KeyID string `json:"key-id"` //nolint: tagliatelle - PrivateKeyData string `json:"private-key-data"` //nolint: tagliatelle + PrivateKeyData string `json:"private-key-data"` //nolint:gosec,tagliatelle ClientID string `json:"client-id"` //nolint: tagliatelle } diff --git a/internal/transport/round_trippers.go b/internal/transport/round_trippers.go index e131e89f..044f641e 100644 --- a/internal/transport/round_trippers.go +++ b/internal/transport/round_trippers.go @@ -115,7 +115,7 @@ func printCurl(r *http.Request) string { for key, values := range r.Header { for _, value := range values { value = maskSensibleHeaderValue(key, value) - builder.WriteString(fmt.Sprintf("\t-H %q\n", fmt.Sprintf("%s: %s", key, value))) + fmt.Fprintf(&builder, "\t-H %q\n", fmt.Sprintf("%s: %s", key, value)) } } From d3403820f02804a9359ec993c1756cce6b0eb186 Mon Sep 17 00:00:00 2001 From: Zachary Greenfield Date: Sat, 21 Feb 2026 22:47:07 -0600 Subject: [PATCH 3/5] refactor: re-fixing linting --- internal/authorization/serviceaccount_authenticator.go | 2 +- internal/cliconfig/api/types.go | 2 +- internal/client/config.go | 2 +- internal/client/request.go | 2 +- internal/resources/requests.go | 2 +- internal/resources/utils.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/authorization/serviceaccount_authenticator.go b/internal/authorization/serviceaccount_authenticator.go index b8ff03f9..fb2824dd 100644 --- a/internal/authorization/serviceaccount_authenticator.go +++ b/internal/authorization/serviceaccount_authenticator.go @@ -149,7 +149,7 @@ func getJWTToken(ctx context.Context, apiClient client.Interface, keyID, clientI } type tempToken struct { - AccessToken string `json:"access_token"` //nolint:gosec,tagliatelle + AccessToken string `json:"access_token"` //nolint:tagliatelle TokenTipe string `json:"token_type"` //nolint: tagliatelle ExpiresIn int `json:"expires_in"` //nolint: tagliatelle } diff --git a/internal/cliconfig/api/types.go b/internal/cliconfig/api/types.go index 449ef81c..2eafb46f 100644 --- a/internal/cliconfig/api/types.go +++ b/internal/cliconfig/api/types.go @@ -33,7 +33,7 @@ type ContextConfig struct { type AuthConfig struct { ClientID string `yaml:"client-id,omitempty"` //nolint:tagliatelle - ClientSecret string `yaml:"client-secret,omitempty"` //nolint:gosec,tagliatelle + ClientSecret string `yaml:"client-secret,omitempty"` //nolint:tagliatelle JWTKeyID string `yaml:"key-id,omitempty"` //nolint:tagliatelle JWTPrivateKeyData string `yaml:"private-key-data,omitempty"` //nolint:tagliatelle } diff --git a/internal/client/config.go b/internal/client/config.go index e55b541e..cbb645d0 100644 --- a/internal/client/config.go +++ b/internal/client/config.go @@ -67,7 +67,7 @@ type TLSClientConfig struct { // AuthConfig contains settings for settign up authentication for the http requests type AuthConfig struct { ClientID string - ClientSecret string //nolint:gosec + ClientSecret string JWTKeyID string JWTPrivateKeyData string } diff --git a/internal/client/request.go b/internal/client/request.go index a5800523..6eb203f9 100644 --- a/internal/client/request.go +++ b/internal/client/request.go @@ -212,7 +212,7 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp return err } - response, err := r.restClient.client.Do(httpRequest) //nolint:gosec + response, err := r.restClient.client.Do(httpRequest) func() { if response != nil { fn(httpRequest, response) diff --git a/internal/resources/requests.go b/internal/resources/requests.go index a66b0518..8161cda3 100644 --- a/internal/resources/requests.go +++ b/internal/resources/requests.go @@ -21,7 +21,7 @@ type JWTTokenRequest struct { } type RefreshTokenRequest struct { - RefreshToken string `json:"refreshToken"` //nolint:gosec + RefreshToken string `json:"refreshToken"` } type ServiceAccountRequest struct { diff --git a/internal/resources/utils.go b/internal/resources/utils.go index 92251a6a..71b37cb7 100644 --- a/internal/resources/utils.go +++ b/internal/resources/utils.go @@ -116,6 +116,6 @@ func EncodeResourceToJSON(obj interface{}) ([]byte, error) { type JWTServiceAccountJSON struct { Type string `json:"type"` KeyID string `json:"key-id"` //nolint: tagliatelle - PrivateKeyData string `json:"private-key-data"` //nolint:gosec,tagliatelle + PrivateKeyData string `json:"private-key-data"` //nolint:tagliatelle ClientID string `json:"client-id"` //nolint: tagliatelle } From 125ac64c12f19c509a8de1437d53269d182afb44 Mon Sep 17 00:00:00 2001 From: Zachary Greenfield Date: Sat, 21 Feb 2026 22:48:40 -0600 Subject: [PATCH 4/5] refactor: re-fixing linting --- internal/authorization/serviceaccount_authenticator.go | 2 +- internal/resources/utils.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/authorization/serviceaccount_authenticator.go b/internal/authorization/serviceaccount_authenticator.go index fb2824dd..f029790a 100644 --- a/internal/authorization/serviceaccount_authenticator.go +++ b/internal/authorization/serviceaccount_authenticator.go @@ -149,7 +149,7 @@ func getJWTToken(ctx context.Context, apiClient client.Interface, keyID, clientI } type tempToken struct { - AccessToken string `json:"access_token"` //nolint:tagliatelle + AccessToken string `json:"access_token"` //nolint: tagliatelle TokenTipe string `json:"token_type"` //nolint: tagliatelle ExpiresIn int `json:"expires_in"` //nolint: tagliatelle } diff --git a/internal/resources/utils.go b/internal/resources/utils.go index 71b37cb7..dffdeef3 100644 --- a/internal/resources/utils.go +++ b/internal/resources/utils.go @@ -116,6 +116,6 @@ func EncodeResourceToJSON(obj interface{}) ([]byte, error) { type JWTServiceAccountJSON struct { Type string `json:"type"` KeyID string `json:"key-id"` //nolint: tagliatelle - PrivateKeyData string `json:"private-key-data"` //nolint:tagliatelle + PrivateKeyData string `json:"private-key-data"` //nolint: tagliatelle ClientID string `json:"client-id"` //nolint: tagliatelle } From 27ad4d69edeb614d517545f4d921628623d8e0a2 Mon Sep 17 00:00:00 2001 From: Zachary Greenfield Date: Mon, 23 Feb 2026 08:31:45 -0600 Subject: [PATCH 5/5] refactor: re-fixing linting --- internal/resources/responses.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/resources/responses.go b/internal/resources/responses.go index 8cf68e1a..c0d4f4a2 100644 --- a/internal/resources/responses.go +++ b/internal/resources/responses.go @@ -42,8 +42,8 @@ type AuthProvider struct { } type UserToken struct { - AccessToken string `json:"accessToken"` //nolint:gosec - RefreshToken string `json:"refreshToken"` //nolint:gosec + AccessToken string `json:"accessToken"` + RefreshToken string `json:"refreshToken"` ExpiresAt int64 `json:"expiresAt"` } @@ -137,7 +137,7 @@ type CreateJob struct { type ServiceAccount struct { ClientID string `json:"clientId"` - ClientSecret string `json:"clientSecret"` //nolint:gosec + ClientSecret string `json:"clientSecret"` ClientIDIssuedAt int64 `json:"clientIdIssuedAt"` Company string `json:"company"` }