Files
analiticaNucleo/nuxt4-app/server/api/metabase/opciones-filtros.get.ts
josedario87 52e6f5cdce
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 49s
Fix: corregir arquitectura - TODO debe pasar por Metabase
BREAKING: Violación de arquitectura corregida
- Eliminar endpoint /api/postgres/query (acceso directo a DB prohibido)
- Cambiar /api/clientes para usar query de Metabase en lugar de SQL directo
- Crear endpoint /api/metabase/opciones-filtros para obtener opciones
- Cambiar loadOpcionesFiltros para usar API en lugar de MCP directo
- Usar "Informe Ingresos - Lista de Clientes con Totales" para clientes
- Usar "Informe Ingresos - Opciones de Filtros" para opciones
- Respetar filosofía: Metabase calcula TODO, Vue solo renderiza
- La app NUNCA habla directamente con bases de datos
2025-10-29 18:43:04 -06:00

63 lines
1.7 KiB
TypeScript

/**
* Get filter options from Metabase
* Uses "Informe Ingresos - Opciones de Filtros" query (ID: 53)
* Returns: ubicaciones, calidades, tipos, estados as arrays
*/
export default defineEventHandler(async () => {
try {
// Get all cards to find the opciones query
const allCards = await getMetabaseCards('all')
// Find "Informe Ingresos - Opciones de Filtros" query
const card = allCards.find((c: any) => c.name === 'Informe Ingresos - Opciones de Filtros')
if (!card) {
console.warn('[API] Opciones de Filtros query not found, returning empty options')
return {
ubicaciones: [],
calidades: [],
tipos: [],
estados: []
}
}
// Execute the query (no parameters needed)
const result = await executeCardQuery(card.id, [])
if (!result.data?.rows?.[0] || !result.data?.cols) {
return {
ubicaciones: [],
calidades: [],
tipos: [],
estados: []
}
}
const row = result.data.rows[0]
const cols = result.data.cols
// Transform to object
const data: any = {}
cols.forEach((col: any, index: number) => {
data[col.name] = row[index]
})
// Parse JSON arrays
return {
ubicaciones: data.ubicaciones ? JSON.parse(data.ubicaciones) : [],
calidades: data.calidades ? JSON.parse(data.calidades) : [],
tipos: data.tipos ? JSON.parse(data.tipos) : [],
estados: data.estados ? JSON.parse(data.estados) : []
}
} catch (error: any) {
console.error('[API] Failed to fetch opciones de filtros from Metabase:', error)
// Don't fail, just return empty options
return {
ubicaciones: [],
calidades: [],
tipos: [],
estados: []
}
}
})