package lib import ( "crypto/rand" "database/sql" "encoding/hex" "fmt" _ "github.com/tursodatabase/libsql-client-go/libsql" ) var db *sql.DB // GenerateNewID generates a DB with the format "prefix_randomstring". func GenerateNewID(prefix string) string { randomBytes := make([]byte, 16) if _, err := rand.Read(randomBytes); err != nil { panic(err) } return fmt.Sprintf("%s_%s", prefix, hex.EncodeToString(randomBytes)) } // Initialize the database connection func InitializeDB(url, authToken string) error { var err error connectionString := fmt.Sprintf("%s?authToken=%s", url, authToken) db, err = sql.Open("libsql", connectionString) if err != nil { return fmt.Errorf("error opening database: %v", err) } // Test the connection err = db.Ping() if err != nil { return fmt.Errorf("error connecting to the database: %v", err) } return nil } func InitializeSchema() error { if db == nil { return fmt.Errorf("database not initialized") } migrations := []string{ `CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, password TEXT NOT NULL )`, `CREATE TABLE IF NOT EXISTS rooms ( id TEXT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, userId TEXT NOT NULL, roomName TEXT, topicName TEXT, visible BOOLEAN DEFAULT false, scale TEXT DEFAULT '0.5,1,2,3,5', FOREIGN KEY (userId) REFERENCES users(id) )`, `CREATE TABLE IF NOT EXISTS sessions ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP NOT NULL, FOREIGN KEY (user_id) REFERENCES users(id) )`, } for _, migration := range migrations { _, err := db.Exec(migration) if err != nil { return fmt.Errorf("error executing migration: %v", err) } } return nil } // GetDB returns the database connection func GetDB() *sql.DB { return db }