ai-gateway/model/main.go

133 lines
2.9 KiB
Go
Raw Normal View History

2023-04-22 12:39:27 +00:00
package model
import (
"fmt"
2023-04-22 12:39:27 +00:00
"gorm.io/driver/mysql"
2023-08-12 11:20:12 +00:00
"gorm.io/driver/postgres"
2023-04-22 12:39:27 +00:00
"gorm.io/driver/sqlite"
"gorm.io/gorm"
2023-04-22 13:14:09 +00:00
"one-api/common"
2023-04-22 12:39:27 +00:00
"os"
2023-08-12 11:20:12 +00:00
"strings"
"time"
2023-04-22 12:39:27 +00:00
)
var DB *gorm.DB
func createRootAccountIfNeed() error {
var user User
2024-01-14 11:21:03 +00:00
//if user.Status != util.UserStatusEnabled {
2023-04-22 12:39:27 +00:00
if err := DB.First(&user).Error; err != nil {
common.SysLog("no user exists, create a root user for you: username is root, password is 123456")
hashedPassword, err := common.Password2Hash("123456")
if err != nil {
return err
}
rootUser := User{
Username: "root",
Password: hashedPassword,
Role: common.RoleRootUser,
Status: common.UserStatusEnabled,
DisplayName: "Root User",
AccessToken: common.GetUUID(),
2023-05-21 02:05:34 +00:00
Quota: 100000000,
2023-04-22 12:39:27 +00:00
}
DB.Create(&rootUser)
}
return nil
}
2023-08-12 11:20:12 +00:00
func chooseDB() (*gorm.DB, error) {
2023-04-22 12:39:27 +00:00
if os.Getenv("SQL_DSN") != "" {
2023-08-12 11:20:12 +00:00
dsn := os.Getenv("SQL_DSN")
if strings.HasPrefix(dsn, "postgres://") {
// Use PostgreSQL
common.SysLog("using PostgreSQL as database")
common.UsingPostgreSQL = true
2023-08-12 11:20:12 +00:00
return gorm.Open(postgres.New(postgres.Config{
DSN: dsn,
PreferSimpleProtocol: true, // disables implicit prepared statement usage
}), &gorm.Config{
PrepareStmt: true, // precompile SQL
})
}
2023-04-22 12:39:27 +00:00
// Use MySQL
2023-06-21 17:12:28 +00:00
common.SysLog("using MySQL as database")
2023-08-12 11:20:12 +00:00
return gorm.Open(mysql.Open(dsn), &gorm.Config{
2023-04-22 12:39:27 +00:00
PrepareStmt: true, // precompile SQL
})
}
2023-08-12 11:20:12 +00:00
// Use SQLite
common.SysLog("SQL_DSN not set, using SQLite as database")
common.UsingSQLite = true
config := fmt.Sprintf("?_busy_timeout=%d", common.SQLiteBusyTimeout)
return gorm.Open(sqlite.Open(common.SQLitePath+config), &gorm.Config{
2023-08-12 11:20:12 +00:00
PrepareStmt: true, // precompile SQL
})
}
func InitDB() (err error) {
db, err := chooseDB()
2023-04-22 12:39:27 +00:00
if err == nil {
if common.DebugEnabled {
db = db.Debug()
}
2023-04-22 12:39:27 +00:00
DB = db
sqlDB, err := DB.DB()
if err != nil {
return err
}
sqlDB.SetMaxIdleConns(common.GetOrDefault("SQL_MAX_IDLE_CONNS", 100))
sqlDB.SetMaxOpenConns(common.GetOrDefault("SQL_MAX_OPEN_CONNS", 1000))
sqlDB.SetConnMaxLifetime(time.Second * time.Duration(common.GetOrDefault("SQL_MAX_LIFETIME", 60)))
if !common.IsMasterNode {
return nil
}
2023-10-02 04:13:30 +00:00
common.SysLog("database migration started")
err = db.AutoMigrate(&Channel{})
2023-04-22 12:39:27 +00:00
if err != nil {
return err
}
2023-04-23 04:43:10 +00:00
err = db.AutoMigrate(&Token{})
if err != nil {
return err
}
2023-04-22 12:39:27 +00:00
err = db.AutoMigrate(&User{})
if err != nil {
return err
}
err = db.AutoMigrate(&Option{})
if err != nil {
return err
}
err = db.AutoMigrate(&Redemption{})
if err != nil {
return err
}
err = db.AutoMigrate(&Ability{})
if err != nil {
return err
}
err = db.AutoMigrate(&Log{})
if err != nil {
return err
}
2023-06-22 02:59:01 +00:00
common.SysLog("database migrated")
2023-04-22 12:39:27 +00:00
err = createRootAccountIfNeed()
return err
} else {
common.FatalLog(err)
}
return err
}
func CloseDB() error {
sqlDB, err := DB.DB()
if err != nil {
return err
}
err = sqlDB.Close()
return err
}