github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+incompatible/cf/api/service_plan.go (about)

     1  package api
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"strings"
     7  
     8  	"code.cloudfoundry.org/cli/cf/api/resources"
     9  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    10  	"code.cloudfoundry.org/cli/cf/models"
    11  	"code.cloudfoundry.org/cli/cf/net"
    12  )
    13  
    14  //go:generate counterfeiter . ServicePlanRepository
    15  
    16  type ServicePlanRepository interface {
    17  	Search(searchParameters map[string]string) ([]models.ServicePlanFields, error)
    18  	Update(models.ServicePlanFields, string, bool) error
    19  	ListPlansFromManyServices(serviceGUIDs []string) ([]models.ServicePlanFields, error)
    20  }
    21  
    22  type CloudControllerServicePlanRepository struct {
    23  	config  coreconfig.Reader
    24  	gateway net.Gateway
    25  }
    26  
    27  func NewCloudControllerServicePlanRepository(config coreconfig.Reader, gateway net.Gateway) CloudControllerServicePlanRepository {
    28  	return CloudControllerServicePlanRepository{
    29  		config:  config,
    30  		gateway: gateway,
    31  	}
    32  }
    33  
    34  func (repo CloudControllerServicePlanRepository) Update(servicePlan models.ServicePlanFields, serviceGUID string, public bool) error {
    35  	return repo.gateway.UpdateResource(
    36  		repo.config.APIEndpoint(),
    37  		fmt.Sprintf("/v2/service_plans/%s", servicePlan.GUID),
    38  		strings.NewReader(fmt.Sprintf(`{"public":%t}`, public)),
    39  	)
    40  }
    41  
    42  func (repo CloudControllerServicePlanRepository) ListPlansFromManyServices(serviceGUIDs []string) ([]models.ServicePlanFields, error) {
    43  	serviceGUIDsString := strings.Join(serviceGUIDs, ",")
    44  	plans := []models.ServicePlanFields{}
    45  
    46  	err := repo.gateway.ListPaginatedResources(
    47  		repo.config.APIEndpoint(),
    48  		fmt.Sprintf("/v2/service_plans?q=%s", url.QueryEscape("service_guid IN "+serviceGUIDsString)),
    49  		resources.ServicePlanResource{},
    50  		func(resource interface{}) bool {
    51  			if plan, ok := resource.(resources.ServicePlanResource); ok {
    52  				plans = append(plans, plan.ToFields())
    53  			}
    54  			return true
    55  		})
    56  	return plans, err
    57  }
    58  
    59  func (repo CloudControllerServicePlanRepository) Search(queryParams map[string]string) (plans []models.ServicePlanFields, err error) {
    60  	err = repo.gateway.ListPaginatedResources(
    61  		repo.config.APIEndpoint(),
    62  		combineQueryParametersWithURI("/v2/service_plans", queryParams),
    63  		resources.ServicePlanResource{},
    64  		func(resource interface{}) bool {
    65  			if sp, ok := resource.(resources.ServicePlanResource); ok {
    66  				plans = append(plans, sp.ToFields())
    67  			}
    68  			return true
    69  		})
    70  	return
    71  }
    72  
    73  func combineQueryParametersWithURI(uri string, queryParams map[string]string) string {
    74  	if len(queryParams) == 0 {
    75  		return uri
    76  	}
    77  
    78  	params := []string{}
    79  	for key, value := range queryParams {
    80  		params = append(params, url.QueryEscape(key+":"+value))
    81  	}
    82  
    83  	return uri + "?q=" + strings.Join(params, "%3B")
    84  }