diff --git a/rest/controllers/hostinger_controller.go b/rest/controllers/hostinger_controller.go index 445cec6..2d4b769 100644 --- a/rest/controllers/hostinger_controller.go +++ b/rest/controllers/hostinger_controller.go @@ -401,16 +401,16 @@ func syncVencimientoFromOrders(orders []services.HostingerSubscription) { db := app.Http.Database.DB // Indexar suscripciones por ID para búsqueda O(1) - subMap := make(map[string]services.HostingerSubscription, len(orders)) + subByID := make(map[string]services.HostingerSubscription, len(orders)) for _, sub := range orders { - subMap[sub.ID] = sub + subByID[sub.ID] = sub } var servidores []models.Servidor db.Where("hostinger_subscription_id != '' AND hostinger_subscription_id IS NOT NULL").Find(&servidores) for _, srv := range servidores { - sub, ok := subMap[srv.HostingerSubscriptionID] + sub, ok := subByID[srv.HostingerSubscriptionID] if !ok { continue } @@ -427,30 +427,48 @@ func syncVencimientoFromOrders(orders []services.HostingerSubscription) { // syncServidoresFromVPSList actualiza specs y vencimiento de todos los servidores // que tienen hostinger_vps_id vinculado, usando la lista de VPS ya descargada. -// El vencimiento se obtiene con una llamada al billing de cada VPS (por subscription_id). +// También auto-descubre el vínculo comparando la IP del VPS con ip_servidor. func syncServidoresFromVPSList(client *services.HostingerClient, vpsList []services.HostingerVPS) { db := app.Http.Database.DB - // Indexar VPS por ID - vpsMap := make(map[int]services.HostingerVPS, len(vpsList)) - for _, vps := range vpsList { - vpsMap[vps.ID] = vps + // Cargar todos los servidores + var todos []models.Servidor + db.Find(&todos) + + // Índice por hostinger_vps_id (ya vinculados) + byVpsID := make(map[int]*models.Servidor, len(todos)) + // Índice por IP (para auto-descubrimiento) + byIP := make(map[string]*models.Servidor, len(todos)) + for i := range todos { + if todos[i].HostingerVpsID != nil { + byVpsID[*todos[i].HostingerVpsID] = &todos[i] + } + if todos[i].IpServidor != "" { + byIP[todos[i].IpServidor] = &todos[i] + } } - var servidores []models.Servidor - db.Where("hostinger_vps_id IS NOT NULL").Find(&servidores) + for _, vps := range vpsList { + // 1. Buscar por hostinger_vps_id ya guardado + srv := byVpsID[vps.ID] - for _, srv := range servidores { - if srv.HostingerVpsID == nil { - continue + // 2. Auto-descubrir por IP si no está vinculado + if srv == nil { + for _, ip4 := range vps.IPV4 { + if s, ok := byIP[ip4.Address]; ok { + srv = s + break + } + } } - vps, ok := vpsMap[*srv.HostingerVpsID] - if !ok { + + if srv == nil { continue } updates := map[string]interface{}{ - "hostinger_state": vps.State, + "hostinger_vps_id": vps.ID, + "hostinger_state": vps.State, } if len(vps.IPV4) > 0 && vps.IPV4[0].Address != "" { updates["ip_servidor"] = vps.IPV4[0].Address @@ -465,12 +483,14 @@ func syncServidoresFromVPSList(client *services.HostingerClient, vpsList []servi updates["disco"] = fmt.Sprintf("%d GB", vps.DiskBytes/1024) } - // Vencimiento: usar subscription_id del VPS o el ya guardado + // Guardar subscription_id del VPS para el puente con facturación subID := vps.SubscriptionID if subID == "" { subID = srv.HostingerSubscriptionID } if subID != "" { + updates["hostinger_subscription_id"] = subID + // Intentar traer fecha de vencimiento desde billing if sub, err := client.GetSubscriptionByID(subID); err == nil { venc := sub.ExpiresAt if venc == "" { @@ -479,7 +499,6 @@ func syncServidoresFromVPSList(client *services.HostingerClient, vpsList []servi if venc != "" && len(venc) >= 10 { updates["vencimiento"] = venc[:10] } - updates["hostinger_subscription_id"] = subID } }