package initialize import ( "fmt" "time" "github.com/dungnt11/todoms_golang/global" "github.com/dungnt11/todoms_golang/internal/models" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/gorm" ) // checkErrorPanic kiểm tra lỗi và gọi panic nếu có lỗi, đồng thời ghi log chi tiết. func checkErrorPanic(err error, errString string) { if err != nil { global.Logger.Error(errString, zap.Error(err)) panic(err) } } // InitMysql khởi tạo kết nối đến cơ sở dữ liệu MySQL và trả về đối tượng *gorm.DB. func InitMysql() *gorm.DB { m := global.Config.Database dsn := "%s:%s@tcp(%s:%v)/%s?charset=utf8mb4&parseTime=True&loc=Local" s := fmt.Sprintf(dsn, m.Username, m.Password, m.Host, m.Port, m.Database) db, err := gorm.Open(mysql.Open(s), &gorm.Config{ SkipDefaultTransaction: false, }) checkErrorPanic(err, "InitMysql initialization error") global.Logger.Info("Initializing MySQL Successfully") setPool(db) return db } // setPool thiết lập các thông số cho connection pool của cơ sở dữ liệu. func setPool(db *gorm.DB) { m := global.Config.Database sqlDb, err := db.DB() if err != nil { global.Logger.Error("Failed to get sql.DB from gorm.DB", zap.Error(err)) return } sqlDb.SetMaxIdleConns(m.MaxIdleConns) sqlDb.SetMaxOpenConns(m.MaxOpenConns) sqlDb.SetConnMaxLifetime(time.Duration(m.ConnMaxLifetime) * time.Second) } func defaultInitMysql() { isInitUser := global.Mdb.Migrator().HasTable(&models.User{}) isInitProduct := global.Mdb.Migrator().HasTable(&models.Product{}) if !isInitUser { global.Mdb.AutoMigrate(&models.User{}) global.Logger.Info("Initialized User table") } if !isInitProduct { global.Mdb.AutoMigrate(&models.Product{}) global.Logger.Info("Initialized Product table") } }