github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/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 }