package main import ( "context" "os" "os/signal" "syscall" "time" "github.com/gin-gonic/gin" fwdb "github.com/yourorg/go-dw-platform/framework/db" fwlogger "github.com/yourorg/go-dw-platform/framework/logger" fwmiddleware "github.com/yourorg/go-dw-platform/framework/middleware" "github.com/yourorg/go-dw-platform/services/template-service/handler" "github.com/yourorg/go-dw-platform/services/template-service/repository" "github.com/yourorg/go-dw-platform/services/template-service/service" "github.com/yourorg/go-dw-platform/services/template-service/transformer" ) func main() { cfg := LoadConfig() log := fwlogger.New("template-service") ctx := context.Background() pool, err := fwdb.NewPool(ctx, fwdb.Config{ DSN: cfg.DB.DSN, MaxConns: cfg.DB.MaxConns, MinConns: cfg.DB.MinConns, MaxConnLifetime: cfg.DB.MaxConnLifetime, MaxConnIdleTime: cfg.DB.MaxConnIdleTime, }) if err != nil { log.Error("failed to connect to database", "error", err) os.Exit(1) } defer pool.Close() repo := repository.New(pool) tf := transformer.New() svc := service.New( repo, tf, cfg.Batch.Size, time.Duration(cfg.Batch.TimeoutSec)*time.Second, cfg.Batch.MaxRetries, cfg.Batch.RetryDelay, ) ingestHandler := handler.New(svc, log) healthHandler := handler.NewHealthHandler(pool) router := gin.New() router.Use(fwmiddleware.Logging(log)) router.Use(gin.Recovery()) router.GET("/health", healthHandler.Health) api := router.Group("/api") api.Use(fwmiddleware.AuthMiddleware()) api.POST("/ingest", ingestHandler.IngestOrders) go func() { if err := router.Run(":" + cfg.Port); err != nil { log.Error("server stopped", "error", err) } }() sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) <-sigChan log.Info("shutting down gracefully") }