Skip to content

Commit

Permalink
fix: cloudian sdk no need to check ctx
Browse files Browse the repository at this point in the history
  • Loading branch information
mariatsji committed Nov 25, 2024
1 parent 15972b5 commit be4322a
Showing 1 changed file with 123 additions and 157 deletions.
280 changes: 123 additions & 157 deletions internal/sdk/cloudian/sdk.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit be4322a

Please sign in to comment.