github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/iam/iamv1/api_keys.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/models" 9 "github.com/IBM-Cloud/bluemix-go/rest" 10 ) 11 12 type APIKeyResource struct { 13 Metadata APIKeyMetadata `json:"metadata"` 14 Entity APIKeyEntity `json:"entity"` 15 } 16 17 type APIKeyMetadata struct { 18 UUID string `json:"uuid"` 19 Version string `json:"version"` 20 Crn string `json:"crn"` 21 CreatedAt string `json:"createdAt"` 22 ModifiedAt string `json:"modifiedAt"` 23 } 24 25 type APIKeyEntity struct { 26 Name string `json:"name"` 27 Description string `json:"description"` 28 BoundTo string `json:"boundTo"` 29 Format string `json:"format"` 30 APIKey string `json:"apiKey"` 31 APIKeyID string `json:"apiKeyId"` 32 APIKeySecret string `json:"apiKeySecret"` 33 } 34 35 func (r APIKeyResource) ToModel() models.APIKey { 36 meta := r.Metadata 37 entity := r.Entity 38 39 return models.APIKey{ 40 UUID: meta.UUID, 41 Version: meta.Version, 42 Crn: meta.Crn, 43 CreatedAt: meta.CreatedAt, 44 ModifiedAt: meta.ModifiedAt, 45 46 Name: entity.Name, 47 Description: entity.Description, 48 BoundTo: entity.BoundTo, 49 Format: entity.Format, 50 APIKey: entity.APIKey, 51 APIKeyID: entity.APIKeyID, 52 APIKeySecret: entity.APIKeySecret, 53 } 54 } 55 56 const ( 57 _API_Key_Operation_Path_Root = "/apikeys/" 58 ) 59 60 type APIKeyRepository interface { 61 Get(uuid string) (*models.APIKey, error) 62 List(boundTo string) ([]models.APIKey, error) 63 FindByName(name string, boundTo string) ([]models.APIKey, error) 64 Create(key models.APIKey) (*models.APIKey, error) 65 Delete(uuid string) error 66 Update(uuid string, version string, key models.APIKey) (*models.APIKey, error) 67 } 68 69 type apiKeyRepository struct { 70 client *client.Client 71 } 72 73 func NewAPIKeyRepository(c *client.Client) APIKeyRepository { 74 return &apiKeyRepository{ 75 client: c, 76 } 77 } 78 79 func (r *apiKeyRepository) Get(uuid string) (*models.APIKey, error) { 80 key := APIKeyResource{} 81 _, err := r.client.Get(_API_Key_Operation_Path_Root+uuid, &key) 82 if err != nil { 83 return nil, err 84 } 85 result := key.ToModel() 86 return &result, nil 87 } 88 89 func (r *apiKeyRepository) List(boundTo string) ([]models.APIKey, error) { 90 var keys []models.APIKey 91 resp, err := r.client.GetPaginated("/apikeys?boundTo="+url.QueryEscape(boundTo), NewIAMPaginatedResources(APIKeyResource{}), func(resource interface{}) bool { 92 if apiKeyResource, ok := resource.(APIKeyResource); ok { 93 keys = append(keys, apiKeyResource.ToModel()) 94 return true 95 } 96 return false 97 }) 98 99 if resp.StatusCode == http.StatusNotFound { 100 return []models.APIKey{}, nil 101 } 102 103 return keys, err 104 } 105 106 func (r *apiKeyRepository) FindByName(name string, boundTo string) ([]models.APIKey, error) { 107 var keys []models.APIKey 108 resp, err := r.client.GetPaginated("/apikeys?boundTo="+url.QueryEscape(boundTo), NewIAMPaginatedResources(APIKeyResource{}), func(resource interface{}) bool { 109 if apiKeyResource, ok := resource.(APIKeyResource); ok { 110 if apiKeyResource.Entity.Name == name { 111 keys = append(keys, apiKeyResource.ToModel()) 112 } 113 return true 114 } 115 return false 116 }) 117 118 if resp.StatusCode == http.StatusNotFound { 119 return []models.APIKey{}, nil 120 } 121 122 return keys, err 123 } 124 125 func (r *apiKeyRepository) Create(key models.APIKey) (*models.APIKey, error) { 126 var keyCreated APIKeyResource 127 _, err := r.client.Post("/apikeys", &key, &keyCreated) 128 if err != nil { 129 return nil, err 130 } 131 keyToReturn := keyCreated.ToModel() 132 return &keyToReturn, err 133 } 134 135 func (r *apiKeyRepository) Delete(uuid string) error { 136 _, err := r.client.Delete("/apikeys/" + uuid) 137 return err 138 } 139 140 func (r *apiKeyRepository) Update(uuid string, version string, key models.APIKey) (*models.APIKey, error) { 141 req := rest.PutRequest(*r.client.Config.Endpoint + "/apikeys/" + uuid).Body(&key) 142 req.Set("If-Match", version) 143 144 var keyUpdated APIKeyResource 145 _, err := r.client.SendRequest(req, &keyUpdated) 146 if err != nil { 147 return nil, err 148 } 149 keyToReturn := keyUpdated.ToModel() 150 return &keyToReturn, nil 151 }