Con marca y dashboards
This commit is contained in:
59
app/api/dashboard/[widget]/route.ts
Normal file
59
app/api/dashboard/[widget]/route.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
import { NextRequest, NextResponse } from 'next/server'
|
||||
import { createClient } from '@supabase/supabase-js'
|
||||
import { queryToFilters, filtersToRpc } from '@/lib/dashboard-utils'
|
||||
|
||||
// Route Handler server-side: llama a las RPC con el cliente Supabase.
|
||||
// El service_role nunca llega al browser — vive solo en este servidor.
|
||||
// Las RPC son SECURITY DEFINER → aplican k-anonimato y excluyen 3.4/7.1 internamente.
|
||||
|
||||
const RPC_MAP: Record<string, string> = {
|
||||
kpis: 'rpc_dashboard_kpis',
|
||||
prevalencia: 'rpc_prevalencia_por_depto',
|
||||
heatmap: 'rpc_heatmap_intensidad',
|
||||
distribucion: 'rpc_distribucion_cuidado',
|
||||
politicas: 'rpc_politicas_gap',
|
||||
score: 'rpc_score_organizacional',
|
||||
piramide: 'rpc_piramide_demografica',
|
||||
intensidad: 'rpc_intensidad_vs_productividad',
|
||||
riesgo: 'rpc_riesgo_retencion',
|
||||
}
|
||||
|
||||
function getSupabaseServer() {
|
||||
const url = process.env.NEXT_PUBLIC_SUPABASE_URL!
|
||||
// Usar anon key — las RPC son SECURITY DEFINER y aplican sus propias reglas
|
||||
const key = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
|
||||
return createClient(url, key)
|
||||
}
|
||||
|
||||
export async function GET(
|
||||
request: NextRequest,
|
||||
{ params }: { params: Promise<{ widget: string }> }
|
||||
) {
|
||||
const { widget } = await params
|
||||
const rpcName = RPC_MAP[widget]
|
||||
|
||||
if (!rpcName) {
|
||||
return NextResponse.json({ error: 'Widget desconocido' }, { status: 404 })
|
||||
}
|
||||
|
||||
const sp = request.nextUrl.searchParams
|
||||
const surveyId = sp.get('survey_id')
|
||||
if (!surveyId) {
|
||||
return NextResponse.json({ error: 'survey_id requerido' }, { status: 400 })
|
||||
}
|
||||
|
||||
const filters = queryToFilters(sp)
|
||||
const supabase = getSupabaseServer()
|
||||
|
||||
const { data, error } = await supabase.rpc(rpcName, {
|
||||
p_survey_id: surveyId,
|
||||
p_filters: filtersToRpc(filters),
|
||||
})
|
||||
|
||||
if (error) {
|
||||
console.error(`[dashboard/${widget}] RPC error:`, error.message)
|
||||
return NextResponse.json({ error: error.message }, { status: 500 })
|
||||
}
|
||||
|
||||
return NextResponse.json(data)
|
||||
}
|
||||
Reference in New Issue
Block a user