type ListingOptions struct {
Offset int `json:"offset"`
Limit int `json:"limit"`
OrderBy string `json:"order_by"`
OrderDesc bool `json:"order_desc"`
}
func (l ListingOptions) Validate() error {
return validation.ValidateStruct(&l,
// Offset should be a positive number
validation.Field(&l.Offset, validation.Min(0)),
// Limit should be between 10 and 50
validation.Field(&l.Limit, validation.Min(10), validation.Max(50)),
)
}
type BookListingOptions struct {
UserID int `json:"user_id"`
Status []string `json:"status"`
ListingOptions
}
func (l BookListingOptions) Validate() error {
validOrderColumns := []string{
"name", "status", "created_at", "updated_at",
}
return validation.ValidateStruct(&l,
// UserID should be a positive number
validation.Field(&l.UserID, validation.Min(0)),
// Status should be a valid book status
validation.Field(&l.Status, validation.In("open", "closed")),
// ListingOptions.Order should be a valid order clause
validation.Field(&l.ListingOptions.OrderBy, validation.In(validOrderColumns)),
// ListingOptions has its own validation
validation.Field(&l.ListingOptions),
)
}