From 28d0eae715b348e5dab6c739bb02427efe2338fa Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:13:29 -0500 Subject: [PATCH] up --- pkg/models/ai_config.go | 42 +++ resources/views/ai_config.html | 34 +- resources/views/query_runner.html | 331 ++++++++++++++++---- rest/controllers/ai_config_controller.go | 20 +- rest/controllers/api/landing_controller.go | 8 +- rest/controllers/query_runner_controller.go | 75 ++++- rest/routes/user.go | 1 + 7 files changed, 434 insertions(+), 77 deletions(-) diff --git a/pkg/models/ai_config.go b/pkg/models/ai_config.go index dce2624..6bc52af 100644 --- a/pkg/models/ai_config.go +++ b/pkg/models/ai_config.go @@ -18,6 +18,11 @@ type AiConfig struct { ModelName string `gorm:"size:100" json:"model_name"` // ej: qwen2.5-72b-instruct IsActive bool `gorm:"default:true" json:"is_active"` // Solo uno activo a la vez Notes string `gorm:"type:text" json:"notes"` + // Modulo indica a qué servicio pertenece esta config. + // "" = global (disponible para todos como fallback) + // "landing" = exclusivo para Landing Generator + // "query_runner" = exclusivo para Query Runner SQL + Modulo string `gorm:"size:50;default:''" json:"modulo"` } func (AiConfig) TableName() string { return "ai_configs" } @@ -64,3 +69,40 @@ func GetActiveAiConfig(provider string) (*AiConfig, error) { } return &item, nil } + +// GetAiConfigForService retorna la config activa asignada al módulo indicado. +// Lógica de prioridad: +// 1. Config activa con modulo == service (exclusiva del servicio) +// 2. Config activa con modulo == "" (global, fallback) +// 3. Cualquier config activa (último recurso) +func GetAiConfigForService(service string) (*AiConfig, error) { + var item AiConfig + + // 1. Buscar config específica para el servicio + if service != "" { + err := app.Http.Database.DB. + Where("is_active = ? AND modulo = ?", true, service). + First(&item).Error + if err == nil { + return &item, nil + } + } + + // 2. Buscar config global (modulo vacío) + err := app.Http.Database.DB. + Where("is_active = ? AND (modulo = '' OR modulo IS NULL)", true). + First(&item).Error + if err == nil { + return &item, nil + } + + // 3. Cualquier config activa como último recurso + err = app.Http.Database.DB. + Where("is_active = ?", true). + First(&item).Error + if err != nil { + log.Printf("[AI_CONFIG] No se encontró config activa para servicio '%s': %v", service, err) + return nil, err + } + return &item, nil +} diff --git a/resources/views/ai_config.html b/resources/views/ai_config.html index 8fb7ca4..47ca1ed 100644 --- a/resources/views/ai_config.html +++ b/resources/views/ai_config.html @@ -48,10 +48,10 @@ Nombre + Módulo Provider Modelo API Key - Base URL Estado Acciones @@ -63,6 +63,16 @@