github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/iam/iamv1/service_ids.go (about) 1 package iamv1 2 3 import ( 4 "net/http" 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 type ServiceIDResource struct { 14 Metadata IAMMetadata `json:"metadata"` 15 Entity ServiceIDEntity `json:"entity"` 16 } 17 18 type ServiceIDEntity struct { 19 BoundTo string `json:"boundTo"` 20 Name string `json:"name"` 21 Description string `json:"description"` 22 } 23 24 func (r *ServiceIDResource) ToModel() models.ServiceID { 25 return models.ServiceID{ 26 UUID: r.Metadata.UUID, 27 IAMID: r.Metadata.IAMID, 28 CRN: r.Metadata.CRN, 29 BoundTo: r.Entity.BoundTo, 30 Name: r.Entity.Name, 31 Description: r.Entity.Description, 32 Version: r.Metadata.Version, 33 CreatedAt: r.Metadata.CreatedAt, 34 ModifiedAt: r.Metadata.ModifiedAt, 35 } 36 } 37 38 type IAMMetadata struct { 39 UUID string `json:"uuid"` 40 IAMID string `json:"iam_id"` 41 Version string `json:"version"` 42 CRN string `json:"crn"` 43 CreatedAt string `json:"createdAt"` 44 ModifiedAt string `json:"modifiedAt"` 45 } 46 47 const ( 48 _IAM_App = "iam" 49 _IAM_ENDPOINT_ENV = "IAM_ENDPOINT" 50 _SERVICE_ID_PATH = "/serviceids/" 51 _BoundToQuery = "boundTo" 52 ) 53 54 //go:generate counterfeiter . ServiceIDRepository 55 type ServiceIDRepository interface { 56 Get(uuid string) (models.ServiceID, error) 57 List(boundTo string) ([]models.ServiceID, error) 58 FindByName(boundTo string, name string) ([]models.ServiceID, error) 59 Create(serviceId models.ServiceID) (models.ServiceID, error) 60 Update(uuid string, serviceId models.ServiceID, version string) (models.ServiceID, error) 61 Delete(uuid string) error 62 } 63 64 type serviceIDRepository struct { 65 client *client.Client 66 } 67 68 func NewServiceIDRepository(c *client.Client) ServiceIDRepository { 69 return &serviceIDRepository{ 70 client: c, 71 } 72 } 73 74 type IAMResponseContext struct { 75 RequestID string `json:"requestId"` 76 RequestType string `json:"requestType"` 77 UserAgent string `json:"userAgent"` 78 ClientIP string `json:"clientIp"` 79 InstanceID string `json:"instanceId"` 80 ThreadID string `json:"threadId"` 81 Host string `json:"host"` 82 StartTime string `json:"startTime"` 83 EndTime string `json:"endTime"` 84 ElapsedTime string `json:"elapsedTime"` 85 Locale string `json:"locale"` 86 } 87 88 type ServiceIDSearchResults struct { 89 Context IAMResponseContext `json:"context"` 90 ServiceIDs []ServiceIDResource `json:"items"` 91 } 92 93 func (r *serviceIDRepository) List(boundTo string) ([]models.ServiceID, error) { 94 var serviceIDs []models.ServiceID 95 _, err := r.client.GetPaginated("/serviceids?boundTo="+url.QueryEscape(boundTo), NewIAMPaginatedResources(ServiceIDResource{}), func(r interface{}) bool { 96 if idResource, ok := r.(ServiceIDResource); ok { 97 serviceIDs = append(serviceIDs, idResource.ToModel()) 98 return true 99 } 100 return false 101 }) 102 103 if err != nil { 104 return []models.ServiceID{}, err 105 } 106 107 return serviceIDs, nil 108 } 109 110 func (r *serviceIDRepository) FindByName(boundTo string, name string) ([]models.ServiceID, error) { 111 var serviceIDs []models.ServiceID 112 resp, err := r.client.GetPaginated("/serviceids?boundTo="+url.QueryEscape(boundTo), NewIAMPaginatedResources(ServiceIDResource{}), func(r interface{}) bool { 113 if idResource, ok := r.(ServiceIDResource); ok { 114 if idResource.Entity.Name == name { 115 serviceIDs = append(serviceIDs, idResource.ToModel()) 116 } 117 return true 118 } 119 return false 120 }) 121 122 if resp.StatusCode == http.StatusNotFound { 123 return []models.ServiceID{}, nil 124 } 125 126 return serviceIDs, err 127 } 128 129 type ServiceIDResponse struct { 130 IAMResponseContext 131 ServiceIDResource 132 } 133 134 func (r *serviceIDRepository) Create(serviceId models.ServiceID) (models.ServiceID, error) { 135 createdId := ServiceIDResponse{} 136 _, err := r.client.Post(_SERVICE_ID_PATH, &serviceId, &createdId) 137 if err != nil { 138 return models.ServiceID{}, err 139 } 140 return createdId.ToModel(), err 141 } 142 143 func (r *serviceIDRepository) Update(uuid string, serviceId models.ServiceID, version string) (models.ServiceID, error) { 144 updatedId := ServiceIDResponse{} 145 request := rest.PutRequest(helpers.GetFullURL(*r.client.Config.Endpoint, _SERVICE_ID_PATH+uuid)).Add("If-Match", version).Body(&serviceId) 146 _, err := r.client.SendRequest(request, &updatedId) 147 if err != nil { 148 return models.ServiceID{}, err 149 } 150 return updatedId.ToModel(), err 151 } 152 153 func (r *serviceIDRepository) Delete(uuid string) error { 154 _, err := r.client.Delete(_SERVICE_ID_PATH + uuid) 155 return err 156 } 157 158 func (r *serviceIDRepository) Get(uuid string) (models.ServiceID, error) { 159 serviceID := ServiceIDResponse{} 160 _, err := r.client.Get(_SERVICE_ID_PATH+uuid, &serviceID) 161 if err != nil { 162 return models.ServiceID{}, err 163 } 164 return serviceID.ToModel(), nil 165 }