100 lines
2.2 KiB
Go
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")
|
|
|
|
}
|