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  }