Files

73 lines
1.8 KiB
Go

package usersStorage
import (
"context"
"database/sql"
"synlotto-website/internal/logging"
"time"
)
const (
UsernameExistsSQL = `
SELECT EXISTS(SELECT 1 FROM users WHERE username = ? LIMIT 1)`
EmailExistsSQL = `
SELECT EXISTS(SELECT 1 FROM users WHERE email = ? LIMIT 1)`
GetByUsernameSQL = `
SELECT id, username, email, password_hash, created_at, updated_at
FROM users
WHERE username = ?
LIMIT 1`
GetByIDSQL = `
SELECT id, username, email, password_hash, is_admin, created_at, updated_at
FROM users
WHERE id = ?
LIMIT 1`
)
func UsernameExists(db *sql.DB, username string) bool {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
var exists bool
_ = db.QueryRowContext(ctx, UsernameExistsSQL, username).Scan(&exists)
return exists
}
func EmailExists(db *sql.DB, email string) bool {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
var exists bool
_ = db.QueryRowContext(ctx, EmailExistsSQL, email).Scan(&exists)
return exists
}
func GetUserByUsername(db *sql.DB, username string) *User {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
var u User
err := db.QueryRowContext(ctx, GetByUsernameSQL, username).
Scan(&u.Id, &u.Username, &u.Email, &u.PasswordHash, &u.CreatedAt, &u.UpdatedAt)
if err != nil {
return nil
}
return &u
}
func GetUserByID(db *sql.DB, id int) *User {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
var u User
err := db.QueryRowContext(ctx, GetByIDSQL, id).
Scan(&u.Id, &u.Username, &u.Email, &u.PasswordHash, &u.IsAdmin, &u.CreatedAt, &u.UpdatedAt)
if err != nil {
if err != sql.ErrNoRows {
logging.Error("GetUserByID: %v", err)
}
return nil
}
return &u
}