From 76d526447498742e677d2f19fe70f904b241e4c4 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Tue, 30 Sep 2014 09:51:07 -0800 Subject: [PATCH] Adding list() to client & api route. --- models/client.go | 27 +++++++++++++++++++++++++++ models/users.go | 37 ++++++++++++++++++++++++++++++++++++- models/users_test.go | 32 ++++++++++++++++++++++++++++++++ router/api.go | 1 + router/routes.go | 3 ++- 5 files changed, 98 insertions(+), 2 deletions(-) diff --git a/models/client.go b/models/client.go index d217a15..e65f082 100644 --- a/models/client.go +++ b/models/client.go @@ -48,6 +48,33 @@ func NewClient(httpClient *http.Client) *Client { return c } +// ListOptions specifies general pagination options for fetching a list of results +type ListOptions struct { + PerPage int `url:",omitempty" json:",omitempty"` + Page int `url:",moitempty" json:",omitempty"` +} + +func (o ListOptions) PageOrDefault() int { + if o.Page <= 0 { + return 1 + } + return o.Page +} + +func (o ListOptions) Offset() int { + return (o.PageOrDefault() - 1) * o.PerPageOrDefault() +} + +func (o ListOptions) PerPageOrDefault() int { + if o.PerPage <= 0 { + return DefaultPerPage + } + return o.PerPage +} + +// DefaultPerPage is the default number of items to return in a paginated result set +const DefaultPerPage = 10 + // apiRouter is used to generate URLs for bactdb's HTTP API. var apiRouter = router.API() diff --git a/models/users.go b/models/users.go index b9e151d..8f08338 100644 --- a/models/users.go +++ b/models/users.go @@ -20,6 +20,9 @@ type User struct { type UsersService interface { // Get a user. Get(id int64) (*User, error) + + // List all users. + List(opt *UserListOptions) ([]*User, error) } type usersService struct { @@ -50,8 +53,33 @@ func (s *usersService) Get(id int64) (*User, error) { return user, nil } +type UserListOptions struct { + ListOptions +} + +func (s *usersService) List(opt *UserListOptions) ([]*User, error) { + url, err := s.client.url(router.Users, nil, opt) + if err != nil { + return nil, err + } + + req, err := s.client.NewRequest("GET", url.String(), nil) + if err != nil { + return nil, err + } + + var users []*User + _, err = s.client.Do(req, &users) + if err != nil { + return nil, err + } + + return users, nil +} + type MockUsersService struct { - Get_ func(id int64) (*User, error) + Get_ func(id int64) (*User, error) + List_ func(opt *UserListOptions) ([]*User, error) } func (s *MockUsersService) Get(id int64) (*User, error) { @@ -60,3 +88,10 @@ func (s *MockUsersService) Get(id int64) (*User, error) { } return s.Get_(id) } + +func (s *MockUsersService) List(opt *UserListOptions) ([]*User, error) { + if s.List_ == nil { + return nil, nil + } + return s.List_(opt) +} diff --git a/models/users_test.go b/models/users_test.go index 6bba3e1..42c67de 100644 --- a/models/users_test.go +++ b/models/users_test.go @@ -37,3 +37,35 @@ func TestUsersService_Get(t *testing.T) { t.Errorf("Users.Get returned %+v, want %+v", user, want) } } + +func TestUsersService_List(t *testing.T) { + setup() + defer teardown() + + want := []*User{{Id: 1, UserName: "Test User"}} + + var called bool + mux.HandleFunc(urlPath(t, router.Users, nil), func(w http.ResponseWriter, r *http.Request) { + called = true + testMethod(t, r, "GET") + testFormValues(t, r, values{}) + + writeJSON(w, want) + }) + + users, err := client.Users.List(nil) + if err != nil { + t.Errorf("Users.List returned error: %v", err) + } + + if !called { + t.Fatal("!called") + } + + for _, u := range want { + normalizeTime(&u.CreatedAt, &u.UpdatedAt, &u.DeletedAt) + } + if !reflect.DeepEqual(users, want) { + t.Errorf("Users.List return %+v, want %+v", users, want) + } +} diff --git a/router/api.go b/router/api.go index 4ab6461..8560644 100644 --- a/router/api.go +++ b/router/api.go @@ -4,6 +4,7 @@ import "github.com/gorilla/mux" func API() *mux.Router { m := mux.NewRouter() + m.Path("/users").Methods("GET").Name(Users) m.Path("/users/{Id:.+}").Methods("GET").Name(User) return m } diff --git a/router/routes.go b/router/routes.go index 43e73cc..930f9ea 100644 --- a/router/routes.go +++ b/router/routes.go @@ -1,5 +1,6 @@ package router const ( - User = "user" + User = "user" + Users = "users" )