github.com/IBM-Cloud/bluemix-go@v0.0.0-20240314082800-4e02a69b84b2/api/iam/iamv1/service_policies.go (about)

     1  package iamv1
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  
     7  	"github.com/IBM-Cloud/bluemix-go/client"
     8  	"github.com/IBM-Cloud/bluemix-go/helpers"
     9  	"github.com/IBM-Cloud/bluemix-go/models"
    10  	"github.com/IBM-Cloud/bluemix-go/rest"
    11  )
    12  
    13  const (
    14  	_ServicePoliciesEndpointTemplate = "/acms/v1/scopes/%s/service_ids/%s/policies"
    15  	_ServicePolicyEndpointTemplate   = "/acms/v1/scopes/%s/service_ids/%s/policies/%s"
    16  )
    17  
    18  // identifier to specify the exact service policy
    19  // following hierarchy "scope/service ID/policy ID"
    20  type ServicePolicyIdentifier struct {
    21  	Scope    string
    22  	IAMID    string
    23  	PolicyID string
    24  }
    25  
    26  //go:generate counterfeiter . ServicePolicyRepository
    27  type ServicePolicyRepository interface {
    28  	List(scope string, serviceID string) ([]models.Policy, error)
    29  	Get(scope string, serviceID string, policyID string) (models.Policy, error)
    30  	Create(scope string, serviceID string, policy models.Policy) (models.Policy, error)
    31  	Update(identifier ServicePolicyIdentifier, policy models.Policy, version string) (models.Policy, error)
    32  	Delete(identifier ServicePolicyIdentifier) error
    33  }
    34  
    35  type servicePolicyRepository struct {
    36  	client *client.Client
    37  }
    38  
    39  func NewServicePolicyRepository(c *client.Client) ServicePolicyRepository {
    40  	return &servicePolicyRepository{
    41  		client: c,
    42  	}
    43  }
    44  
    45  type ServicePolicyQueryResult struct {
    46  	Policies []models.Policy `json:"policies"`
    47  }
    48  
    49  func (r *servicePolicyRepository) List(scope string, serviceID string) ([]models.Policy, error) {
    50  	response := ServicePolicyQueryResult{}
    51  	_, err := r.client.Get(r.generateURLPath(_ServicePoliciesEndpointTemplate, scope, serviceID), &response)
    52  	if err != nil {
    53  		return []models.Policy{}, err
    54  	}
    55  	return response.Policies, nil
    56  }
    57  
    58  func (r *servicePolicyRepository) Get(scope string, serviceID string, policyID string) (models.Policy, error) {
    59  	response := models.Policy{}
    60  	resp, err := r.client.Get(r.generateURLPath(_ServicePolicyEndpointTemplate, scope, serviceID, policyID), &response)
    61  	if err != nil {
    62  		return models.Policy{}, err
    63  	}
    64  	response.Version = resp.Header.Get("Etag")
    65  	return response, nil
    66  }
    67  
    68  func (r *servicePolicyRepository) Create(scope string, serviceID string, policy models.Policy) (models.Policy, error) {
    69  	policyCreated := models.Policy{}
    70  	resp, err := r.client.Post(r.generateURLPath(_ServicePoliciesEndpointTemplate, scope, serviceID), &policy, &policyCreated)
    71  	if err != nil {
    72  		return models.Policy{}, err
    73  	}
    74  	policyCreated.Version = resp.Header.Get("Etag")
    75  	return policyCreated, nil
    76  }
    77  
    78  func (r *servicePolicyRepository) Update(identifier ServicePolicyIdentifier, policy models.Policy, version string) (models.Policy, error) {
    79  	policyUpdated := models.Policy{}
    80  	request := rest.PutRequest(helpers.GetFullURL(*r.client.Config.Endpoint,
    81  		r.generateURLPath(_ServicePolicyEndpointTemplate, identifier.Scope, identifier.IAMID, identifier.PolicyID))).Body(&policy).Set("If-Match", version)
    82  	resp, err := r.client.SendRequest(request, &policyUpdated)
    83  	if err != nil {
    84  		return models.Policy{}, err
    85  	}
    86  	policyUpdated.Version = resp.Header.Get("Etag")
    87  	return policyUpdated, nil
    88  }
    89  
    90  func (r *servicePolicyRepository) Delete(identifier ServicePolicyIdentifier) error {
    91  	_, err := r.client.Delete(r.generateURLPath(_ServicePolicyEndpointTemplate, identifier.Scope, identifier.IAMID, identifier.PolicyID))
    92  	return err
    93  }
    94  
    95  func (r *servicePolicyRepository) generateURLPath(template string, parameters ...string) string {
    96  	// TODO: need a URL generator to auto escape parameters
    97  	escaped := []interface{}{}
    98  	for _, parameter := range parameters {
    99  		escaped = append(escaped, url.PathEscape(parameter))
   100  	}
   101  	return fmt.Sprintf(template, escaped...)
   102  }