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