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 }