github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/mccp/mccpv2/service_bindings.go (about)

     1  package mccpv2
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/IBM-Cloud/bluemix-go/client"
     8  	"github.com/IBM-Cloud/bluemix-go/rest"
     9  )
    10  
    11  //ServiceBindingRequest ...
    12  type ServiceBindingRequest struct {
    13  	ServiceInstanceGUID string `json:"service_instance_guid"`
    14  	AppGUID             string `json:"app_guid"`
    15  	Parameters          string `json:"parameters,omitempty"`
    16  }
    17  
    18  //ServiceBindingMetadata ...
    19  type ServiceBindingMetadata struct {
    20  	GUID string `json:"guid"`
    21  	URL  string `json:"url"`
    22  }
    23  
    24  //ServiceBindingEntity ...
    25  type ServiceBindingEntity struct {
    26  	ServiceInstanceGUID string                 `json:"service_instance_guid"`
    27  	AppGUID             string                 `json:"app_guid"`
    28  	Credentials         map[string]interface{} `json:"credentials"`
    29  }
    30  
    31  //ServiceBindingResource ...
    32  type ServiceBindingResource struct {
    33  	Resource
    34  	Entity ServiceBindingEntity
    35  }
    36  
    37  //ServiceBindingFields ...
    38  type ServiceBindingFields struct {
    39  	Metadata ServiceBindingMetadata
    40  	Entity   ServiceBindingEntity
    41  }
    42  
    43  //ServiceBinding model
    44  type ServiceBinding struct {
    45  	GUID                string
    46  	ServiceInstanceGUID string
    47  	AppGUID             string
    48  	Credentials         map[string]interface{}
    49  }
    50  
    51  //ToFields ..
    52  func (resource ServiceBindingResource) ToFields() ServiceBinding {
    53  	entity := resource.Entity
    54  
    55  	return ServiceBinding{
    56  		GUID:                resource.Metadata.GUID,
    57  		ServiceInstanceGUID: entity.ServiceInstanceGUID,
    58  		AppGUID:             entity.AppGUID,
    59  		Credentials:         entity.Credentials,
    60  	}
    61  }
    62  
    63  //ServiceBindings ...
    64  type ServiceBindings interface {
    65  	Create(req ServiceBindingRequest) (*ServiceBindingFields, error)
    66  	Get(guid string) (*ServiceBindingFields, error)
    67  	Delete(guid string, opts ...bool) error
    68  	List(filters ...string) ([]ServiceBinding, error)
    69  }
    70  
    71  type serviceBinding struct {
    72  	client *client.Client
    73  }
    74  
    75  func newServiceBindingAPI(c *client.Client) ServiceBindings {
    76  	return &serviceBinding{
    77  		client: c,
    78  	}
    79  }
    80  
    81  func (r *serviceBinding) Get(sbGUID string) (*ServiceBindingFields, error) {
    82  	rawURL := fmt.Sprintf("/v2/service_bindings/%s", sbGUID)
    83  	sbFields := ServiceBindingFields{}
    84  	_, err := r.client.Get(rawURL, &sbFields, nil)
    85  	if err != nil {
    86  		return nil, err
    87  	}
    88  	return &sbFields, nil
    89  }
    90  
    91  func (r *serviceBinding) Create(req ServiceBindingRequest) (*ServiceBindingFields, error) {
    92  	rawURL := "/v2/service_bindings"
    93  	sbFields := ServiceBindingFields{}
    94  	_, err := r.client.Post(rawURL, req, &sbFields)
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  	return &sbFields, nil
    99  }
   100  
   101  // opts is list of boolean parametes
   102  // opts[0] - async - Will run the delete request in a background job. Recommended: 'true'. Default to 'true'.
   103  
   104  func (r *serviceBinding) Delete(guid string, opts ...bool) error {
   105  	async := true
   106  	if len(opts) > 0 {
   107  		async = opts[0]
   108  	}
   109  	rawURL := fmt.Sprintf("/v2/service_bindings/%s?async=%t", guid, async)
   110  	_, err := r.client.Delete(rawURL)
   111  	return err
   112  }
   113  
   114  func (r *serviceBinding) List(filters ...string) ([]ServiceBinding, error) {
   115  	rawURL := "/v2/service_bindings"
   116  	req := rest.GetRequest(rawURL)
   117  	if len(filters) > 0 {
   118  		req.Query("q", strings.Join(filters, ""))
   119  	}
   120  	httpReq, err := req.Build()
   121  	if err != nil {
   122  		return nil, err
   123  	}
   124  	path := httpReq.URL.String()
   125  	bindings, err := listServiceBindingWithPath(r.client, path)
   126  	if err != nil {
   127  		return nil, err
   128  	}
   129  	return bindings, nil
   130  }
   131  
   132  func listServiceBindingWithPath(c *client.Client, path string) ([]ServiceBinding, error) {
   133  	var sb []ServiceBinding
   134  	_, err := c.GetPaginated(path, NewCCPaginatedResources(ServiceBindingResource{}), func(resource interface{}) bool {
   135  		if sbResource, ok := resource.(ServiceBindingResource); ok {
   136  			sb = append(sb, sbResource.ToFields())
   137  			return true
   138  		}
   139  		return false
   140  	})
   141  	return sb, err
   142  }