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  }