Давайте сложим все, что у нас есть.
Мы создаем main.go
, который вызывает…
func main() { r := gin.Default() db, error := tools.SetupDB() // assuming we get a function to do this and returns a *gorm.DB instance routes.SetupRoutes(r, db) // calls route.go file to set up routes server := $http.Server( Addr: ":8080", // port number 8080 on localhost Handler: r, // gin ) server.ListenAndServe() // starts server and listen for request }
Еще раз, идем сверху вниз. У нас есть основная настройка маршрута вызова.
package routes func SetupRoutes(r *gin.Engine, db *gorm.DB) { userRepo := repos.NewUserRepo(db) UserManager := managers.NewUserManager(userRepo) controllers.NewUserController(r, UserManager) }
Тогда у нас есть контроллер…
package controllers type UserController struct { Manager Manager } type Manager interface { CreateOrUpdateUser(user repos.User) (bool, error) } func NewUserController(r *gin.Engine, userManager *managers.UserManager) { userController := UserController { Manager: userManager } userGroup := r.Group("/user") // localhost:8080/user/...... // mapping localhost:8080/user/createorupdate to userController.CreateOrUpdateUser userGroup.POST("/createorupdate", userController.CreateOrUpdateUser) func (userController *UserController) CreateOrUpdateUser(c *gin.Context) { // passing gin.Context as demonstrated in gin docs body, err := io.ReadAll(c.Request.Body) if err == nil { var user repos.User err := json.Unmarshal([]byte(body), &user) // loading payload into a User model if err != nil { panic(err) } else { _, err = userController.Manager.CreateOrUpdateUser(user) // we don't care about the return if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } else { c.JSON(http.StatusOK, gin.H{"message": "OK"}) } } } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()} } }
Переходим к менеджеру…
package managers type UserManager struct { UserRepo repos.IUserRepo } func NewUserManager( userRepo repos.IUserRepo )…