github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/cf/actors/brokerbuilder/broker_builder.go (about)

     1  package brokerbuilder
     2  
     3  import (
     4  	"github.com/liamawhite/cli-with-i18n/cf/actors/servicebuilder"
     5  	"github.com/liamawhite/cli-with-i18n/cf/api"
     6  	"github.com/liamawhite/cli-with-i18n/cf/models"
     7  )
     8  
     9  //go:generate counterfeiter . BrokerBuilder
    10  
    11  type BrokerBuilder interface {
    12  	AttachBrokersToServices([]models.ServiceOffering) ([]models.ServiceBroker, error)
    13  	AttachSpecificBrokerToServices(string, []models.ServiceOffering) (models.ServiceBroker, error)
    14  	GetAllServiceBrokers() ([]models.ServiceBroker, error)
    15  	GetBrokerWithAllServices(brokerName string) (models.ServiceBroker, error)
    16  	GetBrokerWithSpecifiedService(serviceName string) (models.ServiceBroker, error)
    17  }
    18  
    19  type Builder struct {
    20  	brokerRepo     api.ServiceBrokerRepository
    21  	serviceBuilder servicebuilder.ServiceBuilder
    22  }
    23  
    24  func NewBuilder(broker api.ServiceBrokerRepository, serviceBuilder servicebuilder.ServiceBuilder) Builder {
    25  	return Builder{
    26  		brokerRepo:     broker,
    27  		serviceBuilder: serviceBuilder,
    28  	}
    29  }
    30  
    31  func (builder Builder) AttachBrokersToServices(services []models.ServiceOffering) ([]models.ServiceBroker, error) {
    32  	var brokers []models.ServiceBroker
    33  	brokersMap := make(map[string]models.ServiceBroker)
    34  
    35  	for _, service := range services {
    36  		if service.BrokerGUID == "" {
    37  			continue
    38  		}
    39  
    40  		if broker, ok := brokersMap[service.BrokerGUID]; ok {
    41  			broker.Services = append(broker.Services, service)
    42  			brokersMap[broker.GUID] = broker
    43  		} else {
    44  			broker, err := builder.brokerRepo.FindByGUID(service.BrokerGUID)
    45  			if err != nil {
    46  				return nil, err
    47  			}
    48  			broker.Services = append(broker.Services, service)
    49  			brokersMap[service.BrokerGUID] = broker
    50  		}
    51  	}
    52  
    53  	for _, broker := range brokersMap {
    54  		brokers = append(brokers, broker)
    55  	}
    56  
    57  	return brokers, nil
    58  }
    59  
    60  func (builder Builder) AttachSpecificBrokerToServices(brokerName string, services []models.ServiceOffering) (models.ServiceBroker, error) {
    61  	broker, err := builder.brokerRepo.FindByName(brokerName)
    62  	if err != nil {
    63  		return models.ServiceBroker{}, err
    64  	}
    65  
    66  	for _, service := range services {
    67  		if service.BrokerGUID == broker.GUID {
    68  			broker.Services = append(broker.Services, service)
    69  		}
    70  	}
    71  
    72  	return broker, nil
    73  }
    74  
    75  func (builder Builder) GetAllServiceBrokers() ([]models.ServiceBroker, error) {
    76  	brokers := []models.ServiceBroker{}
    77  	brokerGUIDs := []string{}
    78  	var err error
    79  	var services models.ServiceOfferings
    80  
    81  	err = builder.brokerRepo.ListServiceBrokers(func(broker models.ServiceBroker) bool {
    82  		brokers = append(brokers, broker)
    83  		brokerGUIDs = append(brokerGUIDs, broker.GUID)
    84  		return true
    85  	})
    86  	if err != nil {
    87  		return nil, err
    88  	}
    89  
    90  	services, err = builder.serviceBuilder.GetServicesForManyBrokers(brokerGUIDs)
    91  	if err != nil {
    92  		return nil, err
    93  	}
    94  
    95  	brokers, err = builder.attachServiceOfferingsToBrokers(services, brokers)
    96  	if err != nil {
    97  		return nil, err
    98  	}
    99  
   100  	return brokers, err
   101  }
   102  
   103  func (builder Builder) attachServiceOfferingsToBrokers(services models.ServiceOfferings, brokers []models.ServiceBroker) ([]models.ServiceBroker, error) {
   104  	for _, service := range services {
   105  		for index, broker := range brokers {
   106  			if broker.GUID == service.BrokerGUID {
   107  				brokers[index].Services = append(brokers[index].Services, service)
   108  				break
   109  			}
   110  		}
   111  	}
   112  	return brokers, nil
   113  }
   114  
   115  func (builder Builder) GetBrokerWithAllServices(brokerName string) (models.ServiceBroker, error) {
   116  	broker, err := builder.brokerRepo.FindByName(brokerName)
   117  	if err != nil {
   118  		return models.ServiceBroker{}, err
   119  	}
   120  	services, err := builder.serviceBuilder.GetServicesForBroker(broker.GUID)
   121  	if err != nil {
   122  		return models.ServiceBroker{}, err
   123  	}
   124  	broker.Services = services
   125  
   126  	return broker, nil
   127  }
   128  
   129  func (builder Builder) GetBrokerWithSpecifiedService(serviceName string) (models.ServiceBroker, error) {
   130  	service, err := builder.serviceBuilder.GetServiceByNameWithPlansWithOrgNames(serviceName)
   131  	if err != nil {
   132  		return models.ServiceBroker{}, err
   133  	}
   134  	brokers, err := builder.AttachBrokersToServices([]models.ServiceOffering{service})
   135  	if err != nil || len(brokers) == 0 {
   136  		return models.ServiceBroker{}, err
   137  	}
   138  	return brokers[0], err
   139  }