chore: Remove duplicate gateway.go file from internal directory
This commit is contained in:
BIN
api-gateway
BIN
api-gateway
Binary file not shown.
@@ -1,127 +0,0 @@
|
|||||||
// Package gateway provides API Gateway implementation.
|
|
||||||
package gateway
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"net/http/httputil"
|
|
||||||
"net/url"
|
|
||||||
|
|
||||||
"git.dcentral.systems/toolz/goplt/internal/client"
|
|
||||||
"git.dcentral.systems/toolz/goplt/pkg/config"
|
|
||||||
"git.dcentral.systems/toolz/goplt/pkg/logger"
|
|
||||||
"git.dcentral.systems/toolz/goplt/pkg/registry"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Gateway handles routing requests to backend services.
|
|
||||||
type Gateway struct {
|
|
||||||
config config.ConfigProvider
|
|
||||||
log logger.Logger
|
|
||||||
clientFactory *client.ServiceClientFactory
|
|
||||||
registry registry.ServiceRegistry
|
|
||||||
routes []RouteConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
// RouteConfig defines a route configuration.
|
|
||||||
type RouteConfig struct {
|
|
||||||
Path string
|
|
||||||
Service string
|
|
||||||
AuthRequired bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewGateway creates a new API Gateway instance.
|
|
||||||
func NewGateway(
|
|
||||||
cfg config.ConfigProvider,
|
|
||||||
log logger.Logger,
|
|
||||||
clientFactory *client.ServiceClientFactory,
|
|
||||||
reg registry.ServiceRegistry,
|
|
||||||
) (*Gateway, error) {
|
|
||||||
// Load route configurations
|
|
||||||
routes := loadRoutes(cfg)
|
|
||||||
|
|
||||||
return &Gateway{
|
|
||||||
config: cfg,
|
|
||||||
log: log,
|
|
||||||
clientFactory: clientFactory,
|
|
||||||
registry: reg,
|
|
||||||
routes: routes,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetupRoutes configures routes on the Gin router.
|
|
||||||
func (g *Gateway) SetupRoutes(router *gin.Engine) {
|
|
||||||
// Setup route handlers
|
|
||||||
for _, route := range g.routes {
|
|
||||||
route := route // Capture for closure
|
|
||||||
router.Any(route.Path, g.handleRoute(route))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default handler for unmatched routes
|
|
||||||
router.NoRoute(func(c *gin.Context) {
|
|
||||||
c.JSON(http.StatusNotFound, gin.H{
|
|
||||||
"error": "Route not found",
|
|
||||||
"path": c.Request.URL.Path,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleRoute returns a handler function for a route.
|
|
||||||
func (g *Gateway) handleRoute(route RouteConfig) gin.HandlerFunc {
|
|
||||||
return func(c *gin.Context) {
|
|
||||||
// TODO: Add authentication middleware if auth_required is true
|
|
||||||
// TODO: Add rate limiting middleware
|
|
||||||
// TODO: Add CORS middleware
|
|
||||||
|
|
||||||
// Discover service instances
|
|
||||||
ctx := c.Request.Context()
|
|
||||||
instances, err := g.registry.Discover(ctx, route.Service)
|
|
||||||
if err != nil {
|
|
||||||
g.log.Error("Failed to discover service",
|
|
||||||
logger.String("service", route.Service),
|
|
||||||
logger.Error(err),
|
|
||||||
)
|
|
||||||
c.JSON(http.StatusServiceUnavailable, gin.H{
|
|
||||||
"error": "Service unavailable",
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(instances) == 0 {
|
|
||||||
g.log.Warn("No instances found for service",
|
|
||||||
logger.String("service", route.Service),
|
|
||||||
)
|
|
||||||
c.JSON(http.StatusServiceUnavailable, gin.H{
|
|
||||||
"error": "Service unavailable",
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use first healthy instance (load balancing can be added later)
|
|
||||||
instance := instances[0]
|
|
||||||
targetURL := fmt.Sprintf("http://%s:%d", instance.Address, instance.Port)
|
|
||||||
|
|
||||||
// Create reverse proxy
|
|
||||||
target, err := url.Parse(targetURL)
|
|
||||||
if err != nil {
|
|
||||||
g.log.Error("Failed to parse target URL",
|
|
||||||
logger.String("url", targetURL),
|
|
||||||
logger.Error(err),
|
|
||||||
)
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{
|
|
||||||
"error": "Internal server error",
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
proxy := httputil.NewSingleHostReverseProxy(target)
|
|
||||||
proxy.ServeHTTP(c.Writer, c.Request)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// loadRoutes loads route configurations from config.
|
|
||||||
func loadRoutes(cfg config.ConfigProvider) []RouteConfig {
|
|
||||||
// For now, return empty routes - will be loaded from config in future
|
|
||||||
// This is a placeholder implementation
|
|
||||||
return []RouteConfig{}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user