pollo/lib/db.go
2024-11-21 00:48:45 -06:00

85 lines
2.2 KiB
Go

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
}