package main import ( adapters2 "Sipro-Marketplaces/internal/test/adapters" "context" "database/sql" "log" "os" "os/signal" "sync" "syscall" "Sipro-Marketplaces/internal/config" "Sipro-Marketplaces/internal/db" "github.com/gofiber/fiber/v2" "google.golang.org/grpc" ) type Server struct { httpApp *fiber.App grpcServer *grpc.Server db *sql.DB } func NewServer(cfg config.Config) (*Server, error) { dbConn, err := db.NewConnection(cfg.DB) if err != nil { return nil, err } httpApp := fiber.New() //adapters.RegisterHTTPRoutes(httpApp, testService) kal := httpApp.Group("/test") adapters2.RegisterRouter(&kal) grpcServer := grpc.NewServer() return &Server{ httpApp: httpApp, grpcServer: grpcServer, db: dbConn, }, nil } func (s *Server) Start(cfg config.Config) error { var wg sync.WaitGroup ctx, cancel := context.WithCancel(context.Background()) defer cancel() wg.Add(1) go func() { defer wg.Done() log.Printf("Starting HTTP server on %s", cfg.HTTP) if err := s.httpApp.Listen(cfg.HTTP); err != nil { log.Printf("HTTP server failed: %v", err) cancel() } }() wg.Add(1) go func() { defer wg.Done() log.Printf("Starting gRPC server on %s", cfg.GRPC) }() wg.Add(1) quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) select { case <-quit: log.Println("Shutting down...") case <-ctx.Done(): log.Println("Context cancelled, shutting down...") } s.shutdown() wg.Wait() return nil } func (s *Server) shutdown() { log.Println("Initiating graceful shutdown...") if err := s.httpApp.Shutdown(); err != nil { log.Printf("Failed to stop HTTP: %v", err) } s.grpcServer.GracefulStop() if err := s.db.Close(); err != nil { log.Printf("Failed to close DB: %v", err) } log.Println("Shutdown complete") } func main() { cfg := config.Load() server, err := NewServer(cfg) if err != nil { log.Fatalf("Failed to initialize server: %v", err) } if err := server.Start(cfg); err != nil { log.Fatalf("Server failed: %v", err) } }