80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package database
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
type User struct {
|
|
ID int `db:"id"`
|
|
Created time.Time `db:"created"`
|
|
Email string `db:"email"`
|
|
Roles string `db:"roles"`
|
|
HashedPassword string `db:"hashed_password"`
|
|
}
|
|
|
|
func (db *DB) InsertUser(email, hashedPassword string) (int, error) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
|
|
defer cancel()
|
|
|
|
query := `
|
|
INSERT INTO users (created, email, hashed_password)
|
|
VALUES ($1, $2, $3)`
|
|
|
|
result, err := db.ExecContext(ctx, query, time.Now(), email, hashedPassword)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return int(id), err
|
|
}
|
|
|
|
func (db *DB) GetUser(id int) (*User, bool, error) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
|
|
defer cancel()
|
|
|
|
var user User
|
|
|
|
query := `SELECT * FROM users WHERE id = $1`
|
|
|
|
err := db.GetContext(ctx, &user, query, id)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return nil, false, nil
|
|
}
|
|
|
|
return &user, true, err
|
|
}
|
|
|
|
func (db *DB) GetUserByEmail(email string) (*User, bool, error) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
|
|
defer cancel()
|
|
|
|
var user User
|
|
|
|
query := `SELECT * FROM users WHERE email = $1`
|
|
|
|
err := db.GetContext(ctx, &user, query, email)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return nil, false, nil
|
|
}
|
|
|
|
return &user, true, err
|
|
}
|
|
|
|
func (db *DB) UpdateUserHashedPassword(id int, hashedPassword string) error {
|
|
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
|
|
defer cancel()
|
|
|
|
query := `UPDATE users SET hashed_password = $1 WHERE id = $2`
|
|
|
|
_, err := db.ExecContext(ctx, query, hashedPassword, id)
|
|
return err
|
|
}
|