-
Notifications
You must be signed in to change notification settings - Fork 616
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Manage account members endpoints (#196)
* Add `ListAccountMembers` endpoint Creates the functionality to be able to query all members of an account. See https://api.cloudflare.com/#accounts-list-accounts * Creates a `AddAccountMember` functionality Adds the ability to create a new account member using the API. See https://api.cloudflare.com/#account-members-add-member * Add `UpdateAccountMember` to library Allows you to update existing users using the library. See https://api.cloudflare.com/#account-members-update-member * Add `DeleteAccountMember` If you can create 'em, you gotta be able to delete 'em. See https://api.cloudflare.com/#account-members-remove-member * Add `AccountMember` for querying individual members See https://api.cloudflare.com/#account-members-member-details
- Loading branch information
1 parent
5049b1d
commit 5288c3c
Showing
2 changed files
with
474 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,166 @@ | ||
package cloudflare | ||
|
||
import ( | ||
"encoding/json" | ||
"fmt" | ||
"net/url" | ||
"strconv" | ||
|
||
"github.com/pkg/errors" | ||
) | ||
|
||
// AccountMember is the definition of a member of an account. | ||
type AccountMember struct { | ||
ID string `json:"id"` | ||
Code string `json:"code"` | ||
User AccountMemberUserDetails `json:"user"` | ||
Status string `json:"status"` | ||
Roles []AccountRole `json:"roles"` | ||
} | ||
|
||
// AccountMemberUserDetails outlines all the personal information about | ||
// a member. | ||
type AccountMemberUserDetails struct { | ||
ID string `json:"id"` | ||
FirstName string `json:"first_name"` | ||
LastName string `json:"last_name"` | ||
Email string `json:"email"` | ||
TwoFactorAuthenticationEnabled bool | ||
} | ||
|
||
// AccountMembersListResponse represents the response from the list | ||
// account members endpoint. | ||
type AccountMembersListResponse struct { | ||
Result []AccountMember `json:"result"` | ||
Response | ||
ResultInfo `json:"result_info"` | ||
} | ||
|
||
// AccountMemberDetailResponse is the API response, containing a single | ||
// account member. | ||
type AccountMemberDetailResponse struct { | ||
Success bool `json:"success"` | ||
Errors []string `json:"errors"` | ||
Messages []string `json:"messages"` | ||
Result AccountMember `json:"result"` | ||
} | ||
|
||
// AccountMemberInvitation represents the invitation for a new member to | ||
// the account. | ||
type AccountMemberInvitation struct { | ||
Email string `json:"email"` | ||
Roles []string `json:"roles"` | ||
} | ||
|
||
// AccountMembers returns all members of an account. | ||
// | ||
// API reference: https://api.cloudflare.com/#accounts-list-accounts | ||
func (api *API) AccountMembers(accountID string, pageOpts PaginationOptions) ([]AccountMember, ResultInfo, error) { | ||
v := url.Values{} | ||
if pageOpts.PerPage > 0 { | ||
v.Set("per_page", strconv.Itoa(pageOpts.PerPage)) | ||
} | ||
if pageOpts.Page > 0 { | ||
v.Set("page", strconv.Itoa(pageOpts.Page)) | ||
} | ||
|
||
uri := "/accounts/" + accountID + "/members" | ||
if len(v) > 0 { | ||
uri = uri + "?" + v.Encode() | ||
} | ||
|
||
res, err := api.makeRequest("GET", uri, nil) | ||
if err != nil { | ||
return []AccountMember{}, ResultInfo{}, errors.Wrap(err, errMakeRequestError) | ||
} | ||
|
||
var accountMemberListresponse AccountMembersListResponse | ||
err = json.Unmarshal(res, &accountMemberListresponse) | ||
if err != nil { | ||
return []AccountMember{}, ResultInfo{}, errors.Wrap(err, errUnmarshalError) | ||
} | ||
|
||
return accountMemberListresponse.Result, accountMemberListresponse.ResultInfo, nil | ||
} | ||
|
||
// CreateAccountMember invites a new member to join an account. | ||
// | ||
// API reference: https://api.cloudflare.com/#account-members-add-member | ||
func (api *API) CreateAccountMember(accountID string, emailAddress string, roles []string) (AccountMember, error) { | ||
uri := "/accounts/" + accountID + "/members" | ||
|
||
var newMember = AccountMemberInvitation{ | ||
Email: emailAddress, | ||
Roles: roles, | ||
} | ||
res, err := api.makeRequest("POST", uri, newMember) | ||
if err != nil { | ||
return AccountMember{}, errors.Wrap(err, errMakeRequestError) | ||
} | ||
|
||
var accountMemberListResponse AccountMemberDetailResponse | ||
err = json.Unmarshal(res, &accountMemberListResponse) | ||
if err != nil { | ||
return AccountMember{}, errors.Wrap(err, errUnmarshalError) | ||
} | ||
|
||
return accountMemberListResponse.Result, nil | ||
} | ||
|
||
// DeleteAccountMember removes a member from an account. | ||
// | ||
// API reference: https://api.cloudflare.com/#account-members-remove-member | ||
func (api *API) DeleteAccountMember(accountID string, userID string) error { | ||
uri := fmt.Sprintf("/accounts/%s/members/%s", accountID, userID) | ||
|
||
_, err := api.makeRequest("DELETE", uri, nil) | ||
if err != nil { | ||
return errors.Wrap(err, errMakeRequestError) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
// UpdateAccountMember modifies an existing account member. | ||
// | ||
// API reference: https://api.cloudflare.com/#account-members-update-member | ||
func (api *API) UpdateAccountMember(accountID string, userID string, member AccountMember) (AccountMember, error) { | ||
uri := fmt.Sprintf("/accounts/%s/members/%s", accountID, userID) | ||
|
||
res, err := api.makeRequest("PUT", uri, member) | ||
if err != nil { | ||
return AccountMember{}, errors.Wrap(err, errMakeRequestError) | ||
} | ||
|
||
var accountMemberListResponse AccountMemberDetailResponse | ||
err = json.Unmarshal(res, &accountMemberListResponse) | ||
if err != nil { | ||
return AccountMember{}, errors.Wrap(err, errUnmarshalError) | ||
} | ||
|
||
return accountMemberListResponse.Result, nil | ||
} | ||
|
||
// AccountMember returns details of a single account member. | ||
// | ||
// API reference: https://api.cloudflare.com/#account-members-member-details | ||
func (api *API) AccountMember(accountID string, memberID string) (AccountMember, error) { | ||
uri := fmt.Sprintf( | ||
"/accounts/%s/members/%s", | ||
accountID, | ||
memberID, | ||
) | ||
|
||
res, err := api.makeRequest("GET", uri, nil) | ||
if err != nil { | ||
return AccountMember{}, errors.Wrap(err, errMakeRequestError) | ||
} | ||
|
||
var accountMemberResponse AccountMemberDetailResponse | ||
err = json.Unmarshal(res, &accountMemberResponse) | ||
if err != nil { | ||
return AccountMember{}, errors.Wrap(err, errUnmarshalError) | ||
} | ||
|
||
return accountMemberResponse.Result, nil | ||
} |
Oops, something went wrong.