diff --git a/datastore/users.go b/datastore/users.go index 93f040f..ad59732 100644 --- a/datastore/users.go +++ b/datastore/users.go @@ -2,11 +2,9 @@ package datastore import ( "fmt" - "math/rand" "strings" "time" - "github.com/jmoiron/modl" "github.com/thermokarst/bactdb/models" ) @@ -30,46 +28,16 @@ func (s *usersStore) Get(id int64) (*models.User, error) { } func (s *usersStore) Create(user *models.User) (bool, error) { - retries := 3 - var wantRetry bool currentTime := time.Now() user.CreatedAt = currentTime user.UpdatedAt = currentTime - -retry: - retries-- - wantRetry = false - if retries == 0 { - return false, fmt.Errorf("failed to create user with username %q after retrying", user.UserName) + fmt.Println(user) + if err := s.dbh.Insert(user); err != nil { + if strings.Contains(err.Error(), `violates unique constraint "username_idx"`) { + return false, err + } } - - var created bool - err := transact(s.dbh, func(tx modl.SqlExecutor) error { - var existing []*models.User - if err := tx.Select(&existing, `SELECT * FROM users WHERE username=$1 LIMIT 1;`, user.UserName); err != nil { - return err - } - if len(existing) > 0 { - *user = *existing[0] - return nil - } - - if err := tx.Insert(user); err != nil { - if strings.Contains(err.Error(), `violates unique constraint "username_idx"`) { - time.Sleep(time.Duration(rand.Intn(75)) * time.Millisecond) - wantRetry = true - return err - } - return err - } - - created = true - return nil - }) - if wantRetry { - goto retry - } - return created, err + return true, nil } func (s *usersStore) List(opt *models.UserListOptions) ([]*models.User, error) { diff --git a/datastore/users_test.go b/datastore/users_test.go index 32600c2..2fc655e 100644 --- a/datastore/users_test.go +++ b/datastore/users_test.go @@ -37,6 +37,7 @@ func TestUsersStore_Get_db(t *testing.T) { } normalizeTime(&want.CreatedAt, &want.UpdatedAt, &want.DeletedAt) + normalizeTime(&user.CreatedAt, &user.UpdatedAt, &user.DeletedAt) if !reflect.DeepEqual(user, want) { t.Errorf("got user %+v, want %+v", user, want) } @@ -77,8 +78,9 @@ func TestUsersStore_List_db(t *testing.T) { t.Fatal(err) } - for _, u := range want { - normalizeTime(&u.CreatedAt, &u.UpdatedAt, &u.DeletedAt) + for i := range want { + normalizeTime(&want[i].CreatedAt, &want[i].UpdatedAt, &want[i].DeletedAt) + normalizeTime(&users[i].CreatedAt, &users[i].UpdatedAt, &users[i].DeletedAt) } if !reflect.DeepEqual(users, want) { t.Errorf("got users %+v, want %+v", users, want) diff --git a/models/users.go b/models/users.go index 3f82107..471aa7d 100644 --- a/models/users.go +++ b/models/users.go @@ -15,7 +15,7 @@ type User struct { UserName string `json:"userName"` CreatedAt time.Time `db:"created_at" json:"createdAt"` UpdatedAt time.Time `db:"updated_at" json:"updatedAt"` - DeletedAt time.Time `db:"deleted_at" json:"deletedAt"` + DeletedAt NullTime `db:"deleted_at" json:"deletedAt"` } func NewUser() *User { diff --git a/models/users_test.go b/models/users_test.go index 5b9399e..35b86c1 100644 --- a/models/users_test.go +++ b/models/users_test.go @@ -54,7 +54,7 @@ func TestUsersService_Create(t *testing.T) { mux.HandleFunc(urlPath(t, router.CreateUser, nil), func(w http.ResponseWriter, r *http.Request) { called = true testMethod(t, r, "POST") - testBody(t, r, `{"id":1,"userName":"Test User","createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z","deletedAt":"0001-01-01T00:00:00Z"}`+"\n") + testBody(t, r, `{"id":1,"userName":"Test User","createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z","deletedAt":null}`+"\n") w.WriteHeader(http.StatusCreated) writeJSON(w, want)