Skip to content

Commit 63db516

Browse files
committed
insert user
1 parent 1c8de2d commit 63db516

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

cmd/web/handlers.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
"snippetbox.org/pkg/forms"
12+
"snippetbox.org/pkg/models"
1213
)
1314

1415
func (app *App) Home(w http.ResponseWriter, r *http.Request) {
@@ -138,7 +139,25 @@ func (app *App) CreateUser(w http.ResponseWriter, r *http.Request) {
138139
return
139140
}
140141

141-
fmt.Fprintf(w, "CreateUser")
142+
err = app.database.InsertUser(form.Name, form.Email, form.Password)
143+
if err == models.ErrDuplicateEmail {
144+
form.Failures["Email"] = "Email already in use"
145+
app.RenderHtml(w, r, "signup.page.html", &HtmlData{Form: form})
146+
return
147+
} else if err != nil {
148+
app.ServerError(w, err)
149+
return
150+
}
151+
152+
msg := "Your signup was successful. Please log in using your credentials."
153+
session := app.sessions.Load(r)
154+
err = session.PutString(w, "flash", msg)
155+
if err != nil {
156+
app.ServerError(w, err)
157+
return
158+
}
159+
160+
http.Redirect(w, r, "/user/login", http.StatusSeeOther)
142161
}
143162

144163
func (app *App) LoginUser(w http.ResponseWriter, r *http.Request) {

pkg/models/database.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@ package models
22

33
import (
44
"database/sql"
5+
"errors"
6+
7+
"github.com/mattn/go-sqlite3"
8+
"golang.org/x/crypto/bcrypt"
59
)
610

711
type Database struct {
812
*sql.DB
913
}
1014

15+
var ErrDuplicateEmail = errors.New("models: email address already in use")
16+
1117
func (db *Database) GetSnippet(id int) (*Snippet, error) {
1218
stmt := `SELECT id, title, content, created, expires FROM snippets
1319
WHERE id = ? AND expires > datetime('now')`
@@ -128,3 +134,22 @@ func (db *Database) InitializeDb() error {
128134

129135
return nil
130136
}
137+
138+
func (db *Database) InsertUser(name, email, password string) error {
139+
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), 12)
140+
if err != nil {
141+
return err
142+
}
143+
144+
stmt := `INSERT INTO users (name, email, password, created)
145+
VALUES (?, ?, ?, datetime('now'))`
146+
147+
_, err = db.Exec(stmt, name, email, string(hashedPassword))
148+
if err != nil {
149+
dbErr := err.(sqlite3.Error)
150+
if dbErr.Code == sqlite3.ErrConstraint && dbErr.ExtendedCode == sqlite3.ErrConstraintUnique {
151+
return ErrDuplicateEmail
152+
}
153+
}
154+
return err
155+
}

0 commit comments

Comments
 (0)