103 lines
2.0 KiB
Go
103 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|