fix: usar field IDs numéricos en query Metabase
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 59s

El filtro de empleados no funcionaba porque Metabase
requiere IDs de campo numéricos (463 para empleado, 453 para id)
en lugar de nombres de campo como strings.
This commit is contained in:
2025-12-05 12:01:20 -06:00
parent ed2f8b1107
commit 6da1552ae1

View File

@@ -50,19 +50,22 @@ export default defineEventHandler(async (event): Promise<Contact[]> => {
} }
// Construir filtros para la query // Construir filtros para la query
// Nota: Metabase requiere field IDs numéricos, no nombres de campo
// IDs obtenidos de la metadata de la tabla 15 (Clientes):
// - id: 453, empleado: 463
const filters: unknown[] = [] const filters: unknown[] = []
// Filtro de empleados (por defecto true) // Filtro de empleados (por defecto true)
const empleadoFilter = query.empleado !== 'false' const empleadoFilter = query.empleado !== 'false'
if (empleadoFilter) { if (empleadoFilter) {
filters.push(['=', ['field', 'empleado', { 'base-type': 'type/Boolean' }], true]) filters.push(['=', ['field', 463, null], true])
} }
// Filtro por ID exacto // Filtro por ID exacto
if (query.id) { if (query.id) {
const idNum = parseInt(query.id as string) const idNum = parseInt(query.id as string)
if (!isNaN(idNum)) { if (!isNaN(idNum)) {
filters.push(['=', ['field', 'id', { 'base-type': 'type/BigInteger' }], idNum]) filters.push(['=', ['field', 453, null], idNum])
} }
} }
@@ -72,13 +75,15 @@ export default defineEventHandler(async (event): Promise<Contact[]> => {
type: 'query', type: 'query',
query: { query: {
'source-table': tableId, 'source-table': tableId,
'order-by': [['asc', ['field', 'id', { 'base-type': 'type/BigInteger' }]]], 'order-by': [['asc', ['field', 453, null]]],
filter: filters.length > 0 filter: filters.length > 0
? (filters.length === 1 ? filters[0] : ['and', ...filters]) ? (filters.length === 1 ? filters[0] : ['and', ...filters])
: undefined : undefined
} }
} }
console.log('📊 Query a Metabase:', JSON.stringify(metabaseQuery, null, 2))
try { try {
const response = await $fetch<MetabaseResponse>(`${metabaseUrl}/api/dataset`, { const response = await $fetch<MetabaseResponse>(`${metabaseUrl}/api/dataset`, {
method: 'POST', method: 'POST',
@@ -89,6 +94,8 @@ export default defineEventHandler(async (event): Promise<Contact[]> => {
body: metabaseQuery body: metabaseQuery
}) })
console.log('📊 Respuesta Metabase - filas:', response.data?.rows?.length || 0)
// Mapear columnas a objetos // Mapear columnas a objetos
const cols = response.data.cols.map((col) => col.name) const cols = response.data.cols.map((col) => col.name)
const contacts: Contact[] = response.data.rows.map((row) => { const contacts: Contact[] = response.data.rows.map((row) => {