github.com/iron-io/functions@v0.0.0-20180820112432-d59d7d1c40b2/api/models/app.go (about) 1 package models 2 3 import ( 4 "errors" 5 "fmt" 6 ) 7 8 type Apps []*App 9 10 var ( 11 ErrAppsAlreadyExists = errors.New("App already exists") 12 ErrAppsCreate = errors.New("Could not create app") 13 ErrAppsGet = errors.New("Could not get app from datastore") 14 ErrAppsList = errors.New("Could not list apps from datastore") 15 ErrAppsMissingNew = errors.New("Missing new application") 16 ErrAppsNameImmutable = errors.New("Could not update app - name is immutable") 17 ErrAppsNotFound = errors.New("App not found") 18 ErrAppsNothingToUpdate = errors.New("Nothing to update") 19 ErrAppsRemoving = errors.New("Could not remove app from datastore") 20 ErrAppsUpdate = errors.New("Could not update app") 21 ErrDeleteAppsWithRoutes = errors.New("Cannot remove apps with routes") 22 ErrUsableImage = errors.New("Image not found") 23 ) 24 25 type App struct { 26 Name string `json:"name"` 27 Routes Routes `json:"routes,omitempty"` 28 Config `json:"config"` 29 } 30 31 const ( 32 maxAppName = 30 33 ) 34 35 var ( 36 ErrAppsValidationMissingName = errors.New("Missing app name") 37 ErrAppsValidationTooLongName = fmt.Errorf("App name must be %v characters or less", maxAppName) 38 ErrAppsValidationInvalidName = errors.New("Invalid app name") 39 ) 40 41 func (a *App) Validate() error { 42 if a.Name == "" { 43 return ErrAppsValidationMissingName 44 } 45 if len(a.Name) > maxAppName { 46 return ErrAppsValidationTooLongName 47 } 48 for _, c := range a.Name { 49 if (c < '0' || '9' < c) && (c < 'A' || 'Z' > c) && (c < 'a' || 'z' < c) && c != '_' && c != '-' { 50 return ErrAppsValidationInvalidName 51 } 52 } 53 return nil 54 } 55 56 func (a *App) Clone() *App { 57 var c App 58 c.Name = a.Name 59 if a.Routes != nil { 60 for i := range a.Routes { 61 c.Routes = append(c.Routes, a.Routes[i].Clone()) 62 } 63 } 64 if a.Config != nil { 65 c.Config = make(Config) 66 for k, v := range a.Config { 67 c.Config[k] = v 68 } 69 } 70 return &c 71 } 72 73 // UpdateConfig adds entries from patch to a.Config, and removes entries with empty values. 74 func (a *App) UpdateConfig(patch Config) { 75 if patch != nil { 76 if a.Config == nil { 77 a.Config = make(Config) 78 } 79 for k, v := range patch { 80 if v == "" { 81 delete(a.Config, k) 82 } else { 83 a.Config[k] = v 84 } 85 } 86 } 87 } 88 89 type AppFilter struct { 90 // An SQL LIKE query. Empty does not filter. 91 Name string 92 }