package database import ( "database/sql" "fmt" "os" "time" _ "github.com/lib/pq" ) func Connect() (*sql.DB, error) { dbHost := getEnv("DB_HOST", "localhost") dbPort := getEnv("DB_PORT", "5432") dbUser := getEnv("DB_USER", "postgres") dbPassword := getEnv("DB_PASSWORD", "") dbName := getEnv("DB_NAME", "backend_template") sslMode := getEnv("DB_SSL_MODE", "disable") connStr := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s", dbHost, dbPort, dbUser, dbPassword, dbName, sslMode) db, err := sql.Open("postgres", connStr) if err != nil { return nil, err } // Verify connection if err = db.Ping(); err != nil { return nil, err } return db, nil } func FindUserByID(db *sql.DB, id string) (*User, error) { var user User var createdAtUnix, updatedAtUnix int64 err := db.QueryRow(` SELECT id, username, email, password_hash, EXTRACT(EPOCH FROM created_at)::bigint, EXTRACT(EPOCH FROM updated_at)::bigint FROM user_auth WHERE id = $1 `, id).Scan( &user.ID, &user.Username, &user.Email, &user.PasswordHash, &createdAtUnix, &updatedAtUnix, ) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } user.CreatedAt = timeFromUnix(createdAtUnix) user.UpdatedAt = timeFromUnix(updatedAtUnix) return &user, nil } func FindUserByUsername(db *sql.DB, username string) (*User, error) { var user User var createdAtUnix, updatedAtUnix int64 err := db.QueryRow(` SELECT id, username, email, password_hash, EXTRACT(EPOCH FROM created_at)::bigint, EXTRACT(EPOCH FROM updated_at)::bigint FROM user_auth WHERE username = $1 `, username).Scan( &user.ID, &user.Username, &user.Email, &user.PasswordHash, &createdAtUnix, &updatedAtUnix, ) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } user.CreatedAt = timeFromUnix(createdAtUnix) user.UpdatedAt = timeFromUnix(updatedAtUnix) return &user, nil } func getEnv(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } func timeFromUnix(timestamp int64) time.Time { return time.Unix(timestamp, 0) }