107 lines
2.6 KiB
Go
107 lines
2.6 KiB
Go
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)
|
|
}
|
|
}
|