github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/uaa/user.go (about)

     1  package uaa
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  
    10  	"code.cloudfoundry.org/cli/api/uaa/internal"
    11  )
    12  
    13  // User represents an UAA user account.
    14  type User struct {
    15  	ID       string   `json:"id"`
    16  	Username string   `json:"userName,omitempty"`
    17  	Password string   `json:"password,omitempty"`
    18  	Origin   string   `json:"origin,omitempty"`
    19  	Name     UserName `json:"name"`
    20  	Emails   []Email  `json:"emails"`
    21  	Groups   []Group  `json:"groups,omitempty"`
    22  }
    23  
    24  type UserName struct {
    25  	FamilyName string `json:"familyName"`
    26  	GivenName  string `json:"givenName"`
    27  }
    28  
    29  type Email struct {
    30  	Value   string `json:"value"`
    31  	Primary bool   `json:"primary"`
    32  }
    33  
    34  // CreateUser creates a new UAA user account with the provided password.
    35  func (client *Client) CreateUser(user string, password string, origin string) (User, error) {
    36  	userRequest := User{
    37  		Username: user,
    38  		Password: password,
    39  		Origin:   origin,
    40  		Name: UserName{
    41  			FamilyName: user,
    42  			GivenName:  user,
    43  		},
    44  		Emails: []Email{
    45  			{
    46  				Value:   user,
    47  				Primary: true,
    48  			},
    49  		},
    50  	}
    51  
    52  	bodyBytes, err := json.Marshal(userRequest)
    53  	if err != nil {
    54  		return User{}, err
    55  	}
    56  
    57  	request, err := client.newRequest(requestOptions{
    58  		RequestName: internal.PostUserRequest,
    59  		Header: http.Header{
    60  			"Content-Type": {"application/json"},
    61  		},
    62  		Body: bytes.NewBuffer(bodyBytes),
    63  	})
    64  	if err != nil {
    65  		return User{}, err
    66  	}
    67  
    68  	var userResponse User
    69  	response := Response{
    70  		Result: &userResponse,
    71  	}
    72  
    73  	err = client.connection.Make(request, &response)
    74  	if err != nil {
    75  		return User{}, err
    76  	}
    77  
    78  	return User(userResponse), nil
    79  }
    80  
    81  // CreateUser creates a new UAA user account with the provided object.
    82  func (client *Client) CreateUserFromObject(user User) (User, error) {
    83  	bodyBytes, err := json.Marshal(user)
    84  	if err != nil {
    85  		return User{}, err
    86  	}
    87  	request, err := client.newRequest(requestOptions{
    88  		RequestName: internal.PostUserRequest,
    89  		Header: http.Header{
    90  			"Content-Type": {"application/json"},
    91  		},
    92  		Body: bytes.NewBuffer(bodyBytes),
    93  	})
    94  	if err != nil {
    95  		return User{}, err
    96  	}
    97  
    98  	var userResponse User
    99  	response := Response{
   100  		Result: &userResponse,
   101  	}
   102  
   103  	err = client.connection.Make(request, &response)
   104  	if err != nil {
   105  		return User{}, err
   106  	}
   107  
   108  	return User(userResponse), nil
   109  }
   110  
   111  // DeleteUser delete an UAA user account.
   112  func (client *Client) DeleteUser(guid string) error {
   113  	request, err := client.newRequest(requestOptions{
   114  		RequestName: internal.DeleteUserRequest,
   115  		Header: http.Header{
   116  			"Content-Type": {"application/json"},
   117  		},
   118  		URIParams: internal.Params{"user_guid": guid},
   119  	})
   120  	if err != nil {
   121  		return err
   122  	}
   123  
   124  	var userResponse User
   125  	response := Response{
   126  		Result: &userResponse,
   127  	}
   128  
   129  	err = client.connection.Make(request, &response)
   130  	if err != nil {
   131  		return err
   132  	}
   133  
   134  	return nil
   135  }
   136  
   137  // GetUser get an UAA user account by its id.
   138  func (client *Client) GetUser(guid string) (User, error) {
   139  	request, err := client.newRequest(requestOptions{
   140  		RequestName: internal.GetUserRequest,
   141  		Header: http.Header{
   142  			"Content-Type": {"application/json"},
   143  		},
   144  		URIParams: internal.Params{"user_guid": guid},
   145  	})
   146  	if err != nil {
   147  		return User{}, err
   148  	}
   149  
   150  	var userResponse User
   151  	response := Response{
   152  		Result: &userResponse,
   153  	}
   154  
   155  	err = client.connection.Make(request, &response)
   156  	if err != nil {
   157  		return User{}, err
   158  	}
   159  
   160  	return User(userResponse), nil
   161  }
   162  
   163  // UpdateUser update a UAA user account.
   164  func (client *Client) UpdateUser(user User) (User, error) {
   165  	bodyBytes, err := json.Marshal(user)
   166  	if err != nil {
   167  		return User{}, err
   168  	}
   169  	fmt.Println(string(bodyBytes))
   170  	request, err := client.newRequest(requestOptions{
   171  		RequestName: internal.PutUserRequest,
   172  		Header: http.Header{
   173  			"Content-Type": {"application/json"},
   174  			"If-Match":     {"*"},
   175  		},
   176  		Body:      bytes.NewBuffer(bodyBytes),
   177  		URIParams: internal.Params{"user_guid": user.ID},
   178  	})
   179  	if err != nil {
   180  		return User{}, err
   181  	}
   182  
   183  	var userResponse User
   184  	response := Response{
   185  		Result: &userResponse,
   186  	}
   187  
   188  	err = client.connection.Make(request, &response)
   189  	if err != nil {
   190  		return User{}, err
   191  	}
   192  
   193  	return User(userResponse), nil
   194  }
   195  
   196  // GetUsers get all UAA user account by its username.
   197  func (client *Client) GetUsersByUsername(username string) ([]User, error) {
   198  	request, err := client.newRequest(requestOptions{
   199  		RequestName: internal.GetUsersRequest,
   200  		Header: http.Header{
   201  			"Content-Type": {"application/json"},
   202  		},
   203  		Query: url.Values{
   204  			"attributes": []string{"id,userName"},
   205  			"filter":     []string{fmt.Sprintf(`userName Eq "%s"`, username)},
   206  		},
   207  	})
   208  	if err != nil {
   209  		return []User{}, err
   210  	}
   211  
   212  	var usersResources struct {
   213  		Users []User `json:"resources"`
   214  	}
   215  	response := Response{
   216  		Result: &usersResources,
   217  	}
   218  
   219  	err = client.connection.Make(request, &response)
   220  	if err != nil {
   221  		return []User{}, err
   222  	}
   223  	return usersResources.Users, err
   224  }
   225  
   226  // ChangeUserPassword change an user password by its id.
   227  func (client *Client) ChangeUserPassword(guid, oldPass, newPass string) error {
   228  	changePassRequest := struct {
   229  		OldPassword string `json:"oldPassword"`
   230  		Password    string `json:"password"`
   231  	}{
   232  		OldPassword: oldPass,
   233  		Password:    newPass,
   234  	}
   235  	bodyBytes, err := json.Marshal(changePassRequest)
   236  	if err != nil {
   237  		return err
   238  	}
   239  	request, err := client.newRequest(requestOptions{
   240  		RequestName: internal.PutUserPasswordRequest,
   241  		Header: http.Header{
   242  			"Content-Type": {"application/json"},
   243  		},
   244  		URIParams: internal.Params{"user_guid": guid},
   245  		Body:      bytes.NewBuffer(bodyBytes),
   246  	})
   247  	if err != nil {
   248  		return err
   249  	}
   250  
   251  	response := Response{
   252  	}
   253  
   254  	err = client.connection.Make(request, &response)
   255  	if err != nil {
   256  		return err
   257  	}
   258  
   259  	return nil
   260  }