73 lines
1.8 KiB
Go
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
|
|
}
|