github.com/iron-io/functions@v0.0.0-20180820112432-d59d7d1c40b2/api/datastore/internal/datastoreutil/validator.go (about)

     1  package datastoreutil
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/iron-io/functions/api/models"
     7  )
     8  
     9  // Datastore is a copy of models.Datastore, with additional comments on parameter guarantees.
    10  type Datastore interface {
    11  	// name will never be empty.
    12  	GetApp(ctx context.Context, name string) (*models.App, error)
    13  
    14  	GetApps(ctx context.Context, appFilter *models.AppFilter) ([]*models.App, error)
    15  
    16  	// app and app.Name will never be nil/empty.
    17  	InsertApp(ctx context.Context, app *models.App) (*models.App, error)
    18  	UpdateApp(ctx context.Context, app *models.App) (*models.App, error)
    19  
    20  	// name will never be empty.
    21  	RemoveApp(ctx context.Context, name string) error
    22  
    23  	// appName and routePath will never be empty.
    24  	GetRoute(ctx context.Context, appName, routePath string) (*models.Route, error)
    25  	RemoveRoute(ctx context.Context, appName, routePath string) error
    26  
    27  	GetRoutes(ctx context.Context, filter *models.RouteFilter) (routes []*models.Route, err error)
    28  
    29  	// appName will never be empty
    30  	GetRoutesByApp(ctx context.Context, appName string, filter *models.RouteFilter) (routes []*models.Route, err error)
    31  
    32  	// route will never be nil and route's AppName and Path will never be empty.
    33  	InsertRoute(ctx context.Context, route *models.Route) (*models.Route, error)
    34  	UpdateRoute(ctx context.Context, route *models.Route) (*models.Route, error)
    35  
    36  	// key will never be nil/empty
    37  	Put(ctx context.Context, key, val []byte) error
    38  	Get(ctx context.Context, key []byte) ([]byte, error)
    39  }
    40  
    41  // NewValidator returns a models.Datastore which validates certain arguments before delegating to ds.
    42  func NewValidator(ds Datastore) models.Datastore {
    43  	return &validator{ds}
    44  }
    45  
    46  type validator struct {
    47  	ds Datastore
    48  }
    49  
    50  func (v *validator) GetApp(ctx context.Context, name string) (app *models.App, err error) {
    51  	if name == "" {
    52  		return nil, models.ErrDatastoreEmptyAppName
    53  	}
    54  	return v.ds.GetApp(ctx, name)
    55  }
    56  
    57  func (v *validator) GetApps(ctx context.Context, appFilter *models.AppFilter) ([]*models.App, error) {
    58  	return v.ds.GetApps(ctx, appFilter)
    59  }
    60  
    61  func (v *validator) InsertApp(ctx context.Context, app *models.App) (*models.App, error) {
    62  	if app == nil {
    63  		return nil, models.ErrDatastoreEmptyApp
    64  	}
    65  	if app.Name == "" {
    66  		return nil, models.ErrDatastoreEmptyAppName
    67  	}
    68  
    69  	return v.ds.InsertApp(ctx, app)
    70  }
    71  
    72  func (v *validator) UpdateApp(ctx context.Context, app *models.App) (*models.App, error) {
    73  	if app == nil {
    74  		return nil, models.ErrDatastoreEmptyApp
    75  	}
    76  	if app.Name == "" {
    77  		return nil, models.ErrDatastoreEmptyAppName
    78  	}
    79  	return v.ds.UpdateApp(ctx, app)
    80  }
    81  
    82  func (v *validator) RemoveApp(ctx context.Context, name string) error {
    83  	if name == "" {
    84  		return models.ErrDatastoreEmptyAppName
    85  	}
    86  
    87  	return v.ds.RemoveApp(ctx, name)
    88  }
    89  
    90  func (v *validator) GetRoute(ctx context.Context, appName, routePath string) (*models.Route, error) {
    91  	if appName == "" {
    92  		return nil, models.ErrDatastoreEmptyAppName
    93  	}
    94  	if routePath == "" {
    95  		return nil, models.ErrDatastoreEmptyRoutePath
    96  	}
    97  
    98  	return v.ds.GetRoute(ctx, appName, routePath)
    99  }
   100  
   101  func (v *validator) GetRoutes(ctx context.Context, routeFilter *models.RouteFilter) (routes []*models.Route, err error) {
   102  	if routeFilter != nil && routeFilter.AppName != "" {
   103  		return v.ds.GetRoutesByApp(ctx, routeFilter.AppName, routeFilter)
   104  	}
   105  
   106  	return v.ds.GetRoutes(ctx, routeFilter)
   107  }
   108  
   109  func (v *validator) GetRoutesByApp(ctx context.Context, appName string, routeFilter *models.RouteFilter) (routes []*models.Route, err error) {
   110  	if appName == "" {
   111  		return nil, models.ErrDatastoreEmptyAppName
   112  	}
   113  	return v.ds.GetRoutesByApp(ctx, appName, routeFilter)
   114  }
   115  
   116  func (v *validator) InsertRoute(ctx context.Context, route *models.Route) (*models.Route, error) {
   117  	if route == nil {
   118  		return nil, models.ErrDatastoreEmptyRoute
   119  	}
   120  	if route.AppName == "" {
   121  		return nil, models.ErrDatastoreEmptyAppName
   122  	}
   123  	if route.Path == "" {
   124  		return nil, models.ErrDatastoreEmptyRoutePath
   125  	}
   126  
   127  	return v.ds.InsertRoute(ctx, route)
   128  }
   129  
   130  func (v *validator) UpdateRoute(ctx context.Context, newroute *models.Route) (*models.Route, error) {
   131  	if newroute == nil {
   132  		return nil, models.ErrDatastoreEmptyRoute
   133  	}
   134  	if newroute.AppName == "" {
   135  		return nil, models.ErrDatastoreEmptyAppName
   136  	}
   137  	if newroute.Path == "" {
   138  		return nil, models.ErrDatastoreEmptyRoutePath
   139  	}
   140  	return v.ds.UpdateRoute(ctx, newroute)
   141  }
   142  
   143  func (v *validator) RemoveRoute(ctx context.Context, appName, routePath string) error {
   144  	if appName == "" {
   145  		return models.ErrDatastoreEmptyAppName
   146  	}
   147  	if routePath == "" {
   148  		return models.ErrDatastoreEmptyRoutePath
   149  	}
   150  
   151  	return v.ds.RemoveRoute(ctx, appName, routePath)
   152  }
   153  
   154  func (v *validator) Put(ctx context.Context, key, value []byte) error {
   155  	if len(key) == 0 {
   156  		return models.ErrDatastoreEmptyKey
   157  	}
   158  
   159  	return v.ds.Put(ctx, key, value)
   160  }
   161  
   162  func (v *validator) Get(ctx context.Context, key []byte) ([]byte, error) {
   163  	if len(key) == 0 {
   164  		return nil, models.ErrDatastoreEmptyKey
   165  	}
   166  	return v.ds.Get(ctx, key)
   167  }