From c8b8f87f6c552a82772e8c7ccaa7706737a993ec Mon Sep 17 00:00:00 2001 From: Deepak Date: Tue, 12 Jan 2021 11:36:44 -0600 Subject: [PATCH] Change to select by username because that makes more sense --- models/err_model_test.go | 2 +- models/models.go | 2 +- models/models_test.go | 4 ++-- models/user.go | 6 +++--- models/user_test.go | 4 ++-- routes/route_model_test.go | 6 +++--- routes/users.go | 14 +++++--------- .../migrations/000001_create_action_table.up.sql | 2 +- store/postgres.go | 4 ++-- store/postgres_user_test.go | 16 +++++++--------- 10 files changed, 27 insertions(+), 33 deletions(-) diff --git a/models/err_model_test.go b/models/err_model_test.go index c48aa9e..db1f899 100644 --- a/models/err_model_test.go +++ b/models/err_model_test.go @@ -36,7 +36,7 @@ func (e *errorStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Action, return nil, e.error } -func (e *errorStore) SelectUserByID(id int) (*models.User, error) { +func (e *errorStore) SelectUserByUsername(username string) (*models.User, error) { return nil, e.error } diff --git a/models/models.go b/models/models.go index 31f346e..586141f 100644 --- a/models/models.go +++ b/models/models.go @@ -15,7 +15,7 @@ type Store interface { SelectPlanByID(id int) (*Plan, error) InsertPlan(plan *Plan) (int, error) SelectActionsByPlanID(plan *Plan) ([]*Action, error) - SelectUserByID(id int) (*User, error) + SelectUserByUsername(username string) (*User, error) InsertUser(user *User) (int, error) } diff --git a/models/models_test.go b/models/models_test.go index 00a5990..b9693b2 100644 --- a/models/models_test.go +++ b/models/models_test.go @@ -43,8 +43,8 @@ func (ms *multiStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Action return ms.actions, nil } -func (ms *multiStore) SelectUserByID(id int) (*models.User, error) { - return &models.User{UserID: int64(id), Username: "test", DisplayName: "Ted Est", Password: []byte("oh no")}, nil +func (ms *multiStore) SelectUserByUsername(username string) (*models.User, error) { + return &models.User{UserID: int64(1), Username: username, DisplayName: "Ted Est", Password: []byte("oh no")}, nil } func (ms *multiStore) InsertUser(user *models.User) (int, error) { diff --git a/models/user.go b/models/user.go index 3f4aebe..f19c882 100644 --- a/models/user.go +++ b/models/user.go @@ -22,9 +22,9 @@ type UserNoPassword struct { DisplayName string `json:"display_name"` } -// User returns a single plan from the store by plan_id. -func (m *Model) User(id int) (*UserNoPassword, error) { - user, err := m.SelectUserByID(id) +// UserByUsername returns a single user by the unique username. +func (m *Model) UserByUsername(username string) (*UserNoPassword, error) { + user, err := m.SelectUserByUsername(username) if user == nil { return nil, wrapNotFound(err) } diff --git a/models/user_test.go b/models/user_test.go index 4a55968..be4226e 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -17,7 +17,7 @@ func TestModelUsers(t *testing.T) { []*models.Plan{p}} m := models.New(ss) - user, err := m.User(3) + user, err := m.UserByUsername("test") assert.Nil(err) assert.NotNil(user) } @@ -26,7 +26,7 @@ func TestErrorUsers(t *testing.T) { assert := assert.New(t) m := getErrorModel(fmt.Errorf("err")) - user, err := m.User(3) + user, err := m.UserByUsername("snth") assert.Nil(user) assert.NotNil(err) } diff --git a/routes/route_model_test.go b/routes/route_model_test.go index 599712f..368e80e 100644 --- a/routes/route_model_test.go +++ b/routes/route_model_test.go @@ -58,7 +58,7 @@ func (ms *multiStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Action return ms.actions, nil } -func (ms *multiStore) SelectUserByID(id int) (*models.User, error) { +func (ms *multiStore) SelectUserByUsername(name string) (*models.User, error) { return nil, nil } @@ -119,7 +119,7 @@ func (e *errorStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Action, return nil, e.error } -func (e *errorStore) SelectUserByID(id int) (*models.User, error) { +func (e *errorStore) SelectUserByUsername(name string) (*models.User, error) { return nil, e.error } @@ -172,7 +172,7 @@ func (e *onlyCreateStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Ac return nil, e.error } -func (e *onlyCreateStore) SelectUserByID(id int) (*models.User, error) { +func (e *onlyCreateStore) SelectUserByUsername(name string) (*models.User, error) { return nil, nil } diff --git a/routes/users.go b/routes/users.go index 3c3ca77..e59bd39 100644 --- a/routes/users.go +++ b/routes/users.go @@ -5,24 +5,20 @@ import ( "gitea.deepak.science/deepak/gogmagog/models" "github.com/go-chi/chi" "net/http" - "strconv" ) func newUserRouter(m *models.Model) http.Handler { router := chi.NewRouter() // router.Post("/", postUserFunc(m)) - router.Get("/{userid}", getUserByIDFunc(m)) + router.Get("/{username}", getUserByUsernameFunc(m)) return router } -func getUserByIDFunc(m *models.Model) http.HandlerFunc { +func getUserByUsernameFunc(m *models.Model) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - id, err := strconv.Atoi(chi.URLParam(r, "userid")) - if err != nil { - notFoundHandler(w, r) - return - } - user, err := m.User(id) + username := chi.URLParam(r, "username") + + user, err := m.UserByUsername(username) if err != nil { if models.IsNotFoundError(err) { notFoundHandler(w, r) diff --git a/store/migrations/000001_create_action_table.up.sql b/store/migrations/000001_create_action_table.up.sql index d6e640a..9b48f0b 100644 --- a/store/migrations/000001_create_action_table.up.sql +++ b/store/migrations/000001_create_action_table.up.sql @@ -18,7 +18,7 @@ CREATE TABLE IF NOT EXISTS actions( CREATE TABLE IF NOT EXISTS users( user_id serial PRIMARY KEY, - username VARCHAR(50) NOT NULL, + username VARCHAR(50) NOT NULL UNIQUE, display_name VARCHAR (100) NOT NULL, password bytea, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, diff --git a/store/postgres.go b/store/postgres.go index 0c25a5d..271afc5 100644 --- a/store/postgres.go +++ b/store/postgres.go @@ -135,9 +135,9 @@ func (store *postgresStore) ConnectionLive() error { return store.db.Ping() } -func (store *postgresStore) SelectUserByID(id int) (*models.User, error) { +func (store *postgresStore) SelectUserByUsername(username string) (*models.User, error) { user := models.User{} - err := store.db.Get(&user, store.db.Rebind("SELECT user_id, username, display_name, password FROM users WHERE user_id = ?"), id) + err := store.db.Get(&user, store.db.Rebind("SELECT user_id, username, display_name, password FROM users WHERE username = ?"), username) if err != nil { return nil, err } diff --git a/store/postgres_user_test.go b/store/postgres_user_test.go index 9fb70c4..83a5d55 100644 --- a/store/postgres_user_test.go +++ b/store/postgres_user_test.go @@ -8,7 +8,7 @@ import ( "testing" ) -func TestSelectUserById(t *testing.T) { +func TestSelectUserByUsername(t *testing.T) { // set up test assert := assert.New(t) @@ -27,12 +27,12 @@ func TestSelectUserById(t *testing.T) { }). AddRow(id, username, displayName, password) - mock.ExpectQuery(`^SELECT user_id, username, display_name, password FROM users WHERE user_id = \$1`). - WithArgs(id). + mock.ExpectQuery(`^SELECT user_id, username, display_name, password FROM users WHERE username = \$1`). + WithArgs(username). WillReturnRows(rows) // function under test - user, err := str.SelectUserByID(1) + user, err := str.SelectUserByUsername(username) // test results assert.Nil(err) @@ -49,13 +49,11 @@ func TestSelectUserById(t *testing.T) { func TestErrUserByID(t *testing.T) { assert := assert.New(t) - idToUse := 1 - str, mock := getDbMock(t) + username := "snth" + mock.ExpectQuery(`^SELECT user_id, username, display_name, password FROM users WHERE username = \$1`).WithArgs(username).WillReturnError(fmt.Errorf("example error")) - mock.ExpectQuery(`^SELECT user_id, username, display_name, password FROM users WHERE user_id = \$1`).WithArgs(idToUse).WillReturnError(fmt.Errorf("example error")) - - user, err := str.SelectUserByID(idToUse) + user, err := str.SelectUserByUsername(username) assert.NotNil(err) assert.Nil(user)