90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"path/filepath"
|
|
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
|
|
logger "git.site.quack-lab.dev/dave/cylogger"
|
|
)
|
|
|
|
type DB interface {
|
|
DB() *gorm.DB
|
|
Raw(sql string, args ...any) *gorm.DB
|
|
GetTokenForCharacter(characterName string) (*Token, error)
|
|
SaveTokenForCharacter(token *Token) error
|
|
AutoMigrate(dst ...interface{}) error
|
|
}
|
|
|
|
type DBWrapper struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
var db *DBWrapper
|
|
|
|
func GetDB() (DB, error) {
|
|
var err error
|
|
|
|
if db != nil {
|
|
logger.Debug("Returning existing database connection")
|
|
return db, nil
|
|
}
|
|
|
|
logger.Debug("Creating new database connection to %s", options.DBPath)
|
|
dbFile := filepath.Join(options.DBPath)
|
|
db, err := gorm.Open(sqlite.Open(dbFile), &gorm.Config{
|
|
// SkipDefaultTransaction: true,
|
|
PrepareStmt: true,
|
|
// Logger: gormlogger.Default.LogMode(gormlogger.Silent),
|
|
})
|
|
if err != nil {
|
|
logger.Error("Failed to open database: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
logger.Info("Database connection established successfully")
|
|
return &DBWrapper{db: db}, nil
|
|
}
|
|
|
|
// Just a wrapper
|
|
func (db *DBWrapper) Raw(sql string, args ...any) *gorm.DB {
|
|
return db.db.Raw(sql, args...)
|
|
}
|
|
|
|
func (db *DBWrapper) DB() *gorm.DB {
|
|
return db.db
|
|
}
|
|
|
|
func (db *DBWrapper) GetTokenForCharacter(characterName string) (*Token, error) {
|
|
logger.Debug("Fetching token for character %s from database", characterName)
|
|
var token Token
|
|
err := db.db.Where("character_name = ?", characterName).First(&token).Error
|
|
if err != nil {
|
|
logger.Debug("No token found for character %s: %v", characterName, err)
|
|
return nil, err
|
|
}
|
|
logger.Debug("Token found for character %s, expires at %v", characterName, token.ExpiresAt)
|
|
return &token, nil
|
|
}
|
|
|
|
func (db *DBWrapper) SaveTokenForCharacter(token *Token) error {
|
|
logger.Debug("Saving token for character %s to database", token.CharacterName)
|
|
err := db.db.Save(token).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
logger.Debug("Token saved successfully for character %s", token.CharacterName)
|
|
return nil
|
|
}
|
|
|
|
func (db *DBWrapper) AutoMigrate(dst ...interface{}) error {
|
|
logger.Debug("Running database auto-migration")
|
|
err := db.db.AutoMigrate(dst...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
logger.Debug("Database auto-migration completed successfully")
|
|
return nil
|
|
}
|