package main import ( "log" "github.com/gin-gonic/gin" "github.com/joho/godotenv" "admintemplate/internal/database" "admintemplate/internal/handlers" "admintemplate/internal/middleware" "admintemplate/pkg/config" ) func main() { // Load .env file if exists _ = godotenv.Load() // Load configuration cfg := config.Load() // Connect to database db, err := database.Connect(&cfg.Database) if err != nil { log.Fatalf("Failed to connect to database: %v", err) } defer db.Close() // Run migrations if err := db.Migrate(); err != nil { log.Fatalf("Failed to run migrations: %v", err) } // Initialize default users authHandler := handlers.NewAuthHandler(db, cfg) if err := authHandler.InitDefaultUsers(); err != nil { log.Fatalf("Failed to initialize default users: %v", err) } // Initialize handlers userHandler := handlers.NewUserHandler(db) menuHandler := handlers.NewMenuHandler(db) // Set Gin mode if cfg.Server.Env == "production" { gin.SetMode(gin.ReleaseMode) } // Setup router r := gin.Default() // CORS middleware r.Use(func(c *gin.Context) { c.Writer.Header().Set("Access-Control-Allow-Origin", "*") c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE, PATCH") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() }) // Health check r.GET("/health", func(c *gin.Context) { c.JSON(200, gin.H{"status": "ok"}) }) // Public routes r.POST("/api/auth/login", authHandler.Login) // Protected routes api := r.Group("/api") api.Use(middleware.AuthMiddleware(cfg.Auth.JWTSecret)) { // Current user api.GET("/auth/me", authHandler.GetCurrentUser) // Menu and UI configuration api.GET("/menu", menuHandler.GetMenuItems) api.GET("/toolbar", menuHandler.GetToolbarItems) api.GET("/settings", menuHandler.GetUserSettings) api.PUT("/settings", menuHandler.UpdateUserSettings) // User management (admin only) users := api.Group("/users") users.Use(middleware.RequireAdmin()) { users.GET("", userHandler.ListUsers) users.GET("/:id", userHandler.GetUser) users.POST("", userHandler.CreateUser) users.PUT("/:id", userHandler.UpdateUser) users.DELETE("/:id", userHandler.DeleteUser) } } // Start server addr := cfg.Server.Host + ":" + cfg.Server.Port log.Printf("Server starting on %s", addr) if err := r.Run(addr); err != nil { log.Fatalf("Failed to start server: %v", err) } }