103 lines
2.3 KiB
Go
103 lines
2.3 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"seanime/internal/database/models"
|
|
"time"
|
|
|
|
"github.com/glebarez/sqlite"
|
|
"github.com/rs/zerolog"
|
|
"github.com/samber/mo"
|
|
"gorm.io/gorm"
|
|
gormlogger "gorm.io/gorm/logger"
|
|
)
|
|
|
|
type Database struct {
|
|
gormdb *gorm.DB
|
|
Logger *zerolog.Logger
|
|
CurrMediaFillers mo.Option[map[int]*MediaFillerItem]
|
|
}
|
|
|
|
func (db *Database) Gorm() *gorm.DB {
|
|
return db.gormdb
|
|
}
|
|
|
|
func NewDatabase(appDataDir, dbName string, logger *zerolog.Logger) (*Database, error) {
|
|
|
|
// Set the SQLite database path
|
|
var sqlitePath string
|
|
if os.Getenv("TEST_ENV") == "true" {
|
|
sqlitePath = ":memory:"
|
|
} else {
|
|
sqlitePath = filepath.Join(appDataDir, dbName+".db")
|
|
}
|
|
|
|
// Connect to the SQLite database
|
|
db, err := gorm.Open(sqlite.Open(sqlitePath), &gorm.Config{
|
|
Logger: gormlogger.New(
|
|
log.New(os.Stdout, "\r\n", log.LstdFlags),
|
|
gormlogger.Config{
|
|
SlowThreshold: time.Second,
|
|
LogLevel: gormlogger.Error,
|
|
IgnoreRecordNotFoundError: true,
|
|
ParameterizedQueries: false,
|
|
Colorful: true,
|
|
},
|
|
),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Migrate tables
|
|
err = migrateTables(db)
|
|
if err != nil {
|
|
logger.Fatal().Err(err).Msg("db: Failed to perform auto migration")
|
|
return nil, err
|
|
}
|
|
|
|
logger.Info().Str("name", fmt.Sprintf("%s.db", dbName)).Msg("db: Database instantiated")
|
|
|
|
return &Database{
|
|
gormdb: db,
|
|
Logger: logger,
|
|
CurrMediaFillers: mo.None[map[int]*MediaFillerItem](),
|
|
}, nil
|
|
}
|
|
|
|
// MigrateTables performs auto migration on the database
|
|
func migrateTables(db *gorm.DB) error {
|
|
err := db.AutoMigrate(
|
|
&models.LocalFiles{},
|
|
&models.Settings{},
|
|
&models.Account{},
|
|
&models.Mal{},
|
|
&models.ScanSummary{},
|
|
&models.AutoDownloaderRule{},
|
|
&models.AutoDownloaderItem{},
|
|
&models.SilencedMediaEntry{},
|
|
&models.Theme{},
|
|
&models.PlaylistEntry{},
|
|
&models.ChapterDownloadQueueItem{},
|
|
&models.TorrentstreamSettings{},
|
|
&models.TorrentstreamHistory{},
|
|
&models.MediastreamSettings{},
|
|
&models.MediaFiller{},
|
|
&models.MangaMapping{},
|
|
&models.OnlinestreamMapping{},
|
|
&models.DebridSettings{},
|
|
&models.DebridTorrentItem{},
|
|
&models.PluginData{},
|
|
//&models.MangaChapterContainer{},
|
|
)
|
|
if err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|