package svc import ( "fmt" "github.com/zeromicro/go-zero/core/stores/sqlx" "gorm.io/gorm" "photography-backend/internal/config" "photography-backend/internal/middleware" "photography-backend/internal/model" "photography-backend/pkg/utils/database" ) type ServiceContext struct { Config config.Config DB *gorm.DB UserModel model.UserModel PhotoModel model.PhotoModel CategoryModel model.CategoryModel Middleware *middleware.MiddlewareManager } func NewServiceContext(c config.Config) *ServiceContext { db, err := database.NewDB(c.Database) if err != nil { panic(err) } // Create sqlx connection for go-zero models sqlxConn := sqlx.NewSqlConn(getSQLDriverName(c.Database.Driver), getSQLDataSource(c.Database)) return &ServiceContext{ Config: c, DB: db, UserModel: model.NewUserModel(sqlxConn), PhotoModel: model.NewPhotoModel(sqlxConn), CategoryModel: model.NewCategoryModel(sqlxConn), Middleware: middleware.NewMiddlewareManager(c), } } func getSQLDriverName(driver string) string { switch driver { case "mysql": return "mysql" case "postgres": return "postgres" case "sqlite": return "sqlite3" default: return "mysql" } } func getSQLDataSource(config database.Config) string { switch config.Driver { case "mysql": return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local", config.Username, config.Password, config.Host, config.Port, config.Database, config.Charset) case "postgres": return fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=Asia/Shanghai", config.Host, config.Username, config.Password, config.Database, config.Port, config.SSLMode) case "sqlite": return config.FilePath default: return "" } }