package main import ( "context" "log" "os" "os/signal" "smpp-transmitter/pkg/data" fl "smpp-transmitter/pkg/logger" "smpp-transmitter/pkg/mq" "syscall" "github.com/joho/godotenv" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) func main() { err := godotenv.Load() if err != nil { log.Fatal("Error loading .env file") } // Load environment variables mysqlDSN := os.Getenv("MYSQL_DSN") appEnv := os.Getenv("APP_ENV") if mysqlDSN == "" { log.Fatal("MYSQL_DSN environment variable must be set") } Log, err := fl.SetupLogger(appEnv) if err != nil { log.Fatalf("Failed to set up logger: %v", err) } // Initialize MySQL database connection db, err := gorm.Open(mysql.Open(mysqlDSN), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) if err != nil { Log.Error("Failed to connect to MySQL:", err) panic("Failed to connect to MySQL") } //initilize rabbitmq messageQueue, err := mq.NewRabbitMQ() if err != nil { log.Fatalf("Failed to set up Message Broker: %v", err) } // Run RabbitMQ consumer go messageQueue.Consume(func(ctx context.Context, body []byte) { message := &data.Message{} Log.Info("Received a raw message", "body", string(body)) if err := message.Convert(body); err != nil { Log.Error("Message cannot be converted", err) return } if err := message.Insert(ctx, db); err != nil { Log.Error("Message cannot be Inserted", err) return } log.Printf("Message handled %v", string(body)) }) // Handle signals for graceful shutdown sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) <-sigs log.Println("Shutting down...") Log.Info("Shutting down...") os.Exit(0) }