From be4322aa8f8db09327420a41648fdf5ed072a2ca Mon Sep 17 00:00:00 2001 From: Sjur Millidahl Date: Mon, 25 Nov 2024 09:58:17 +0100 Subject: [PATCH] fix: cloudian sdk no need to check ctx --- internal/sdk/cloudian/sdk.go | 280 +++++++++++++++-------------------- 1 file changed, 123 insertions(+), 157 deletions(-) diff --git a/internal/sdk/cloudian/sdk.go b/internal/sdk/cloudian/sdk.go index 7cb5bf0b..6d634b4a 100644 --- a/internal/sdk/cloudian/sdk.go +++ b/internal/sdk/cloudian/sdk.go @@ -75,230 +75,196 @@ func unmarshalUsersJson(data []byte) ([]User, error) { // List all users of a group func (client Client) ListUsers(ctx context.Context, groupId string, offsetUserId *string) ([]User, error) { - select { - case <-ctx.Done(): - return nil, fmt.Errorf("ListUsers: context cancelled") - default: - var retVal []User + var retVal []User - limit := 100 + limit := 100 - var offsetQueryParam = "" - if offsetUserId != nil { - offsetQueryParam = "&offset=" + *offsetUserId - } + var offsetQueryParam = "" + if offsetUserId != nil { + offsetQueryParam = "&offset=" + *offsetUserId + } - url := client.baseURL + "/user/list?groupId=" + groupId + "&userType=all&userStatus=all&limit=" + strconv.Itoa(limit) + offsetQueryParam + url := client.baseURL + "/user/list?groupId=" + groupId + "&userType=all&userStatus=all&limit=" + strconv.Itoa(limit) + offsetQueryParam - req, err := client.newRequest(ctx, http.MethodGet, url, nil) - if err != nil { - return nil, fmt.Errorf("GET error creating list request: %w", err) - } + req, err := client.newRequest(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, fmt.Errorf("GET error creating list request: %w", err) + } - resp, err := client.httpClient.Do(req) + resp, err := client.httpClient.Do(req) + if err != nil { + return nil, fmt.Errorf("GET list users failed: %w", err) + } else { + body, err := io.ReadAll(resp.Body) + defer resp.Body.Close() // nolint:errcheck if err != nil { - return nil, fmt.Errorf("GET list users failed: %w", err) - } else { - body, err := io.ReadAll(resp.Body) - defer resp.Body.Close() // nolint:errcheck - if err != nil { - return nil, fmt.Errorf("GET reading list users response body failed: %w", err) - } + return nil, fmt.Errorf("GET reading list users response body failed: %w", err) + } - users, err := unmarshalUsersJson(body) - if err != nil { - return nil, fmt.Errorf("GET unmarshal users response body failed: %w", err) - } + users, err := unmarshalUsersJson(body) + if err != nil { + return nil, fmt.Errorf("GET unmarshal users response body failed: %w", err) + } - retVal = append(retVal, users...) + retVal = append(retVal, users...) - // list users is a paginated API endpoint, so we need to check the limit and use an offset to fetch more - if len(users) > limit { - // There is some ambiguity in the GET /user/list endpoint documentation, but it seems - // that UserId is the correct key for this parameter (and not CanonicalUserId) - // Fetch more results - moreUsers, err := client.ListUsers(ctx, groupId, &users[limit].UserID) + // list users is a paginated API endpoint, so we need to check the limit and use an offset to fetch more + if len(users) > limit { + // There is some ambiguity in the GET /user/list endpoint documentation, but it seems + // that UserId is the correct key for this parameter (and not CanonicalUserId) + // Fetch more results + moreUsers, err := client.ListUsers(ctx, groupId, &users[limit].UserID) - if err == nil { - retVal = append(retVal, moreUsers...) - } + if err == nil { + retVal = append(retVal, moreUsers...) } - - return retVal, nil } + + return retVal, nil } } // Delete a single user func (client Client) DeleteUser(ctx context.Context, user User) error { - select { - case <-ctx.Done(): - return fmt.Errorf("DeleteUser: context cancelled") - default: - url := client.baseURL + "/user?userId=" + user.UserID + "&groupId=" + user.GroupID + "&canonicalUserId=" + user.CanonicalUserID - - req, err := client.newRequest(ctx, url, http.MethodDelete, nil) - if err != nil { - return err - } + url := client.baseURL + "/user?userId=" + user.UserID + "&groupId=" + user.GroupID + "&canonicalUserId=" + user.CanonicalUserID - resp, err := client.httpClient.Do(req) + req, err := client.newRequest(ctx, url, http.MethodDelete, nil) + if err != nil { + return err + } - if err != nil { - return err - } - if resp != nil { - defer resp.Body.Close() // nolint:errcheck - } + resp, err := client.httpClient.Do(req) + if err != nil { return err } + if resp != nil { + defer resp.Body.Close() // nolint:errcheck + } + + return err } // Delete a group and all its members func (client Client) DeleteGroupRecursive(ctx context.Context, groupId string) error { - select { - case <-ctx.Done(): - return fmt.Errorf("DeleteGroupRecursive: context cancelled") - default: - users, err := client.ListUsers(ctx, groupId, nil) - if err != nil { - return err - } - - for _, user := range users { - err := client.DeleteUser(ctx, user) - if err != nil { - return fmt.Errorf("Error deleting user: %w", err) - } + users, err := client.ListUsers(ctx, groupId, nil) + if err != nil { + return err + } + for _, user := range users { + err := client.DeleteUser(ctx, user) + if err != nil { + return fmt.Errorf("Error deleting user: %w", err) } - return client.DeleteGroup(ctx, groupId) } + + return client.DeleteGroup(ctx, groupId) } // Deletes a group if it is without members func (client Client) DeleteGroup(ctx context.Context, groupId string) error { - select { - case <-ctx.Done(): - return fmt.Errorf("DeleteGroup: context cancelled") - default: - url := client.baseURL + "/group?groupId=" + groupId + url := client.baseURL + "/group?groupId=" + groupId - req, err := client.newRequest(ctx, url, http.MethodDelete, nil) - if err != nil { - return err - } - - resp, err := client.httpClient.Do(req) + req, err := client.newRequest(ctx, url, http.MethodDelete, nil) + if err != nil { + return err + } - if err != nil { - return fmt.Errorf("DELETE to cloudian /group got: %w", err) - } - defer resp.Body.Close() // nolint:errcheck + resp, err := client.httpClient.Do(req) - return nil + if err != nil { + return fmt.Errorf("DELETE to cloudian /group got: %w", err) } + defer resp.Body.Close() // nolint:errcheck + + return nil } func (client Client) CreateGroup(ctx context.Context, group Group) error { - select { - case <-ctx.Done(): - return fmt.Errorf("CreateGroup: context cancelled") - default: - url := client.baseURL + "/group" - - jsonData, err := marshalGroup(group) - if err != nil { - return fmt.Errorf("Error marshaling JSON: %w", err) - } + url := client.baseURL + "/group" - req, err := client.newRequest(ctx, url, http.MethodPost, &jsonData) - if err != nil { - return err - } + jsonData, err := marshalGroup(group) + if err != nil { + return fmt.Errorf("Error marshaling JSON: %w", err) + } - resp, err := client.httpClient.Do(req) + req, err := client.newRequest(ctx, url, http.MethodPost, &jsonData) + if err != nil { + return err + } - if err != nil { - return fmt.Errorf("POST to cloudian /group: %w", err) - } - defer resp.Body.Close() // nolint:errcheck + resp, err := client.httpClient.Do(req) - return err + if err != nil { + return fmt.Errorf("POST to cloudian /group: %w", err) } + defer resp.Body.Close() // nolint:errcheck + + return err } func (client Client) UpdateGroup(ctx context.Context, group Group) error { - select { - case <-ctx.Done(): - return fmt.Errorf("UpdateGroup: context cancelled") - default: - url := client.baseURL + "/group" - - jsonData, err := marshalGroup(group) - if err != nil { - return fmt.Errorf("Error marshaling JSON: %w", err) - } - // Create a context with a timeout - req, err := client.newRequest(ctx, url, http.MethodPut, &jsonData) - if err != nil { - return err - } + url := client.baseURL + "/group" - resp, err := client.httpClient.Do(req) + jsonData, err := marshalGroup(group) + if err != nil { + return fmt.Errorf("Error marshaling JSON: %w", err) + } - if err != nil { - return fmt.Errorf("PUT to cloudian /group: %w", err) - } + // Create a context with a timeout + req, err := client.newRequest(ctx, url, http.MethodPut, &jsonData) + if err != nil { + return err + } - defer resp.Body.Close() // nolint:errcheck + resp, err := client.httpClient.Do(req) - return nil + if err != nil { + return fmt.Errorf("PUT to cloudian /group: %w", err) } + + defer resp.Body.Close() // nolint:errcheck + + return nil } func (client Client) GetGroup(ctx context.Context, groupId string) (*Group, error) { - select { - case <-ctx.Done(): - return nil, fmt.Errorf("GetGroup: context cancelled") - default: - url := client.baseURL + "/group?groupId=" + groupId + url := client.baseURL + "/group?groupId=" + groupId - req, err := client.newRequest(ctx, url, http.MethodGet, nil) - if err != nil { - return nil, err - } - - resp, err := client.httpClient.Do(req) + req, err := client.newRequest(ctx, url, http.MethodGet, nil) + if err != nil { + return nil, err + } - if err != nil { - return nil, fmt.Errorf("GET error: %w", err) - } + resp, err := client.httpClient.Do(req) - if resp != nil { - defer resp.Body.Close() // nolint:errcheck - } + if err != nil { + return nil, fmt.Errorf("GET error: %w", err) + } - if resp.StatusCode == 200 { - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("GET reading response body failed: %w", err) - } + if resp != nil { + defer resp.Body.Close() // nolint:errcheck + } - group, err := unmarshalGroupJson(body) - if err != nil { - return nil, fmt.Errorf("GET unmarshal response body failed: %w", err) - } + if resp.StatusCode == 200 { + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("GET reading response body failed: %w", err) + } - return &group, nil + group, err := unmarshalGroupJson(body) + if err != nil { + return nil, fmt.Errorf("GET unmarshal response body failed: %w", err) } - // Cloudian-API returns 204 if the group does not exist - return nil, err + return &group, nil } + + // Cloudian-API returns 204 if the group does not exist + return nil, err }