101 lines
2.1 KiB
Go
101 lines
2.1 KiB
Go
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)
|
|
}
|