github.com/IBM-Cloud/bluemix-go@v0.0.0-20240314082800-4e02a69b84b2/api/iampap/iampapv2/roles.go (about) 1 package iampapv2 2 3 import ( 4 "fmt" 5 6 "github.com/IBM-Cloud/bluemix-go/client" 7 "github.com/IBM-Cloud/bluemix-go/rest" 8 ) 9 10 type CreateRoleRequest struct { 11 Name string `json:"name"` 12 ServiceName string `json:"service_name"` 13 AccountID string `json:"account_id"` 14 DisplayName string `json:"display_name"` 15 Description string `json:"description"` 16 Actions []string `json:"actions,omitempty"` 17 } 18 type UpdateRoleRequest struct { 19 DisplayName string `json:"display_name"` 20 Description string `json:"description"` 21 Actions []string `json:"actions,omitempty"` 22 } 23 24 type Role struct { 25 CreateRoleRequest 26 ID string `json:"id"` 27 Crn string `json:"crn"` 28 CreatedAt string `json:"created_at"` 29 CreatedByID string `json:"created_by_id"` 30 LastModifiedAt string `json:"last_modified_at"` 31 LastModifiedByID string `json:"last_modified_by_id"` 32 } 33 34 type ListResponse struct { 35 CustomRoles []Role `json:"custom_roles"` 36 ServiceRoles []Role `json:"service_roles"` 37 SystemRoles []Role `json:"system_roles"` 38 } 39 40 type RoleRepository interface { 41 Get(roleID string) (Role, string, error) 42 Create(request CreateRoleRequest) (Role, error) 43 Update(request UpdateRoleRequest, roleID, etag string) (Role, error) 44 Delete(roleID string) error 45 ListCustomRoles(accountID, serviceName string) ([]Role, error) 46 ListSystemDefinedRoles() ([]Role, error) 47 ListServiceRoles(serviceName string) ([]Role, error) 48 ListAll(query RoleQuery) ([]Role, error) 49 } 50 51 type roleRepository struct { 52 client *client.Client 53 } 54 55 func NewRoleRepository(c *client.Client) RoleRepository { 56 return &roleRepository{ 57 client: c, 58 } 59 } 60 61 type RoleQueryFormatParameter string 62 63 type RoleQuery struct { 64 AccountID string 65 ServiceName string 66 Format RoleQueryFormatParameter 67 } 68 69 // SetQuery will set query parameter to the passed-in request 70 func (q RoleQuery) SetQuery(req *rest.Request) { 71 if q.AccountID != "" { 72 req.Query("account_id", q.AccountID) 73 } 74 if q.ServiceName != "" { 75 req.Query("service_name", q.ServiceName) 76 } 77 if q.Format != "" { 78 req.Query("format", string(q.Format)) 79 } 80 } 81 82 func (r *roleRepository) Create(request CreateRoleRequest) (Role, error) { 83 res := Role{} 84 _, err := r.client.Post(fmt.Sprintf("/v2/roles"), &request, &res) 85 if err != nil { 86 return Role{}, err 87 } 88 return res, nil 89 } 90 91 func (r *roleRepository) Get(roleID string) (Role, string, error) { 92 res := Role{} 93 response, err := r.client.Get(fmt.Sprintf("/v2/roles/%s", roleID), &res) 94 if err != nil { 95 return Role{}, "", err 96 } 97 return res, response.Header.Get("Etag"), nil 98 } 99 100 func (r *roleRepository) Update(request UpdateRoleRequest, roleID, etag string) (Role, error) { 101 res := Role{} 102 header := make(map[string]string) 103 104 header["IF-Match"] = etag 105 _, err := r.client.Put(fmt.Sprintf("/v2/roles/%s", roleID), &request, &res, header) 106 if err != nil { 107 return Role{}, err 108 } 109 return res, nil 110 } 111 112 //Delete Function 113 func (r *roleRepository) Delete(roleID string) error { 114 _, err := r.client.Delete(fmt.Sprintf("/v2/roles/%s", roleID)) 115 return err 116 } 117 118 func (r *roleRepository) ListCustomRoles(accountID, serviceName string) ([]Role, error) { 119 res := ListResponse{} 120 var requestpath string 121 122 requestpath = fmt.Sprintf("/v2/roles?account_id=%s", accountID) 123 124 _, err := r.client.Get(requestpath, &res) 125 if err != nil { 126 return []Role{}, err 127 } 128 if serviceName == "" { 129 return res.CustomRoles, nil 130 } else { 131 var matchingRoles []Role 132 for _, role := range res.CustomRoles { 133 if role.ServiceName == serviceName { 134 matchingRoles = append(matchingRoles, role) 135 } 136 } 137 return matchingRoles, nil 138 } 139 140 } 141 142 func (r *roleRepository) ListSystemDefinedRoles() ([]Role, error) { 143 res := ListResponse{} 144 var requestpath string 145 requestpath = fmt.Sprintf("/v2/roles") 146 _, err := r.client.Get(requestpath, &res) 147 if err != nil { 148 return []Role{}, err 149 } 150 return res.SystemRoles, nil 151 } 152 153 func (r *roleRepository) ListServiceRoles(serviceName string) ([]Role, error) { 154 res := ListResponse{} 155 var requestpath string 156 requestpath = fmt.Sprintf("/v2/roles?service_name=%s", serviceName) 157 _, err := r.client.Get(requestpath, &res) 158 if err != nil { 159 return []Role{}, err 160 } 161 return res.ServiceRoles, nil 162 } 163 164 func (r *roleRepository) ListAll(query RoleQuery) ([]Role, error) { 165 response, err := r.query(query) 166 if err != nil { 167 return []Role{}, err 168 } 169 return append(response.CustomRoles, append(response.ServiceRoles, response.SystemRoles...)...), nil 170 } 171 172 func (r *roleRepository) query(query RoleQuery) (ListResponse, error) { 173 req := rest.GetRequest(*r.client.Config.Endpoint + "/v2/roles") 174 query.SetQuery(req) 175 176 var response ListResponse 177 _, err := r.client.SendRequest(req, &response) 178 179 return response, err 180 }