termbox/internal/db/database.go
2025-08-06 06:30:55 +01:00

97 lines
2.2 KiB
Go

package db
import (
"context"
"fmt"
"log"
"os"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/joho/godotenv"
)
var Pool *pgxpool.Pool
func InitDB() {
err := godotenv.Load()
if err != nil {
log.Fatalf("Error loading .env file: %v", err)
}
connString := fmt.Sprintf("postgresql://%s:%s@%s:%s/%s",
os.Getenv("DB_USER"),
os.Getenv("DB_PASSWORD"),
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_NAME"),
)
ctx := context.Background()
config, err := pgxpool.ParseConfig(connString)
if err != nil {
log.Fatalf("Unable to parse database config: %v", err)
}
Pool, err = pgxpool.NewWithConfig(ctx, config)
if err != nil {
log.Fatalf("Unable to create connection pool: %v", err)
}
err = Pool.Ping(ctx)
if err != nil {
log.Fatalf("Unable to ping database: %v", err)
}
fmt.Println("Database connection established successfully")
if err := CreateTables(); err != nil {
log.Fatalf("Failed to create tables: %v", err)
}
}
func CreateTables() error {
ctx := context.Background()
_, err := Pool.Exec(ctx, `
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
is_verified BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS verification_codes (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id) ON DELETE CASCADE,
code VARCHAR(6) NOT NULL,
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
used BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS termails (
id SERIAL PRIMARY KEY,
sender_id INT REFERENCES users(id),
receiver_id INT REFERENCES users(id),
subject VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
is_read BOOLEAN DEFAULT FALSE,
sent_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_termails_receiver_id ON termails(receiver_id);
CREATE INDEX IF NOT EXISTS idx_termails_sender_id ON termails(sender_id);
CREATE INDEX IF NOT EXISTS idx_termails_sent_at ON termails(sent_at);
`)
return err
}
func Close() {
if Pool != nil {
Pool.Close()
}
}