github.com/pivotal-cf/go-pivnet/v6@v6.0.2/user_groups.go (about)

     1  package pivnet
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  )
     9  
    10  type UserGroupsService struct {
    11  	client Client
    12  }
    13  
    14  type addRemoveUserGroupBody struct {
    15  	UserGroup UserGroup `json:"user_group"`
    16  }
    17  
    18  type createUserGroupBody struct {
    19  	UserGroup createUserGroup `json:"user_group"`
    20  }
    21  
    22  type updateUserGroupBody struct {
    23  	UserGroup updateUserGroup `json:"user_group"`
    24  }
    25  
    26  type addRemoveMemberBody struct {
    27  	Member member `json:"member"`
    28  }
    29  
    30  type UserGroupsResponse struct {
    31  	UserGroups []UserGroup `json:"user_groups,omitempty"`
    32  }
    33  
    34  type UpdateUserGroupResponse struct {
    35  	UserGroup UserGroup `json:"user_group,omitempty"`
    36  }
    37  
    38  type UserGroup struct {
    39  	ID          int      `json:"id,omitempty" yaml:"id,omitempty"`
    40  	Name        string   `json:"name,omitempty" yaml:"name,omitempty"`
    41  	Description string   `json:"description,omitempty" yaml:"description,omitempty"`
    42  	Members     []string `json:"members,omitempty" yaml:"members,omitempty"`
    43  	Admins      []string `json:"admins,omitempty" yaml:"admins,omitempty"`
    44  }
    45  
    46  type createUserGroup struct {
    47  	ID          int      `json:"id,omitempty"`
    48  	Name        string   `json:"name,omitempty"`
    49  	Description string   `json:"description,omitempty"`
    50  	Members     []string `json:"members"` // do not omit empty to satisfy pivnet
    51  }
    52  
    53  type updateUserGroup struct {
    54  	ID          int      `json:"id,omitempty"`
    55  	Name        string   `json:"name,omitempty"`
    56  	Description string   `json:"description,omitempty"`
    57  	Members     []string `json:"members,omitempty"`
    58  }
    59  
    60  type member struct {
    61  	Email string `json:"email,omitempty"`
    62  	Admin bool   `json:"admin,omitempty"`
    63  }
    64  
    65  func (u UserGroupsService) List() ([]UserGroup, error) {
    66  	url := "/user_groups"
    67  
    68  	var response UserGroupsResponse
    69  	resp, err := u.client.MakeRequest(
    70  		"GET",
    71  		url,
    72  		http.StatusOK,
    73  		nil,
    74  	)
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  	defer resp.Body.Close()
    79  
    80  	err = json.NewDecoder(resp.Body).Decode(&response)
    81  	if err != nil {
    82  		return nil, err
    83  	}
    84  
    85  	return response.UserGroups, nil
    86  }
    87  
    88  func (u UserGroupsService) ListForRelease(productSlug string, releaseID int) ([]UserGroup, error) {
    89  	url := fmt.Sprintf(
    90  		"/products/%s/releases/%d/user_groups",
    91  		productSlug,
    92  		releaseID,
    93  	)
    94  
    95  	var response UserGroupsResponse
    96  	resp, err := u.client.MakeRequest(
    97  		"GET",
    98  		url,
    99  		http.StatusOK,
   100  		nil,
   101  	)
   102  	if err != nil {
   103  		return nil, err
   104  	}
   105  	defer resp.Body.Close()
   106  
   107  	err = json.NewDecoder(resp.Body).Decode(&response)
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  
   112  	return response.UserGroups, nil
   113  }
   114  
   115  func (u UserGroupsService) AddToRelease(productSlug string, releaseID int, userGroupID int) error {
   116  	url := fmt.Sprintf(
   117  		"/products/%s/releases/%d/add_user_group",
   118  		productSlug,
   119  		releaseID,
   120  	)
   121  
   122  	body := addRemoveUserGroupBody{
   123  		UserGroup: UserGroup{
   124  			ID: userGroupID,
   125  		},
   126  	}
   127  
   128  	b, err := json.Marshal(body)
   129  	if err != nil {
   130  		// Untested as we cannot force an error because we are marshalling
   131  		// a known-good body
   132  		return err
   133  	}
   134  
   135  	resp, err := u.client.MakeRequest(
   136  		"PATCH",
   137  		url,
   138  		http.StatusNoContent,
   139  		bytes.NewReader(b),
   140  	)
   141  	if err != nil {
   142  		return err
   143  	}
   144  	defer resp.Body.Close()
   145  
   146  	return nil
   147  }
   148  
   149  func (u UserGroupsService) RemoveFromRelease(productSlug string, releaseID int, userGroupID int) error {
   150  	url := fmt.Sprintf(
   151  		"/products/%s/releases/%d/remove_user_group",
   152  		productSlug,
   153  		releaseID,
   154  	)
   155  
   156  	body := addRemoveUserGroupBody{
   157  		UserGroup: UserGroup{
   158  			ID: userGroupID,
   159  		},
   160  	}
   161  
   162  	b, err := json.Marshal(body)
   163  	if err != nil {
   164  		// Untested as we cannot force an error because we are marshalling
   165  		// a known-good body
   166  		return err
   167  	}
   168  
   169  	resp, err := u.client.MakeRequest(
   170  		"PATCH",
   171  		url,
   172  		http.StatusNoContent,
   173  		bytes.NewReader(b),
   174  	)
   175  	if err != nil {
   176  		return err
   177  	}
   178  	defer resp.Body.Close()
   179  
   180  	return nil
   181  }
   182  
   183  func (u UserGroupsService) Get(userGroupID int) (UserGroup, error) {
   184  	url := fmt.Sprintf("/user_groups/%d", userGroupID)
   185  
   186  	var response UserGroup
   187  	resp, err := u.client.MakeRequest(
   188  		"GET",
   189  		url,
   190  		http.StatusOK,
   191  		nil,
   192  	)
   193  	if err != nil {
   194  		return UserGroup{}, err
   195  	}
   196  	defer resp.Body.Close()
   197  
   198  	err = json.NewDecoder(resp.Body).Decode(&response)
   199  	if err != nil {
   200  		return UserGroup{}, err
   201  	}
   202  
   203  	return response, nil
   204  }
   205  
   206  func (u UserGroupsService) Create(name string, description string, members []string) (UserGroup, error) {
   207  	url := "/user_groups"
   208  
   209  	if members == nil {
   210  		members = []string{}
   211  	}
   212  
   213  	createBody := createUserGroupBody{
   214  		createUserGroup{
   215  			Name:        name,
   216  			Description: description,
   217  			Members:     members,
   218  		},
   219  	}
   220  
   221  	b, err := json.Marshal(createBody)
   222  	if err != nil {
   223  		// Untested as we cannot force an error because we are marshalling
   224  		// a known-good body
   225  		return UserGroup{}, err
   226  	}
   227  
   228  	body := bytes.NewReader(b)
   229  
   230  	var response UserGroup
   231  	resp, err := u.client.MakeRequest(
   232  		"POST",
   233  		url,
   234  		http.StatusCreated,
   235  		body,
   236  	)
   237  	if err != nil {
   238  		return UserGroup{}, err
   239  	}
   240  	defer resp.Body.Close()
   241  
   242  	err = json.NewDecoder(resp.Body).Decode(&response)
   243  	if err != nil {
   244  		return UserGroup{}, err
   245  	}
   246  
   247  	return response, nil
   248  }
   249  
   250  func (u UserGroupsService) Update(userGroup UserGroup) (UserGroup, error) {
   251  	url := fmt.Sprintf("/user_groups/%d", userGroup.ID)
   252  
   253  	createBody := updateUserGroupBody{
   254  		updateUserGroup{
   255  			Name:        userGroup.Name,
   256  			Description: userGroup.Description,
   257  		},
   258  	}
   259  
   260  	b, err := json.Marshal(createBody)
   261  	if err != nil {
   262  		// Untested as we cannot force an error because we are marshalling
   263  		// a known-good body
   264  		return UserGroup{}, err
   265  	}
   266  
   267  	body := bytes.NewReader(b)
   268  
   269  	var response UpdateUserGroupResponse
   270  	resp, err := u.client.MakeRequest(
   271  		"PATCH",
   272  		url,
   273  		http.StatusOK,
   274  		body,
   275  	)
   276  	if err != nil {
   277  		return UserGroup{}, err
   278  	}
   279  	defer resp.Body.Close()
   280  
   281  	err = json.NewDecoder(resp.Body).Decode(&response)
   282  	if err != nil {
   283  		return UserGroup{}, err
   284  	}
   285  
   286  	return response.UserGroup, nil
   287  }
   288  
   289  func (r UserGroupsService) Delete(userGroupID int) error {
   290  	url := fmt.Sprintf("/user_groups/%d", userGroupID)
   291  
   292  	resp, err := r.client.MakeRequest(
   293  		"DELETE",
   294  		url,
   295  		http.StatusNoContent,
   296  		nil,
   297  	)
   298  	if err != nil {
   299  		return err
   300  	}
   301  	defer resp.Body.Close()
   302  
   303  	return nil
   304  }
   305  
   306  func (r UserGroupsService) AddMemberToGroup(
   307  	userGroupID int,
   308  	memberEmailAddress string,
   309  	admin bool,
   310  ) (UserGroup, error) {
   311  	url := fmt.Sprintf("/user_groups/%d/add_member", userGroupID)
   312  
   313  	addRemoveMemberBody := addRemoveMemberBody{
   314  		member{
   315  			Email: memberEmailAddress,
   316  			Admin: admin,
   317  		},
   318  	}
   319  
   320  	b, err := json.Marshal(addRemoveMemberBody)
   321  	if err != nil {
   322  		// Untested as we cannot force an error because we are marshalling
   323  		// a known-good body
   324  		return UserGroup{}, err
   325  	}
   326  
   327  	body := bytes.NewReader(b)
   328  
   329  	var response UpdateUserGroupResponse
   330  	resp, err := r.client.MakeRequest(
   331  		"PATCH",
   332  		url,
   333  		http.StatusOK,
   334  		body,
   335  	)
   336  	if err != nil {
   337  		return UserGroup{}, err
   338  	}
   339  	defer resp.Body.Close()
   340  
   341  	err = json.NewDecoder(resp.Body).Decode(&response)
   342  	if err != nil {
   343  		return UserGroup{}, err
   344  	}
   345  
   346  	return response.UserGroup, nil
   347  }
   348  
   349  func (r UserGroupsService) RemoveMemberFromGroup(userGroupID int, memberEmailAddress string) (UserGroup, error) {
   350  	url := fmt.Sprintf("/user_groups/%d/remove_member", userGroupID)
   351  
   352  	addRemoveMemberBody := addRemoveMemberBody{
   353  		member{
   354  			Email: memberEmailAddress,
   355  		},
   356  	}
   357  
   358  	b, err := json.Marshal(addRemoveMemberBody)
   359  	if err != nil {
   360  		// Untested as we cannot force an error because we are marshalling
   361  		// a known-good body
   362  		return UserGroup{}, err
   363  	}
   364  
   365  	body := bytes.NewReader(b)
   366  
   367  	var response UpdateUserGroupResponse
   368  	resp, err := r.client.MakeRequest(
   369  		"PATCH",
   370  		url,
   371  		http.StatusOK,
   372  		body,
   373  	)
   374  	if err != nil {
   375  		return UserGroup{}, err
   376  	}
   377  	defer resp.Body.Close()
   378  
   379  	err = json.NewDecoder(resp.Body).Decode(&response)
   380  	if err != nil {
   381  		return UserGroup{}, err
   382  	}
   383  
   384  	return response.UserGroup, nil
   385  }