feat: add Metabase API integration
Add complete integration with Metabase API to fetch data from 'facturador supabase' database. Features: - Server-side Metabase authentication using session tokens - Utility functions for Metabase API requests with auto-retry - API endpoints to proxy Metabase requests - GET /api/metabase/databases - List all databases - GET /api/metabase/tables/:databaseId - Get tables and metadata - POST /api/metabase/query - Execute queries against tables - useMetabase() composable for frontend consumption - getDatabases() - Fetch available databases - getDatabaseMetadata() - Get tables and fields info - queryTable() - Execute queries with filters and limits - resultToObjects() - Helper to convert results to objects Session tokens are cached and auto-refreshed when expired. This enables the application to display real data from the facturador database without using embeds or iframes.
This commit is contained in:
15
nuxt4-app/server/api/metabase/databases.get.ts
Normal file
15
nuxt4-app/server/api/metabase/databases.get.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* Get list of databases from Metabase
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
const databases = await getMetabaseDatabases()
|
||||
return databases
|
||||
} catch (error: any) {
|
||||
console.error('[API] Failed to get Metabase databases:', error)
|
||||
throw createError({
|
||||
statusCode: error.statusCode || 500,
|
||||
statusMessage: error.statusMessage || 'Failed to fetch databases'
|
||||
})
|
||||
}
|
||||
})
|
||||
30
nuxt4-app/server/api/metabase/query.post.ts
Normal file
30
nuxt4-app/server/api/metabase/query.post.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Execute a query against Metabase
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
const body = await readBody(event)
|
||||
|
||||
const { databaseId, tableId, query } = body
|
||||
|
||||
if (!databaseId || !tableId) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Database ID and Table ID are required'
|
||||
})
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await queryMetabaseTable(
|
||||
parseInt(databaseId),
|
||||
parseInt(tableId),
|
||||
query
|
||||
)
|
||||
return result
|
||||
} catch (error: any) {
|
||||
console.error('[API] Failed to execute Metabase query:', error)
|
||||
throw createError({
|
||||
statusCode: error.statusCode || 500,
|
||||
statusMessage: error.statusMessage || 'Failed to execute query'
|
||||
})
|
||||
}
|
||||
})
|
||||
24
nuxt4-app/server/api/metabase/tables/[databaseId].get.ts
Normal file
24
nuxt4-app/server/api/metabase/tables/[databaseId].get.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Get tables from a specific Metabase database
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
const databaseId = getRouterParam(event, 'databaseId')
|
||||
|
||||
if (!databaseId) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Database ID is required'
|
||||
})
|
||||
}
|
||||
|
||||
try {
|
||||
const metadata = await getMetabaseTables(parseInt(databaseId))
|
||||
return metadata
|
||||
} catch (error: any) {
|
||||
console.error(`[API] Failed to get tables for database ${databaseId}:`, error)
|
||||
throw createError({
|
||||
statusCode: error.statusCode || 500,
|
||||
statusMessage: error.statusMessage || 'Failed to fetch tables'
|
||||
})
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user