feat(platform): 开源发布 - 初始化 Open AI Canvas

This commit is contained in:
ddCat
2026-07-22 14:18:14 +08:00
commit aea35896eb
365 changed files with 66410 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
package database
import (
"errors"
"fmt"
"os"
"strings"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type Config struct {
Driver string
DSN string
DataDir string
}
func Open(config Config) (*gorm.DB, error) {
driver := strings.ToLower(strings.TrimSpace(config.Driver))
if driver == "" {
driver = "sqlite"
}
switch driver {
case "sqlite":
dsn := strings.TrimSpace(config.DSN)
if dsn == "" {
if err := os.MkdirAll(config.DataDir, 0o755); err != nil {
return nil, err
}
dsn = config.DataDir + "/open_ai_canvas.db?_busy_timeout=5000&_journal_mode=WAL&_foreign_keys=on&_synchronous=NORMAL"
}
return gorm.Open(sqlite.Open(dsn), &gorm.Config{})
case "postgres", "postgresql":
dsn := strings.TrimSpace(config.DSN)
if dsn == "" {
return nil, errors.New("PostgreSQL 模式必须配置 DATABASE_URL")
}
return gorm.Open(postgres.Open(dsn), &gorm.Config{})
default:
return nil, fmt.Errorf("不支持的数据库驱动:%s", driver)
}
}
func ConfigurePool(db *gorm.DB) error {
sqlDB, err := db.DB()
if err != nil {
return err
}
if db.Dialector.Name() == "postgres" {
sqlDB.SetMaxOpenConns(30)
sqlDB.SetMaxIdleConns(10)
return nil
}
sqlDB.SetMaxOpenConns(8)
sqlDB.SetMaxIdleConns(4)
return nil
}

View File

@@ -0,0 +1,56 @@
package database
import (
"infinite-canvas/backend/internal/model"
"gorm.io/gorm"
)
// Models 是应用持久化表的唯一清单,服务启动和跨数据库迁移必须共用它。
func Models() []any {
return []any{
&model.User{},
&model.AuthSession{},
&model.UserIdentity{},
&model.OAuthState{},
&model.EmailVerificationCode{},
&model.ModelChannel{},
&model.ChannelModel{},
&model.ApiCallLog{},
&model.ModelPricing{},
&model.CreditAccount{},
&model.CreditLedgerEntry{},
&model.BillingOrder{},
&model.RedeemBatch{},
&model.RedeemCode{},
&model.AdminAuditEvent{},
&model.UserDailyActivity{},
&model.SystemSetting{},
&model.UserOSSSetting{},
&model.UserDailyUploadUsage{},
&model.UserSkillState{},
&model.Resource{},
&model.Asset{},
&model.CanvasProject{},
&model.CanvasShare{},
&model.StoryboardPromptTemplate{},
&model.Announcement{},
&model.UserAnnouncementRead{},
&model.Task{},
&model.Session{},
&model.Message{},
&model.TaskLog{},
&model.SessionFile{},
&model.Result{},
}
}
func MigrateSchema(db *gorm.DB) error {
if err := db.AutoMigrate(Models()...); err != nil {
return err
}
if err := db.Exec("DROP INDEX IF EXISTS idx_users_email").Error; err != nil {
return err
}
return db.Exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email_nonempty ON users(lower(email)) WHERE email <> ''").Error
}