85 lines
2.2 KiB
Go
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
|
|
}
|