go-mongo/main.go
2025-05-31 18:52:44 +03:00

100 lines
2.2 KiB
Go

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")
if _, exists := os.LookupEnv("MONGO_URI"); !exists {
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file\n")
}
color.Green("✅ .env loaded\n")
}
port := os.Getenv("PORT")
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")
}