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 datos // sensibles internamente. // // Las 9 RPCs v2 (rpc_dashboard_kpis, etc.) se retiraron de este mapa junto // con sus widgets — referencian códigos de pregunta que no existen en v3 // (Etapa 4H, migración de códigos, queda pendiente aparte). Mirada Empresa // usa las rpc_me_* nuevas, ya verificadas contra datos reales. const RPC_MAP: Record = { 'me-prevalencia': 'rpc_me_prevalencia_cuidadores', 'me-riesgo-rotacion': 'rpc_me_riesgo_rotacion', 'me-ausentismo': 'rpc_me_ausentismo', 'me-presentismo': 'rpc_me_presentismo', 'me-punto-ciego': 'rpc_me_punto_ciego', 'me-apoyos': 'rpc_me_apoyos_demandados', 'me-talento-riesgo': 'rpc_me_talento_en_riesgo', 'me-carrera-congelada': 'rpc_me_carrera_congelada', 'me-intensidad-carga': 'rpc_me_intensidad_carga', 'me-segmentacion': 'rpc_me_segmentacion', 'me-disposicion-red': 'rpc_me_disposicion_red', } 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 rpcParams: Record = { p_survey_id: surveyId, p_filters: filtersToRpc(filters), } // Único caso con parámetro extra: el umbral parametrizable de la estrella. if (widget === 'me-talento-riesgo') { const umbral = sp.get('umbral') if (umbral) rpcParams.p_umbral_senales = parseInt(umbral, 10) } const { data, error } = await supabase.rpc(rpcName, rpcParams) if (error) { console.error(`[dashboard/${widget}] RPC error:`, error.message) return NextResponse.json({ error: error.message }, { status: 500 }) } return NextResponse.json(data) }