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 }