package main
import (
"fmt"
"strconv"
"github.com/go-pg/pg/v10"
)
type User struct {
ID int64
Name string
Department string
Salary int
}
func getUserByID(db *pg.DB, userIDStr string) (*User, error) {
userID, err := strconv.ParseInt(userIDStr, 10, 64)
if err != nil {
return nil, err
}
// SECURE: Parameterized query with ? placeholder
var user User
err = db.Model(&user).Where("id = ?", userID).Select()
return &user, err
}
func searchUsers(db *pg.DB, name, department string) ([]User, error) {
// SECURE: Parameterized query with ? placeholders
var users []User
err := db.Model(&users).
Where("name ILIKE ?", "%"+name+"%").
Where("department = ?", department).
Select()
return users, err
}
func updateUserSalary(db *pg.DB, userEmail, newSalary string) error {
// SECURE: Parameterized update with ? placeholders
user := &User{}
_, err := db.Model(user).
Set("salary = ?", newSalary).
Where("email = ?", userEmail).
Update()
return err
}
func getTopEarners(db *pg.DB, orderBy string) ([]User, error) {
// SECURE: Whitelist allowed ORDER BY values
validOrderColumns := map[string]string{
"salary": "salary DESC",
"name": "name ASC",
}
orderClause := validOrderColumns[orderBy]
if orderClause == "" {
return nil, fmt.Errorf("invalid order field")
}
// SECURE: Use validated ORDER BY clause
var users []User
err := db.Model(&users).
Where("salary > ?", 100000).
Order(orderClause).
Select()
return users, err
}