kv-tube/backend/models/database.go

92 lines
2.5 KiB
Go

package models
import (
"database/sql"
"log"
"os"
"path/filepath"
_ "modernc.org/sqlite"
)
var DB *sql.DB
func InitDB() {
dataDir := os.Getenv("KVTUBE_DATA_DIR")
if dataDir == "" {
dataDir = "../data" // Default mapping assuming running from backend
}
if err := os.MkdirAll(dataDir, 0755); err != nil {
log.Fatalf("Failed to create data directory: %v", err)
}
dbPath := filepath.Join(dataDir, "kvtube.db")
db, err := sql.Open("sqlite", dbPath)
if err != nil {
log.Fatalf("Failed to open database: %v", err)
}
// Create tables
userTable := `CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL
);`
userVideosTable := `CREATE TABLE IF NOT EXISTS user_videos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
video_id TEXT,
title TEXT,
thumbnail TEXT,
type TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(user_id) REFERENCES users(id)
);`
videoCacheTable := `CREATE TABLE IF NOT EXISTS video_cache (
video_id TEXT PRIMARY KEY,
data TEXT,
expires_at DATETIME
);`
subscriptionsTable := `CREATE TABLE IF NOT EXISTS subscriptions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
channel_id TEXT NOT NULL,
channel_name TEXT,
channel_avatar TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_id, channel_id),
FOREIGN KEY(user_id) REFERENCES users(id)
);`
for _, stmt := range []string{userTable, userVideosTable, videoCacheTable, subscriptionsTable} {
if _, err := db.Exec(stmt); err != nil {
log.Fatalf("Failed to create table: %v - Statement: %s", err, stmt)
}
}
// Create performance indexes
indexes := []string{
`CREATE INDEX IF NOT EXISTS idx_user_videos_user_timestamp ON user_videos(user_id, timestamp DESC)`,
`CREATE UNIQUE INDEX IF NOT EXISTS idx_user_videos_user_video ON user_videos(user_id, video_id)`,
`CREATE INDEX IF NOT EXISTS idx_subscriptions_user ON subscriptions(user_id)`,
`CREATE INDEX IF NOT EXISTS idx_video_cache_expires ON video_cache(expires_at)`,
}
for _, idx := range indexes {
if _, err := db.Exec(idx); err != nil {
log.Printf("Warning: Failed to create index: %v - Statement: %s", err, idx)
}
}
// Insert default user for history tracking (password is not used for authentication)
_, err = db.Exec(`INSERT OR IGNORE INTO users (id, username, password) VALUES (1, 'default_user', '')`)
if err != nil {
log.Printf("Failed to insert default user: %v", err)
}
DB = db
log.Println("Database initialized successfully at", dbPath)
}