You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v3"
|
|
"github.com/gofiber/fiber/v3/middleware/cors"
|
|
"github.com/gofiber/fiber/v3/middleware/logger"
|
|
"github.com/gofiber/fiber/v3/middleware/recover"
|
|
"github.com/gofiber/fiber/v3/middleware/requestid"
|
|
|
|
"github.com/knowfoolery/backend/services/gateway-service/config"
|
|
"github.com/knowfoolery/backend/services/gateway-service/internal/handlers"
|
|
"github.com/knowfoolery/backend/services/gateway-service/internal/middleware"
|
|
"github.com/knowfoolery/backend/services/gateway-service/internal/proxy"
|
|
"github.com/knowfoolery/backend/services/gateway-service/internal/security"
|
|
)
|
|
|
|
func main() {
|
|
cfg := config.Load()
|
|
|
|
app := fiber.New(fiber.Config{
|
|
AppName: "Know Foolery Gateway",
|
|
ReadTimeout: 30 * time.Second,
|
|
WriteTimeout: 30 * time.Second,
|
|
IdleTimeout: 120 * time.Second,
|
|
ErrorHandler: handlers.ErrorHandler,
|
|
})
|
|
|
|
app.Use(requestid.New())
|
|
|
|
app.Use(logger.New(logger.Config{
|
|
Format: "${time} ${status} - ${method} ${path} - ${latency}\n",
|
|
}))
|
|
|
|
app.Use(recover.New())
|
|
|
|
app.Use(cors.New(cors.Config{
|
|
AllowOrigins: cfg.CORS.AllowedOrigins,
|
|
AllowMethods: cfg.CORS.AllowedMethods,
|
|
AllowHeaders: cfg.CORS.AllowedHeaders,
|
|
AllowCredentials: cfg.CORS.AllowCredentials,
|
|
MaxAge: cfg.CORS.MaxAge,
|
|
}))
|
|
|
|
authMiddleware := middleware.NewAuthMiddleware(cfg.Auth)
|
|
rateLimiter := middleware.NewRateLimiter(cfg.RateLimit)
|
|
healthChecker := middleware.NewHealthChecker(cfg.Services)
|
|
|
|
app.Use(rateLimiter.Handler())
|
|
|
|
proxyManager := proxy.NewManager(cfg.Services)
|
|
securityManager := security.NewManager(cfg.Security)
|
|
|
|
v1 := app.Group("/api/v1")
|
|
|
|
app.Get("/health", handlers.HealthCheck)
|
|
app.Get("/metrics", handlers.Metrics)
|
|
|
|
v1.Use(authMiddleware.Handler())
|
|
v1.Use(healthChecker.Handler())
|
|
v1.Use(securityManager.Handler())
|
|
|
|
v1.All("/game/*", proxyManager.ProxyToService("game-service"))
|
|
v1.All("/questions/*", proxyManager.ProxyToService("question-service"))
|
|
v1.All("/users/*", proxyManager.ProxyToService("user-service"))
|
|
v1.All("/leaderboard/*", proxyManager.ProxyToService("leaderboard-service"))
|
|
v1.All("/sessions/*", proxyManager.ProxyToService("session-service"))
|
|
|
|
adminRoutes := v1.Group("/admin")
|
|
adminRoutes.Use(authMiddleware.RequireAdminRole())
|
|
adminRoutes.All("/*", proxyManager.ProxyToService("admin-service"))
|
|
|
|
go func() {
|
|
if err := app.Listen(cfg.Server.Port); err != nil {
|
|
log.Printf("Gateway server error: %v", err)
|
|
}
|
|
}()
|
|
|
|
quit := make(chan os.Signal, 1)
|
|
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
|
<-quit
|
|
|
|
log.Println("Shutting down gateway server...")
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
if err := app.ShutdownWithContext(ctx); err != nil {
|
|
log.Printf("Gateway server shutdown error: %v", err)
|
|
}
|
|
|
|
log.Println("Gateway server shutdown complete")
|
|
} |