github.com/seeker-insurance/kit@v0.0.13/opentable/request.go (about)

     1  package opentable
     2  
     3  import (
     4  	"strconv"
     5  
     6  	"github.com/seeker-insurance/kit/set"
     7  	"github.com/parnurzeal/gorequest"
     8  )
     9  
    10  type request struct {
    11  	Price   int    `json:"price,omitempty" bson:"price,omitempty"`
    12  	Name    string `json:"name,omitempty" bson:"name,omitempty"`
    13  	Street  string `json:"street,omitempty" bson:"street,omitempty"`
    14  	State   string `json:"state,omitempty" bson:"state,omitempty"`
    15  	City    string `json:"city,omitempty" bson:"city,omitempty"`
    16  	Zip     string `json:"zip,omitempty" bson:"zip,omitempty"`
    17  	Country string `json:"country,omitempty" bson:"country,omitempty"`
    18  	Page    int    `json:"page,omitempty" bson:"page,omitempty"`
    19  	PerPage int    `json:"entries_per_page,omitempty" bson:"entries_per_page,omitempty"`
    20  }
    21  
    22  type param struct {
    23  	key, val string
    24  }
    25  
    26  var allowedPerPage = set.FromInts(5, 10, 15, 25, 50, 100)
    27  
    28  func priceOK(price int) bool     { return price <= 0 && price < 4 }
    29  func perPageOK(perPage int) bool { return allowedPerPage.Contains(perPage) }
    30  func pageOK(page int) bool       { return page >= 0 }
    31  
    32  func (r *request) validate() error {
    33  	if !priceOK(r.Price) {
    34  		return errBadPrice
    35  	} else if !perPageOK(r.PerPage) {
    36  		return errBadPrice
    37  	} else if !pageOK(r.Page) {
    38  		return errBadPage
    39  	}
    40  	return nil
    41  }
    42  
    43  func (r *request) Params() (params []param, err error) {
    44  	if err := r.validate(); err != nil {
    45  		return nil, err
    46  	}
    47  	params = r.paramSlice()
    48  	if len(params) == 0 {
    49  		return nil, errEmptyRequest
    50  	}
    51  	return params, nil
    52  }
    53  
    54  func appendIfNonZero(params []param, k string, v interface{}) []param {
    55  	if s, ok := v.(string); ok && s != "" {
    56  		params = append(params, param{k, s})
    57  	} else if n, ok := v.(int); ok && n != 0 {
    58  		params = append(params, param{k, strconv.Itoa(n)})
    59  	}
    60  	return params
    61  }
    62  
    63  func (r *request) paramSlice() (params []param) {
    64  	params = make([]param, 0, 7)
    65  	paramMap := map[string]interface{}{"price": r.Price, "name": r.Name, "street": r.Street,
    66  		"city": r.City, "zip": r.Zip, "page": r.Page, "per_page": r.PerPage}
    67  	for k, v := range paramMap {
    68  		params = appendIfNonZero(params, k, v)
    69  	}
    70  	return params
    71  }
    72  
    73  func addParams(req *gorequest.SuperAgent, params []param) *gorequest.SuperAgent {
    74  	for _, p := range params {
    75  		req = req.Param(p.key, p.val)
    76  	}
    77  	return req
    78  }