166 lines
5.3 KiB
Go
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")
|
|
//}
|