package main import ( "context" "os" "os/signal" "time" "log" "net/http" "git.farahty.com/nimer/go-mongo/app" "github.com/fatih/color" "github.com/joho/godotenv" "github.com/redis/go-redis/v9" ) func main() { color.Yellow("Starting server ...\n") err := godotenv.Load() if err != nil { log.Fatal("Error loading .env file\n") } port := os.Getenv("PORT") color.Green("✅ .env loaded\n") if cancel, err := app.Connect(); err != nil { cancel() log.Fatal(err) } else { defer func() { color.Red("❌ Database Connection Closed\n") cancel() }() } defer func() { if err := app.Mongo.Disconnect(context.Background()); err != nil { log.Fatal("MogoDB Errors" + err.Error()) } }() color.Green("✅ Connected to Database successfully\n") if err := app.LoadAuthorizer(context.Background()); err != nil { log.Fatal("Authorizer Errors : " + err.Error()) } color.Green("✅ Authorization policies loaded successfully\n") redisClient := redis.NewClient(&redis.Options{ Addr: os.Getenv("REDIS_HOST") + ":" + os.Getenv("REDIS_PORT"), Password: os.Getenv("REDIS_PASSWORD"), // no password set }) if _, err := redisClient.Ping(context.Background()).Result(); err != nil { log.Fatal("Redis Error : " + err.Error()) } defer redisClient.Close() color.Green("✅ Connected to Redis cache successfully\n") graphqlServer := createGraphqlServer(redisClient) color.Green("🚀 Server Started at http://localhost:" + port + "\n") //http.ListenAndServe(":"+port, createRouter(graphqlServer)) server := &http.Server{ Addr: ":" + port, WriteTimeout: time.Second * 30, ReadTimeout: time.Second * 30, IdleTimeout: time.Second * 30, Handler: createRouter(graphqlServer), } go server.ListenAndServe() // Wait for interrupt signal to gracefully shut down the server with // a timeout of 15 seconds. quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt) <-quit color.Yellow(" 🎬 Start Shutdown Signal ... ") ctx, cancelShutdown := context.WithTimeout(context.Background(), 15*time.Second) defer cancelShutdown() if err := server.Shutdown(ctx); err != nil { log.Fatal("Server Shutdown:", err) } color.Red("❌ Server Exiting") }