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 }