From 40ed60bca6a34885b945974587706e97ee84ea78 Mon Sep 17 00:00:00 2001 From: Lucas Schumacher Date: Tue, 27 Aug 2024 15:46:54 -0400 Subject: [PATCH] Improve SQL --- models/sessions.go | 39 ++++++++++++++------------------------- models/sql/sessions.sql | 2 +- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/models/sessions.go b/models/sessions.go index 607762b..a1f7d6e 100644 --- a/models/sessions.go +++ b/models/sessions.go @@ -61,27 +61,17 @@ func (ss *SessionService) Create(userID int) (*Session, error) { Token: token, TokenHash: hash(token), } - row := ss.DB.QueryRow(` - UPDATE sessions - SET token_hash = $2 - WHERE user_id = $1 - RETURNING id; + INSERT INTO sessions (user_id, token_hash) + VALUES ($1, $2) ON CONFLICT (user_id) DO + UPDATE + SET token_hash = $2 + RETURNING id; `, session.UserID, session.TokenHash) err = row.Scan(&session.ID) - if err == sql.ErrNoRows { - row = ss.DB.QueryRow(` - INSERT INTO sessions (user_id, token_hash) - VALUES ($1, $2) - RETURNING id; - `, session.UserID, session.TokenHash) - err = row.Scan(&session.ID) - } - if err != nil { return nil, fmt.Errorf("create: %w", err) } - return &session, nil } @@ -97,20 +87,19 @@ func (ss *SessionService) Delete(token string) error { func (ss *SessionService) User(token string) (*User, error) { token_hash := hash(token) var user User + row := ss.DB.QueryRow(` - SELECT (user_id) FROM sessions WHERE token_hash = $1; + SELECT users.id, + users.email, + users.password_hash + FROM sessions + JOIN users ON users.id = sessions.user_id + WHERE sessions.token_hash = $1; `, token_hash) - err := row.Scan(&user.ID) - if err != nil { - return nil, fmt.Errorf("user: %w", err) - } - row = ss.DB.QueryRow(` - SELECT email, password_hash - FROM users WHERE id = $1; - `, user.ID) - err = row.Scan(&user.Email, &user.PasswordHash) + err := row.Scan(&user.ID, &user.Email, &user.PasswordHash) if err != nil { return nil, fmt.Errorf("user: %w", err) } + return &user, err } diff --git a/models/sql/sessions.sql b/models/sql/sessions.sql index aa7d099..b44a649 100644 --- a/models/sql/sessions.sql +++ b/models/sql/sessions.sql @@ -1,5 +1,5 @@ CREATE TABLE sessions ( id SERIAL PRIMARY KEY, - user_id INT UNIQUE, + user_id INT UNIQUE REFERENCES users (id) ON DELETE CASCADE, token_hash TEXT UNIQUE NOT NULL );