mirror of https://github.com/cloudreve/Cloudreve
214 lines
6.4 KiB
Go
214 lines
6.4 KiB
Go
package migrator
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/cloudreve/Cloudreve/v4/application/migrator/conf"
|
|
"github.com/cloudreve/Cloudreve/v4/application/migrator/model"
|
|
)
|
|
|
|
// TODO:
|
|
// 1. Policy thumb proxy migration
|
|
|
|
type (
|
|
settignMigrator func(allSettings map[string]string, name, value string) ([]settingMigrated, error)
|
|
settingMigrated struct {
|
|
name string
|
|
value string
|
|
}
|
|
// PackProduct 容量包商品
|
|
PackProduct struct {
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Size uint64 `json:"size"`
|
|
Time int64 `json:"time"`
|
|
Price int `json:"price"`
|
|
Score int `json:"score"`
|
|
}
|
|
GroupProducts struct {
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
GroupID uint `json:"group_id"`
|
|
Time int64 `json:"time"`
|
|
Price int `json:"price"`
|
|
Score int `json:"score"`
|
|
Des []string `json:"des"`
|
|
Highlight bool `json:"highlight"`
|
|
}
|
|
)
|
|
|
|
var noopMigrator = func(allSettings map[string]string, name, value string) ([]settingMigrated, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
var migrators = map[string]settignMigrator{
|
|
"siteKeywords": noopMigrator,
|
|
"over_used_template": noopMigrator,
|
|
"download_timeout": noopMigrator,
|
|
"preview_timeout": noopMigrator,
|
|
"doc_preview_timeout": noopMigrator,
|
|
"slave_node_retry": noopMigrator,
|
|
"slave_ping_interval": noopMigrator,
|
|
"slave_recover_interval": noopMigrator,
|
|
"slave_transfer_timeout": noopMigrator,
|
|
"onedrive_monitor_timeout": noopMigrator,
|
|
"onedrive_source_timeout": noopMigrator,
|
|
"share_download_session_timeout": noopMigrator,
|
|
"onedrive_callback_check": noopMigrator,
|
|
"mail_activation_template": noopMigrator,
|
|
"mail_reset_pwd_template": noopMigrator,
|
|
"appid": noopMigrator,
|
|
"appkey": noopMigrator,
|
|
"wechat_enabled": noopMigrator,
|
|
"wechat_appid": noopMigrator,
|
|
"wechat_mchid": noopMigrator,
|
|
"wechat_serial_no": noopMigrator,
|
|
"wechat_api_key": noopMigrator,
|
|
"wechat_pk_content": noopMigrator,
|
|
"hot_share_num": noopMigrator,
|
|
"defaultTheme": noopMigrator,
|
|
"theme_options": noopMigrator,
|
|
"max_worker_num": noopMigrator,
|
|
"max_parallel_transfer": noopMigrator,
|
|
"secret_key": noopMigrator,
|
|
"avatar_size_m": noopMigrator,
|
|
"avatar_size_s": noopMigrator,
|
|
"home_view_method": noopMigrator,
|
|
"share_view_method": noopMigrator,
|
|
"cron_recycle_upload_session": noopMigrator,
|
|
"captcha_type": func(allSettings map[string]string, name, value string) ([]settingMigrated, error) {
|
|
if value == "tcaptcha" {
|
|
value = "normal"
|
|
}
|
|
return []settingMigrated{
|
|
{
|
|
name: "captcha_type",
|
|
value: value,
|
|
},
|
|
}, nil
|
|
},
|
|
"captcha_TCaptcha_CaptchaAppId": noopMigrator,
|
|
"captcha_TCaptcha_AppSecretKey": noopMigrator,
|
|
"captcha_TCaptcha_SecretId": noopMigrator,
|
|
"captcha_TCaptcha_SecretKey": noopMigrator,
|
|
"thumb_file_suffix": func(allSettings map[string]string, name, value string) ([]settingMigrated, error) {
|
|
return []settingMigrated{
|
|
{
|
|
name: "thumb_entity_suffix",
|
|
value: value,
|
|
},
|
|
}, nil
|
|
},
|
|
"thumb_max_src_size": func(allSettings map[string]string, name, value string) ([]settingMigrated, error) {
|
|
return []settingMigrated{
|
|
{
|
|
name: "thumb_music_cover_max_size",
|
|
value: value,
|
|
},
|
|
{
|
|
name: "thumb_libreoffice_max_size",
|
|
value: value,
|
|
},
|
|
{
|
|
name: "thumb_ffmpeg_max_size",
|
|
value: value,
|
|
},
|
|
{
|
|
name: "thumb_vips_max_size",
|
|
value: value,
|
|
},
|
|
{
|
|
name: "thumb_builtin_max_size",
|
|
value: value,
|
|
},
|
|
}, nil
|
|
},
|
|
"initial_files": noopMigrator,
|
|
"office_preview_service": noopMigrator,
|
|
"phone_required": noopMigrator,
|
|
"phone_enabled": noopMigrator,
|
|
"wopi_session_timeout": func(allSettings map[string]string, name, value string) ([]settingMigrated, error) {
|
|
return []settingMigrated{
|
|
{
|
|
name: "viewer_session_timeout",
|
|
value: value,
|
|
},
|
|
}, nil
|
|
},
|
|
"custom_payment_enabled": noopMigrator,
|
|
"custom_payment_endpoint": noopMigrator,
|
|
"custom_payment_secret": noopMigrator,
|
|
"custom_payment_name": noopMigrator,
|
|
}
|
|
|
|
func (m *Migrator) migrateSettings() error {
|
|
m.l.Info("Migrating settings...")
|
|
// 1. List all settings
|
|
var settings []model.Setting
|
|
if err := model.DB.Find(&settings).Error; err != nil {
|
|
return fmt.Errorf("failed to list v3 settings: %w", err)
|
|
}
|
|
|
|
m.l.Info("Found %d v3 setting pairs to be migrated.", len(settings))
|
|
|
|
allSettings := make(map[string]string)
|
|
for _, s := range settings {
|
|
allSettings[s.Name] = s.Value
|
|
}
|
|
|
|
migratedSettings := make([]settingMigrated, 0)
|
|
for _, s := range settings {
|
|
if s.Name == "thumb_file_suffix" {
|
|
m.state.ThumbSuffix = s.Value
|
|
}
|
|
if s.Name == "avatar_path" {
|
|
m.state.V3AvatarPath = s.Value
|
|
}
|
|
migrator, ok := migrators[s.Name]
|
|
if ok {
|
|
newSettings, err := migrator(allSettings, s.Name, s.Value)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to migrate setting %q: %w", s.Name, err)
|
|
}
|
|
migratedSettings = append(migratedSettings, newSettings...)
|
|
} else {
|
|
migratedSettings = append(migratedSettings, settingMigrated{
|
|
name: s.Name,
|
|
value: s.Value,
|
|
})
|
|
}
|
|
}
|
|
|
|
tx, err := m.v4client.Tx(context.Background())
|
|
if err != nil {
|
|
return fmt.Errorf("failed to start transaction: %w", err)
|
|
}
|
|
|
|
// Insert hash_id_salt
|
|
if conf.SystemConfig.HashIDSalt != "" {
|
|
if err := tx.Setting.Create().SetName("hash_id_salt").SetValue(conf.SystemConfig.HashIDSalt).Exec(context.Background()); err != nil {
|
|
if err := tx.Rollback(); err != nil {
|
|
return fmt.Errorf("failed to rollback transaction: %w", err)
|
|
}
|
|
return fmt.Errorf("failed to create setting hash_id_salt: %w", err)
|
|
}
|
|
} else {
|
|
return fmt.Errorf("hash ID salt is not set, please set it from v3 conf file")
|
|
}
|
|
|
|
for _, s := range migratedSettings {
|
|
if err := tx.Setting.Create().SetName(s.name).SetValue(s.value).Exec(context.Background()); err != nil {
|
|
if err := tx.Rollback(); err != nil {
|
|
return fmt.Errorf("failed to rollback transaction: %w", err)
|
|
}
|
|
return fmt.Errorf("failed to create setting %q: %w", s.name, err)
|
|
}
|
|
}
|
|
|
|
if err := tx.Commit(); err != nil {
|
|
return fmt.Errorf("failed to commit transaction: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|