Change to select by username because that makes more sense

This commit is contained in:
Deepak Mallubhotla 2021-01-12 11:36:44 -06:00
parent f59593e9e8
commit c8b8f87f6c
Signed by: deepak
GPG Key ID: 64BF53A3369104E7
10 changed files with 27 additions and 33 deletions

View File

@ -36,7 +36,7 @@ func (e *errorStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Action,
return nil, e.error 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 return nil, e.error
} }

View File

@ -15,7 +15,7 @@ type Store interface {
SelectPlanByID(id int) (*Plan, error) SelectPlanByID(id int) (*Plan, error)
InsertPlan(plan *Plan) (int, error) InsertPlan(plan *Plan) (int, error)
SelectActionsByPlanID(plan *Plan) ([]*Action, error) SelectActionsByPlanID(plan *Plan) ([]*Action, error)
SelectUserByID(id int) (*User, error) SelectUserByUsername(username string) (*User, error)
InsertUser(user *User) (int, error) InsertUser(user *User) (int, error)
} }

View File

@ -43,8 +43,8 @@ func (ms *multiStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Action
return ms.actions, nil return ms.actions, nil
} }
func (ms *multiStore) SelectUserByID(id int) (*models.User, error) { func (ms *multiStore) SelectUserByUsername(username string) (*models.User, error) {
return &models.User{UserID: int64(id), Username: "test", DisplayName: "Ted Est", Password: []byte("oh no")}, nil 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) { func (ms *multiStore) InsertUser(user *models.User) (int, error) {

View File

@ -22,9 +22,9 @@ type UserNoPassword struct {
DisplayName string `json:"display_name"` DisplayName string `json:"display_name"`
} }
// User returns a single plan from the store by plan_id. // UserByUsername returns a single user by the unique username.
func (m *Model) User(id int) (*UserNoPassword, error) { func (m *Model) UserByUsername(username string) (*UserNoPassword, error) {
user, err := m.SelectUserByID(id) user, err := m.SelectUserByUsername(username)
if user == nil { if user == nil {
return nil, wrapNotFound(err) return nil, wrapNotFound(err)
} }

View File

@ -17,7 +17,7 @@ func TestModelUsers(t *testing.T) {
[]*models.Plan{p}} []*models.Plan{p}}
m := models.New(ss) m := models.New(ss)
user, err := m.User(3) user, err := m.UserByUsername("test")
assert.Nil(err) assert.Nil(err)
assert.NotNil(user) assert.NotNil(user)
} }
@ -26,7 +26,7 @@ func TestErrorUsers(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
m := getErrorModel(fmt.Errorf("err")) m := getErrorModel(fmt.Errorf("err"))
user, err := m.User(3) user, err := m.UserByUsername("snth")
assert.Nil(user) assert.Nil(user)
assert.NotNil(err) assert.NotNil(err)
} }

View File

@ -58,7 +58,7 @@ func (ms *multiStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Action
return ms.actions, nil 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 return nil, nil
} }
@ -119,7 +119,7 @@ func (e *errorStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Action,
return nil, e.error 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 return nil, e.error
} }
@ -172,7 +172,7 @@ func (e *onlyCreateStore) SelectActionsByPlanID(plan *models.Plan) ([]*models.Ac
return nil, e.error 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 return nil, nil
} }

View File

@ -5,24 +5,20 @@ import (
"gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/models"
"github.com/go-chi/chi" "github.com/go-chi/chi"
"net/http" "net/http"
"strconv"
) )
func newUserRouter(m *models.Model) http.Handler { func newUserRouter(m *models.Model) http.Handler {
router := chi.NewRouter() router := chi.NewRouter()
// router.Post("/", postUserFunc(m)) // router.Post("/", postUserFunc(m))
router.Get("/{userid}", getUserByIDFunc(m)) router.Get("/{username}", getUserByUsernameFunc(m))
return router return router
} }
func getUserByIDFunc(m *models.Model) http.HandlerFunc { func getUserByUsernameFunc(m *models.Model) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(chi.URLParam(r, "userid")) username := chi.URLParam(r, "username")
if err != nil {
notFoundHandler(w, r) user, err := m.UserByUsername(username)
return
}
user, err := m.User(id)
if err != nil { if err != nil {
if models.IsNotFoundError(err) { if models.IsNotFoundError(err) {
notFoundHandler(w, r) notFoundHandler(w, r)

View File

@ -18,7 +18,7 @@ CREATE TABLE IF NOT EXISTS actions(
CREATE TABLE IF NOT EXISTS users( CREATE TABLE IF NOT EXISTS users(
user_id serial PRIMARY KEY, user_id serial PRIMARY KEY,
username VARCHAR(50) NOT NULL, username VARCHAR(50) NOT NULL UNIQUE,
display_name VARCHAR (100) NOT NULL, display_name VARCHAR (100) NOT NULL,
password bytea, password bytea,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,

View File

@ -135,9 +135,9 @@ func (store *postgresStore) ConnectionLive() error {
return store.db.Ping() 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{} 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 { if err != nil {
return nil, err return nil, err
} }

View File

@ -8,7 +8,7 @@ import (
"testing" "testing"
) )
func TestSelectUserById(t *testing.T) { func TestSelectUserByUsername(t *testing.T) {
// set up test // set up test
assert := assert.New(t) assert := assert.New(t)
@ -27,12 +27,12 @@ func TestSelectUserById(t *testing.T) {
}). }).
AddRow(id, username, displayName, password) AddRow(id, username, displayName, password)
mock.ExpectQuery(`^SELECT user_id, username, display_name, password FROM users WHERE user_id = \$1`). mock.ExpectQuery(`^SELECT user_id, username, display_name, password FROM users WHERE username = \$1`).
WithArgs(id). WithArgs(username).
WillReturnRows(rows) WillReturnRows(rows)
// function under test // function under test
user, err := str.SelectUserByID(1) user, err := str.SelectUserByUsername(username)
// test results // test results
assert.Nil(err) assert.Nil(err)
@ -49,13 +49,11 @@ func TestSelectUserById(t *testing.T) {
func TestErrUserByID(t *testing.T) { func TestErrUserByID(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
idToUse := 1
str, mock := getDbMock(t) 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.SelectUserByUsername(username)
user, err := str.SelectUserByID(idToUse)
assert.NotNil(err) assert.NotNil(err)
assert.Nil(user) assert.Nil(user)