package main import( "os" "io" "net/http" "fmt" "github.com/gin-gonic/gin" "github.com/joho/godotenv" "example.com/gin/test/controllers" "example.com/gin/test/repositories" "example.com/gin/test/middlewares" ) var( shopItemController controllers.ShopItemController = controllers.NewShopItemController() userController controllers.UserController = controllers.UserController{} authValidator middlewares.AuthValidator = middlewares.AuthValidator{} ) func LoadEnvVariables() { err := godotenv.Load(".env") if err != nil { fmt.Println("Error loading .env file") } } func setupLogOutput() { f, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(f, os.Stdout) } func SetReply(ctx *gin.Context, err error, message any) { if err != nil { ctx.JSON(http.StatusBadRequest, gin.H{ "error": err.Error() }) } else { ctx.JSON(http.StatusOK, message) } } func main() { LoadEnvVariables() repositories.InitRepositories() server := gin.New() server.Use(gin.Recovery()) server.Use(gin.Logger()) server.Static("/static", "./static") server.LoadHTMLGlob("views/*.html") apiRoutes := server.Group("/api") //apiRoutes.Use(middlewares.BasicAuth()) { apiRoutes.POST("/shopitems", authValidator.RequireAuth, shopItemController.Create) apiRoutes.GET("/shopitems", authValidator.OptionalAuth, shopItemController.GetAll) apiRoutes.GET("/shopitems/:id", authValidator.OptionalAuth, shopItemController.GetById) apiRoutes.PUT("/shopitems/:id", authValidator.RequireAuth, shopItemController.Update) apiRoutes.DELETE("/shopitems/:id", authValidator.RequireAuth, shopItemController.Delete) //apiRoutes.GET("/rooms/:id/users", authValidator.RequireAuth, authValidator.RequireRoomAdmin, shopItemController.GetUsers) //apiRoutes.POST("/rooms/:id/users", authValidator.RequireAuth, shopItemController.AddUser) apiRoutes.POST("/users/register", userController.Register) apiRoutes.POST("/users/login", userController.Login) apiRoutes.GET("/users/validate", authValidator.OptionalAuth, userController.Validate) } viewRoutes := server.Group("/", authValidator.OptionalAuth) { viewRoutes.GET("/", userController.MainView) viewRoutes.GET("/shopitems/:id", shopItemController.ShopItemView) //write middleware that redirects to homescreen on register/login/reset for logged in users viewRoutes.GET("/login", userController.LoginView) viewRoutes.GET("/logout", userController.Logout) viewRoutes.GET("/register", userController.RegisterView) viewRoutes.GET("/passwordreset", userController.ResetView) viewRoutes.GET("/additem", authValidator.RequireAuth, shopItemController.AddItemView) viewRoutes.POST("/login", userController.LoginHandler) viewRoutes.POST("/register", userController.RegisterHandler) viewRoutes.POST("/additem", authValidator.RequireAuth, shopItemController.AddItemHandler) viewRoutes.POST("/passwordreset", userController.ResetHandler) } server.Run(":"+os.Getenv("PORT")) }