miniITCS/backend/cmd/server/main.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)
}
}