Давайте сложим все, что у нас есть.

Мы создаем 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
)…