feat: agregar página de debug para Metabase
- Crear componente MetabaseCardDisplay para mostrar detalles de queries - Crear componente MetabaseCardsTable para listar todas las queries - Crear página /metabase-debug con vistas de tabla, cards y queries Panorama - Agregar API routes para cards de Metabase (GET, POST, export) - Actualizar metabase.ts para soportar API Key authentication - Agregar configuración de Metabase API Key en nuxt.config.ts - Documentar todos los endpoints disponibles en METABASE_API_ENDPOINTS.md
This commit is contained in:
24
nuxt4-app/server/api/metabase/cards/[id]/index.get.ts
Normal file
24
nuxt4-app/server/api/metabase/cards/[id]/index.get.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Get a specific Metabase card by ID
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
const id = getRouterParam(event, 'id')
|
||||
|
||||
if (!id) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Card ID is required'
|
||||
})
|
||||
}
|
||||
|
||||
const card = await getMetabaseCard(parseInt(id))
|
||||
return card
|
||||
} catch (error: any) {
|
||||
console.error('[API] Failed to get Metabase card:', error)
|
||||
throw createError({
|
||||
statusCode: error.statusCode || 500,
|
||||
statusMessage: error.statusMessage || 'Failed to fetch card'
|
||||
})
|
||||
}
|
||||
})
|
||||
24
nuxt4-app/server/api/metabase/cards/[id]/query.get.ts
Normal file
24
nuxt4-app/server/api/metabase/cards/[id]/query.get.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Execute a Metabase card query with cache (GET)
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
const id = getRouterParam(event, 'id')
|
||||
|
||||
if (!id) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Card ID is required'
|
||||
})
|
||||
}
|
||||
|
||||
const result = await executeCardQueryCached(parseInt(id))
|
||||
return result
|
||||
} catch (error: any) {
|
||||
console.error('[API] Failed to execute cached query:', error)
|
||||
throw createError({
|
||||
statusCode: error.statusCode || 500,
|
||||
statusMessage: error.statusMessage || 'Failed to execute cached query'
|
||||
})
|
||||
}
|
||||
})
|
||||
27
nuxt4-app/server/api/metabase/cards/[id]/query.post.ts
Normal file
27
nuxt4-app/server/api/metabase/cards/[id]/query.post.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Execute a Metabase card query (POST)
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
const id = getRouterParam(event, 'id')
|
||||
|
||||
if (!id) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Card ID is required'
|
||||
})
|
||||
}
|
||||
|
||||
const body = await readBody(event)
|
||||
const parameters = body?.parameters
|
||||
|
||||
const result = await executeCardQuery(parseInt(id), parameters)
|
||||
return result
|
||||
} catch (error: any) {
|
||||
console.error('[API] Failed to execute Metabase card query:', error)
|
||||
throw createError({
|
||||
statusCode: error.statusCode || 500,
|
||||
statusMessage: error.statusMessage || 'Failed to execute query'
|
||||
})
|
||||
}
|
||||
})
|
||||
18
nuxt4-app/server/api/metabase/cards/index.get.ts
Normal file
18
nuxt4-app/server/api/metabase/cards/index.get.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Get all Metabase cards/questions
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
const query = getQuery(event)
|
||||
const filter = query.f as string | undefined
|
||||
|
||||
const cards = await getMetabaseCards(filter)
|
||||
return cards
|
||||
} catch (error: any) {
|
||||
console.error('[API] Failed to get Metabase cards:', error)
|
||||
throw createError({
|
||||
statusCode: error.statusCode || 500,
|
||||
statusMessage: error.statusMessage || 'Failed to fetch cards'
|
||||
})
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user