package model import ( "fmt" "strings" "esway/internal/opt" "esway/internal/sqlType" "github.com/loveuer/nf/nft/log" "gorm.io/gorm" ) func Init(db *gorm.DB) error { var err error if err = initModel(db); err != nil { return fmt.Errorf("model.MustInit: init models err=%v", err) } log.Info("MustInitModels: auto_migrate privilege model success") if err = initData(db); err != nil { return fmt.Errorf("model.MustInit: init datas err=%v", err) } return nil } func initModel(client *gorm.DB) error { if err := client.AutoMigrate( &User{}, &OpLog{}, &Token{}, &TokenIndex{}, ); err != nil { return err } log.Info("InitModels: auto_migrate user model success") return nil } func initData(client *gorm.DB) error { var err error { count := 0 if err = client.Model(&User{}).Select("count(id)").Take(&count).Error; err != nil { return err } if count < len(initUsers) { log.Warn("mustInitDatas: user count = 0, start init...") for _, user := range initUsers { if err = client.Model(&User{}).Create(user).Error; err != nil { if !strings.Contains(err.Error(), "SQLSTATE 23505") { return err } } } if opt.Cfg.DB.Type == "postgresql" { if err = client.Exec(`SELECT setval('users_id_seq', (SELECT MAX(id) FROM users))`).Error; err != nil { return err } } log.Info("InitDatas: creat init users success") } else { ps := make(sqlType.NumSlice[Privilege], 0) for _, item := range Privilege(0).All() { ps = append(ps, item.(Privilege)) } if err = client.Model(&User{}).Where("id = ?", initUsers[0].Id). Updates(map[string]any{ "privileges": ps, }).Error; err != nil { return err } log.Info("initDatas: update init users success") } } return nil }