package generic import ( "errors" "strings" "time" ) type Plan string type Mercher interface { CreateBusiness(signup MercherSignup) (*MercherCustomer, error) GetPlanExpires(search MercherCustomerIds) (time.Time, error) } const ( PlanZero = Plan("zero") PlanBasic = Plan("basic") PlanMedium = Plan("medium") PlanAdvanced = Plan("advanced") PlanUnbounded = Plan("unbounded") ) var ( ErrUnrecognizedMercher = errors.New("merchant type not recognized") ) type MercherCustomerIds struct { CustomerId string BusinessName string Email string Phone string } type MercherSignup struct { Email string Firstname string Lastname string BusinessName string DislayName string AddressCity string AddressCountry string AddressLine1 string AddressLine2 string AddressPostalCode string AddressState string // TaxId string BusinessTierString string } type MercherCustomer struct { PlanId string MercherPlanId string CustomerId string } type CustomerId string type dummy struct{} func (d *dummy) DoSignup(s MercherSignup) (*MercherCustomer, error) { return &MercherCustomer{ CustomerId: s.Email + "id", MercherPlanId: "dummy-plan-id-" + string(d.emailToPlan(s.Email)), PlanId: "dummy-plan-id-" + string(d.emailToPlan(s.Email)), }, nil } func (*dummy) Delete(s CustomerId) error { return nil } func (*dummy) emailToPlan(email string) Plan { if strings.Contains(email, string(PlanZero)) { return PlanZero } else if strings.Contains(email, string(PlanBasic)) { return PlanBasic } else if strings.Contains(email, string(PlanMedium)) { return PlanMedium } else if strings.Contains(email, string(PlanAdvanced)) { return PlanAdvanced } else if strings.Contains(email, string(PlanUnbounded)) { return PlanUnbounded } else { return PlanBasic } } func (d *dummy) FindByEmail(email string) (MercherCustomer, error) { return MercherCustomer{ Id: email + "-id", PlanId: "dummy-plan-id-" + string(d.emailToPlan(email)), }, nil } const ( MercherTypeDummy = "dummy" )