package main import ( "antrian-operasi/internal/server" "context" "fmt" "log" "net/http" "os/signal" "syscall" "time" _ "antrian-operasi/docs" "github.com/joho/godotenv" ) func gracefulShutdown(apiServer *http.Server, done chan bool) { ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() <-ctx.Done() log.Println("Shutting down gracefully, press Ctrl+C again to force") stop() ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := apiServer.Shutdown(ctx); err != nil { log.Printf("Server forced to shutdown with error: %v", err) } log.Println("Server exiting") done <- true } // @title Antrian Operasi API // @version 1.0 // @description Dokumentasi API Antrian Operasi // @host localhost:8080 // @BasePath /api // @securityDefinitions.apikey BearerAuth // @in header // @name Authorization // @security BearerAuth func main() { log.Println("Starting API Service...") if err := godotenv.Load(); err != nil { log.Printf("Warning: .env file not found or could not be loaded: %v", err) log.Println("Continuing with system environment variables...") } server := server.NewServer() done := make(chan bool, 1) // Run graceful shutdown in a separate goroutine go gracefulShutdown(server, done) log.Printf("Server starting on port %s", server.Addr) err := server.ListenAndServe() if err != nil && err != http.ErrServerClosed { panic(fmt.Sprintf("http server error: %s", err)) } // Wait for the graceful shutdown to complete <-done log.Println("Graceful shutdown complete.") }