github.com/IBM-Cloud/bluemix-go@v0.0.0-20240314082800-4e02a69b84b2/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  }