package db import ( "go-eve-pi/esi" "go-eve-pi/options" "go-eve-pi/types" "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 GetCharacterByName(characterName string) (*types.Character, error) SaveCharacter(character *types.Character) error AutoMigrate(dst ...interface{}) error GetCacheEntry(urlHash string) (*esi.CacheEntry, error) SaveCacheEntry(entry *esi.CacheEntry) 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.GlobalOptions.DBPath) dbFile := filepath.Join(options.GlobalOptions.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 } 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) GetCharacterByName(characterName string) (*types.Character, error) { logger.Debug("Fetching token for character %s from database", characterName) var char types.Character err := db.db.Where("character_name = ?", characterName).First(&char).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, char.ExpiresAt) return &char, nil } func (db *DBWrapper) SaveCharacter(character *types.Character) error { logger.Debug("Saving token for character %s to database", character.CharacterName) err := db.db.Save(character).Error if err != nil { return err } logger.Debug("Token saved successfully for character %s", character.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 } func (db *DBWrapper) GetCacheEntry(urlHash string) (*esi.CacheEntry, error) { logger.Debug("Fetching cache entry for URL hash: %s", urlHash) var entry esi.CacheEntry err := db.db.Where("url_hash = ?", urlHash).First(&entry).Error if err != nil { logger.Debug("No cache entry found for URL hash: %s", urlHash) return nil, err } logger.Debug("Cache entry found for URL hash: %s, cached at: %v", urlHash, entry.CachedAt) return &entry, nil } func (db *DBWrapper) SaveCacheEntry(entry *esi.CacheEntry) error { logger.Debug("Saving cache entry for URL hash: %s", entry.URLHash) err := db.db.Save(entry).Error if err != nil { return err } logger.Debug("Cache entry saved successfully for URL hash: %s", entry.URLHash) return nil }