github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/cf/actors/plan_builder/plan_builder.go (about)

     1  package plan_builder
     2  
     3  import (
     4  	"github.com/cloudfoundry/cli/cf/api"
     5  	"github.com/cloudfoundry/cli/cf/api/organizations"
     6  	"github.com/cloudfoundry/cli/cf/models"
     7  )
     8  
     9  type PlanBuilder interface {
    10  	AttachOrgsToPlans([]models.ServicePlanFields) ([]models.ServicePlanFields, error)
    11  	AttachOrgToPlans([]models.ServicePlanFields, string) ([]models.ServicePlanFields, error)
    12  	GetPlansForServiceForOrg(string, string) ([]models.ServicePlanFields, error)
    13  	GetPlansForServiceWithOrgs(string) ([]models.ServicePlanFields, error)
    14  	GetPlansForService(string) ([]models.ServicePlanFields, error)
    15  	GetPlansVisibleToOrg(string) ([]models.ServicePlanFields, error)
    16  }
    17  
    18  var (
    19  	OrgToPlansVisibilityMap *map[string][]string
    20  	PlanToOrgsVisibilityMap *map[string][]string
    21  )
    22  
    23  type Builder struct {
    24  	servicePlanRepo           api.ServicePlanRepository
    25  	servicePlanVisibilityRepo api.ServicePlanVisibilityRepository
    26  	orgRepo                   organizations.OrganizationRepository
    27  }
    28  
    29  func NewBuilder(plan api.ServicePlanRepository, vis api.ServicePlanVisibilityRepository, org organizations.OrganizationRepository) Builder {
    30  	return Builder{
    31  		servicePlanRepo:           plan,
    32  		servicePlanVisibilityRepo: vis,
    33  		orgRepo:                   org,
    34  	}
    35  }
    36  
    37  func (builder Builder) AttachOrgToPlans(plans []models.ServicePlanFields, orgName string) ([]models.ServicePlanFields, error) {
    38  	visMap, err := builder.buildPlanToOrgVisibilityMap(orgName)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  	for planIndex, _ := range plans {
    43  		plan := &plans[planIndex]
    44  		plan.OrgNames = visMap[plan.Guid]
    45  	}
    46  
    47  	return plans, nil
    48  }
    49  
    50  func (builder Builder) AttachOrgsToPlans(plans []models.ServicePlanFields) ([]models.ServicePlanFields, error) {
    51  	visMap, err := builder.buildPlanToOrgsVisibilityMap()
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  	for planIndex, _ := range plans {
    56  		plan := &plans[planIndex]
    57  		plan.OrgNames = visMap[plan.Guid]
    58  	}
    59  
    60  	return plans, nil
    61  }
    62  
    63  func (builder Builder) GetPlansForServiceForOrg(serviceGuid string, orgName string) ([]models.ServicePlanFields, error) {
    64  	plans, err := builder.servicePlanRepo.Search(map[string]string{"service_guid": serviceGuid})
    65  	if err != nil {
    66  		return nil, err
    67  	}
    68  
    69  	plans, err = builder.AttachOrgToPlans(plans, orgName)
    70  	if err != nil {
    71  		return nil, err
    72  	}
    73  	return plans, nil
    74  }
    75  
    76  func (builder Builder) GetPlansForService(serviceGuid string) ([]models.ServicePlanFields, error) {
    77  	plans, err := builder.servicePlanRepo.Search(map[string]string{"service_guid": serviceGuid})
    78  	if err != nil {
    79  		return nil, err
    80  	}
    81  	return plans, nil
    82  }
    83  
    84  func (builder Builder) GetPlansForServiceWithOrgs(serviceGuid string) ([]models.ServicePlanFields, error) {
    85  	plans, err := builder.servicePlanRepo.Search(map[string]string{"service_guid": serviceGuid})
    86  	if err != nil {
    87  		return nil, err
    88  	}
    89  
    90  	plans, err = builder.AttachOrgsToPlans(plans)
    91  	if err != nil {
    92  		return nil, err
    93  	}
    94  	return plans, nil
    95  }
    96  
    97  func (builder Builder) GetPlansVisibleToOrg(orgName string) ([]models.ServicePlanFields, error) {
    98  	var plansToReturn []models.ServicePlanFields
    99  	allPlans, err := builder.servicePlanRepo.Search(nil)
   100  
   101  	planToOrgsVisMap, err := builder.buildPlanToOrgsVisibilityMap()
   102  	if err != nil {
   103  		return nil, err
   104  	}
   105  
   106  	orgToPlansVisMap := builder.buildOrgToPlansVisibilityMap(planToOrgsVisMap)
   107  
   108  	filterOrgPlans := orgToPlansVisMap[orgName]
   109  
   110  	for _, plan := range allPlans {
   111  		if builder.containsGuid(filterOrgPlans, plan.Guid) {
   112  			plan.OrgNames = planToOrgsVisMap[plan.Guid]
   113  			plansToReturn = append(plansToReturn, plan)
   114  		} else if plan.Public {
   115  			plansToReturn = append(plansToReturn, plan)
   116  		}
   117  	}
   118  
   119  	return plansToReturn, nil
   120  }
   121  
   122  func (builder Builder) containsGuid(guidSlice []string, guid string) bool {
   123  	for _, g := range guidSlice {
   124  		if g == guid {
   125  			return true
   126  		}
   127  	}
   128  	return false
   129  }
   130  
   131  func (builder Builder) buildPlanToOrgVisibilityMap(orgName string) (map[string][]string, error) {
   132  	// Since this map doesn't ever change, we memoize it for performance
   133  	orgLookup := make(map[string]string)
   134  
   135  	org, err := builder.orgRepo.FindByName(orgName)
   136  	if err != nil {
   137  		return nil, err
   138  	}
   139  	orgLookup[org.Guid] = org.Name
   140  
   141  	visibilities, err := builder.servicePlanVisibilityRepo.List()
   142  	if err != nil {
   143  		return nil, err
   144  	}
   145  
   146  	visMap := make(map[string][]string)
   147  	for _, vis := range visibilities {
   148  		if _, exists := orgLookup[vis.OrganizationGuid]; exists {
   149  			visMap[vis.ServicePlanGuid] = append(visMap[vis.ServicePlanGuid], orgLookup[vis.OrganizationGuid])
   150  		}
   151  	}
   152  
   153  	return visMap, nil
   154  }
   155  
   156  func (builder Builder) buildPlanToOrgsVisibilityMap() (map[string][]string, error) {
   157  	// Since this map doesn't ever change, we memoize it for performance
   158  	if PlanToOrgsVisibilityMap == nil {
   159  		orgLookup := make(map[string]string)
   160  
   161  		orgs, err := builder.orgRepo.ListOrgs()
   162  		if err != nil {
   163  			return nil, err
   164  		}
   165  		for _, org := range orgs {
   166  			orgLookup[org.Guid] = org.Name
   167  		}
   168  
   169  		visibilities, err := builder.servicePlanVisibilityRepo.List()
   170  		if err != nil {
   171  			return nil, err
   172  		}
   173  
   174  		visMap := make(map[string][]string)
   175  		for _, vis := range visibilities {
   176  			visMap[vis.ServicePlanGuid] = append(visMap[vis.ServicePlanGuid], orgLookup[vis.OrganizationGuid])
   177  		}
   178  		PlanToOrgsVisibilityMap = &visMap
   179  	}
   180  
   181  	return *PlanToOrgsVisibilityMap, nil
   182  }
   183  
   184  func (builder Builder) buildOrgToPlansVisibilityMap(planToOrgsMap map[string][]string) map[string][]string {
   185  	if OrgToPlansVisibilityMap == nil {
   186  		visMap := make(map[string][]string)
   187  		for planGuid, orgNames := range planToOrgsMap {
   188  			for _, orgName := range orgNames {
   189  				visMap[orgName] = append(visMap[orgName], planGuid)
   190  			}
   191  		}
   192  		OrgToPlansVisibilityMap = &visMap
   193  	}
   194  
   195  	return *OrgToPlansVisibilityMap
   196  }