2025-05-17 11:36:26 -04:00

166 lines
5.3 KiB
Go

package main
import (
"api-soap-facturacion/internal/api"
"api-soap-facturacion/internal/config"
"api-soap-facturacion/internal/database"
"api-soap-facturacion/internal/logger"
"api-soap-facturacion/internal/soap"
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
// Inicializar configuración
cfg, err := config.LoadConfig()
if err != nil {
panic(fmt.Sprintf("Error al cargar la configuración: %v", err))
}
// Inicializar logger
log := logger.NewLogger(cfg)
//log.Info("Iniciando aplicación", logger.Field("app", cfg.App.Name))
log.Info("Iniciando aplicación", logger.NewField("app", cfg.App.Name))
// Conectar a la base de datos
db, err := database.NewPostgresConnection(cfg.Database)
if err != nil {
//log.Fatal("Error al conectar a la base de datos", logger.Field("error", err))
log.Fatal("Error al conectar a la base de datos", logger.NewField("error", err))
}
defer db.Close()
// Verificar conexión a la base de datos
if err := db.Ping(); err != nil {
log.Error("Error al cargar parámetros desde la base de datos", logger.NewField("error", err))
}
log.Info("Conexión a la base de datos establecida")
// Cargar parámetros desde la base de datos
params, err := database.LoadParameters(db)
if err != nil {
log.Info("Parámetros cargados desde la base de datos", logger.NewField("count", len(params)))
} else {
log.Info("Parámetros cargados desde la base de datos", logger.NewField("count", len(params)))
// Actualizar configuración con parámetros de la base de datos
cfg.MergeParameters(params)
}
// Inicializar cliente SOAP
soapClients := soap.NewSoapClients(cfg, log)
// Inicializar API
router := api.NewRouter(cfg, log, db, soapClients)
// Configurar servidor HTTP
srv := &http.Server{
Addr: fmt.Sprintf(":%d", cfg.App.Port),
Handler: router,
ReadTimeout: cfg.App.RequestTimeout * time.Second,
WriteTimeout: cfg.App.RequestTimeout * time.Second,
IdleTimeout: 120 * time.Second,
}
// Iniciar servidor en goroutine
go func() {
log.Info("Servidor iniciado", logger.NewField("port", cfg.App.Port))
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal("Error al iniciar servidor", logger.NewField("error", err))
}
}()
// Configurar captura de señales para graceful shutdown
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Info("Apagando servidor...")
// Iniciar graceful shutdown
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Error al apagar servidor", logger.NewField("error", err))
}
log.Info("Servidor detenido correctamente")
}
//
//func main() {
// // Inicializar configuración
// cfg, err := config.LoadConfig()
// if err != nil {
// panic(fmt.Sprintf("Error al cargar la configuración: %v", err))
// }
//
// // Inicializar logger
// log := logger.NewLogger(cfg)
// //log.Info("Iniciando aplicación", logger.Field("app", cfg.App.Name))
// log.Info("Iniciando aplicación", logger.NewField("app", cfg.App.Name))
//
// // Conectar a la base de datos
// db, err := database.NewPostgresConnection(cfg.Database)
// if err != nil {
// //log.Fatal("Error al conectar a la base de datos", logger.Field("error", err))
// log.Fatal("Error al conectar a la base de datos", logger.NewField("error", err))
// }
// defer db.Close()
//
// // Verificar conexión a la base de datos
// if err := db.Ping(); err != nil {
// log.Error("Error al cargar parámetros desde la base de datos", logger.NewField("error", err))
// }
// log.Info("Conexión a la base de datos establecida")
//
// // Cargar parámetros desde la base de datos
// params, err := database.LoadParameters(db)
// if err != nil {
// log.Info("Parámetros cargados desde la base de datos", logger.NewField("count", len(params)))
// } else {
// log.Info("Parámetros cargados desde la base de datos", logger.NewField("count", len(params)))
// // Actualizar configuración con parámetros de la base de datos
// cfg.MergeParameters(params)
// }
//
// // Inicializar cliente SOAP
// soapClients := soap.NewSoapClients(cfg, log)
//
// // Inicializar API
// router := api.NewRouter(cfg, log, db, soapClients)
//
// // Configurar servidor HTTP
// srv := &http.Server{
// Addr: fmt.Sprintf(":%d", cfg.App.Port),
// Handler: router,
// ReadTimeout: cfg.App.RequestTimeout * time.Second,
// WriteTimeout: cfg.App.RequestTimeout * time.Second,
// IdleTimeout: 120 * time.Second,
// }
//
// // Iniciar servidor en goroutine
// go func() {
// log.Info("Servidor iniciado", logger.NewField("port", cfg.App.Port))
// if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
// log.Fatal("Error al iniciar servidor", logger.NewField("error", err))
// }
// }()
//
// // Configurar captura de señales para graceful shutdown
// quit := make(chan os.Signal, 1)
// signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
// <-quit
// log.Info("Apagando servidor...")
//
// // Iniciar graceful shutdown
// ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
// defer cancel()
// if err := srv.Shutdown(ctx); err != nil {
// log.Fatal("Error al apagar servidor", logger.NewField("error", err))
// }
// log.Info("Servidor detenido correctamente")
//}