package manager import ( "fmt" "users_management/m/config" "users_management/m/model/entity" "gorm.io/driver/postgres" "gorm.io/gorm" ) type InfraManager interface { Conn() *gorm.DB } type infraManager struct { db *gorm.DB cfg *config.Config } func (im *infraManager) openConn() error { dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s TimeZone=Asia/Shanghai", im.cfg.DBHost, im.cfg.DBUser, im.cfg.DBPass, im.cfg.DBName, im.cfg.DBPort) // Configure GORM to disable foreign key constraint during migration db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, }) if err != nil { return err } err = im.autoMigrate(db) if err != nil { return fmt.Errorf("failed to migrate database schema: %w", err) } im.db = db return nil } func (im *infraManager) autoMigrate(db *gorm.DB) error { return db.AutoMigrate( &entity.Role{}, &entity.User{}, &entity.Device{}, &entity.Tower{}, &entity.OLT{}, &entity.DevicePort{}, &entity.Backbone{}, &entity.Fishbone{}, &entity.CountAssets{}, &entity.ActivityLog{}, ) } func NewInfraManager(cfg *config.Config) (InfraManager, error) { im := &infraManager{ cfg: cfg, } err := im.openConn() if err != nil { panic(err) } return im, nil } func (im *infraManager) Conn() *gorm.DB { return im.db }