60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
|
package controller
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"time"
|
||
|
|
||
|
"gorm.io/driver/mysql"
|
||
|
"gorm.io/gorm"
|
||
|
"gorm.io/gorm/logger"
|
||
|
"pkg.bing89.com/travebing/config"
|
||
|
"pkg.bing89.com/travebing/controller/geo"
|
||
|
"pkg.bing89.com/travebing/controller/plan"
|
||
|
"pkg.bing89.com/travebing/controller/way"
|
||
|
)
|
||
|
|
||
|
type Controller interface {
|
||
|
Ways(plan int) way.Controller
|
||
|
Plans() plan.Controller
|
||
|
}
|
||
|
|
||
|
type controller struct {
|
||
|
db *gorm.DB
|
||
|
cfg *config.Config
|
||
|
}
|
||
|
|
||
|
func New(cfg *config.Config) (Controller, error) {
|
||
|
c := &controller{
|
||
|
cfg: cfg,
|
||
|
}
|
||
|
|
||
|
dsn := fmt.Sprintf("%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.Database.Auth, cfg.Database.Address, cfg.Database.Name)
|
||
|
opt := &gorm.Config{}
|
||
|
if cfg.Database.ShowLog {
|
||
|
opt.Logger = logger.Default.LogMode(logger.Info)
|
||
|
}
|
||
|
conn, err := gorm.Open(mysql.Open(dsn), opt)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
sqlDB, err := conn.DB()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
conn.Set("gorm:table_options", "ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci")
|
||
|
sqlDB.SetConnMaxIdleTime(time.Duration(cfg.Database.MaxIdleTime) * time.Second)
|
||
|
sqlDB.SetConnMaxLifetime(time.Duration(cfg.Database.MaxLifeTime) * time.Second)
|
||
|
sqlDB.SetMaxIdleConns(cfg.Database.MaxIdleConnections)
|
||
|
sqlDB.SetMaxOpenConns(cfg.Database.MaxOpenConnections)
|
||
|
c.db = conn
|
||
|
return c, nil
|
||
|
}
|
||
|
|
||
|
func (c *controller) Ways(plan int) way.Controller {
|
||
|
return way.New(plan, c.db, &c.cfg.Image, geo.New(&c.cfg.Geo))
|
||
|
}
|
||
|
|
||
|
func (c *controller) Plans() plan.Controller {
|
||
|
return plan.New(c.db)
|
||
|
}
|