pollo/lib/db.go

86 lines
2.2 KiB
Go
Raw Normal View History

2024-06-27 21:23:51 -06:00
package lib
import (
2024-06-28 23:58:36 -06:00
"crypto/rand"
2024-11-21 00:48:45 -06:00
"database/sql"
2024-06-28 23:58:36 -06:00
"encoding/hex"
2024-06-27 21:51:00 -06:00
"fmt"
2024-06-27 21:23:51 -06:00
2024-11-21 00:48:45 -06:00
_ "github.com/tursodatabase/libsql-client-go/libsql"
2024-06-27 21:23:51 -06:00
)
2024-11-21 00:48:45 -06:00
var db *sql.DB
2024-06-28 23:58:36 -06:00
// GenerateNewID generates a DB with the format "prefix_randomstring".
func GenerateNewID(prefix string) string {
2024-11-21 00:48:45 -06:00
randomBytes := make([]byte, 16)
if _, err := rand.Read(randomBytes); err != nil {
panic(err)
}
return fmt.Sprintf("%s_%s", prefix, hex.EncodeToString(randomBytes))
2024-06-28 23:58:36 -06:00
}
2024-11-21 00:48:45 -06:00
// 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)
}
2024-06-27 21:23:51 -06:00
2024-11-21 00:48:45 -06:00
// Test the connection
err = db.Ping()
if err != nil {
return fmt.Errorf("error connecting to the database: %v", err)
}
2024-06-28 23:58:36 -06:00
2024-11-21 00:48:45 -06:00
return nil
}
2024-06-28 23:58:36 -06:00
2024-11-21 00:48:45 -06:00
func InitializeSchema() error {
if db == nil {
return fmt.Errorf("database not initialized")
}
2024-06-28 23:58:36 -06:00
2024-11-21 00:48:45 -06:00
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)
)`,
}
2024-06-28 23:58:36 -06:00
2024-11-21 00:48:45 -06:00
for _, migration := range migrations {
_, err := db.Exec(migration)
if err != nil {
return fmt.Errorf("error executing migration: %v", err)
}
}
2024-06-28 23:58:36 -06:00
2024-11-21 00:48:45 -06:00
return nil
2024-06-27 21:23:51 -06:00
}
2024-11-21 00:48:45 -06:00
// GetDB returns the database connection
func GetDB() *sql.DB {
return db
2024-06-27 21:23:51 -06:00
}